Modul:inflection/ru/noun/result

A modult a Modul:inflection/ru/noun/result/doc lapon tudod dokumentálni

local dev_prefix = ''
-- dev_prefix = 'User:Vitalik/'  -- comment this on active version

local export = {}
local _ = require('Module:' .. dev_prefix .. 'inflection/tools')


local syllables = require("Module:слоги")

-- Использование дефисов вместо подчёркивания
local function replace_underscore_with_hyphen(forms)
	_.log_func('result', 'replace_underscore_with_hyphen')

	local keys, old_key

	keys = {
		'nom-sg',  'gen-sg',  'dat-sg',  'acc-sg',  'ins-sg',  'prp-sg',
		'nom-pl',  'gen-pl',  'dat-pl',  'acc-pl',  'ins-pl',  'prp-pl',
--		'nom-sg2', 'gen-sg2', 'dat-sg2', 'acc-sg2', 'ins-sg2', 'prp-sg2',
--		'nom-pl2', 'gen-pl2', 'dat-pl2', 'acc-pl2', 'ins-pl2', 'prp-pl2',
		'voc-sg',  'loc-sg',  'prt-sg',
		'ins-sg2',  -- temp?
	}  -- list
	for i, new_key in pairs(keys) do  -- list
		old_key = mw.ustring.gsub(new_key, '-', '_')
		if _.has_key(forms[old_key]) then
			forms[new_key] = forms[old_key]
		end
	end
end


-- Формирование параметров рода и одушевлённости для подстановки в шаблон
local function forward_gender_animacy(forms, data)
	_.log_func('result', 'forward_gender_animacy')

	local genders, animacies

	-- Род:
	genders = {m='муж', f='жен', n='ср', mf='мж', mn='мс', fm='жм', fn='жс', nm='см', nf='сж' }  -- dict
	if data.common_gender then
		forms['род'] = 'общ'
	elseif data.output_gender then
		forms['род'] = genders[data.output_gender]
	elseif data.gender then
		forms['род'] = genders[data.gender]
	else
		-- pass
	end

	-- Одушевлённость:
	animacies = {}  -- dict
	animacies['in'] = 'неодуш'
	animacies['an'] = 'одуш'
	animacies['in//an'] = 'неодуш-одуш'
	animacies['an//in'] = 'одуш-неодуш'
	if data.output_animacy then
		forms['кат'] = animacies[data.output_animacy]
	else
		forms['кат'] = animacies[data.animacy]
	end
end


local function forward_args(forms, data)
	_.log_func('result', 'forward_args')

	local keys, args

	args = data.args
	keys = {
		'nom-sg',  'gen-sg',  'dat-sg',  'acc-sg',  'ins-sg',  'prp-sg',
		'nom-sg2', 'gen-sg2', 'dat-sg2', 'acc-sg2', 'ins-sg2', 'prp-sg2',
		'nom-pl',  'gen-pl',  'dat-pl',  'acc-pl',  'ins-pl',  'prp-pl',
		'nom-pl2', 'gen-pl2', 'dat-pl2', 'acc-pl2', 'ins-pl2', 'prp-pl2',
		'voc-sg',  'loc-sg',  'prt-sg',
	}  -- list
	for i, key in pairs(keys) do  -- list
		if _.has_value(args[key]) then
			if args[key] == '-' then
				forms[key] = args[key]
			else
				forms[key] = args[key] .. '<sup>△</sup>'
			end
		end
	end

	keys = {
		'П', 'Пр', 'Сч',
		'hide-text', 'зачин', 'слоги', 'дореф',
		'скл', 'зализняк', 'зализняк1', 'чередование',
		'pt', 'st', 'затрудн', 'клитика',
		'коммент',
	}  -- list
	for i, key in pairs(keys) do  -- list
		if _.has_value(args[key]) then
			forms[key] = args[key]
		end
	end

	if _.has_key(forms['слоги']) then
		if not _.contains(forms['слоги'], '%<') then
			forms['слоги'] = syllables.get_syllables(forms['слоги'])
		end
	else
		forms['слоги'] = data.word
	end
end


local function additional_arguments(forms, data)
	_.log_func('result', 'additional_arguments')

	-- RU (склонение)
	if _.contains(data.rest_index, '0') then
		forms['скл'] = 'не'
	elseif data.adj then
		forms['скл'] = 'а'
	elseif data.pronoun then
		forms['скл'] = 'мс'
	elseif _.endswith(data.word, '[ая]') then
		forms['скл'] = '1'
	else
		if data.gender == 'm' or data.gender == 'n' then
			forms['скл'] = '2'
		else
			forms['скл'] = '3'
		end
	end

	-- RU (чередование)
	if _.contains(data.index, '%*') then
		forms['чередование'] = '1'
	end

	if data.pt then
		forms['pt'] = '1'
	end

	-- RU ("-" в индексе)
	-- TODO: Здесь может быть глюк, если случай глобального `//` и `rest_index` пуст (а исходный `index` не подходит, т.к. там может быть не тот дефис -- в роде)
	if data.rest_index then
		if _.contains(data.rest_index, {'%-', '—', '−'}) then
			forms['st'] = '1'
			forms['затрудн'] = '1'
		end
	else
		-- pass  -- TODO
	end
end


--------------------------------------------------------------------------------


function export.finalize(data, forms)
	_.log_func('result', 'finalize')

	forms['stem_type'] = data.stem_type  -- for testcases
	forms['stress_type'] = data.stress_type  -- for categories   -- is really used?
	forms['dev'] = dev_prefix

	additional_arguments(forms, data)
	replace_underscore_with_hyphen(forms)

	forward_gender_animacy(forms, data)
	forward_args(forms, data)

	if not _.has_key(forms['зализняк']) then
		forms['зализняк'] = '??'
	end

	if not _.has_key(forms['error_category']) and data.word_cleared ~= data.base then
		forms['error_category'] = 'Ошибка в шаблоне "сущ-ru" (слово не совпадает с заголовком статьи)'
	end

	return forms
end


return export