Przejdź do zawartości

Moduł:odmiana-czasownik-japoński

Z Wikisłownika – wolnego słownika wielojęzycznego

Moduł wykorzystywany przez szablon {{odmiana-czasownik-japoński}}.


require('strict')

local p = {}

--[[	Helper functions	]]
local is_str_empty = function (str)
	return str == "" or str == nil
end

local ifexpr = function(cond, on_true, on_false)
	if cond then
		return on_true
	end
	
	return on_false
end

--[[	Error handling	]]
local error_message = {
	["missing_first_parameter"] = "Nie podano czasownika",
	["ambiguous_ending"] = "Nie można automatycznie wywnioskować grupy czasownika. Wymagane jest podanie, do której grupy należy czasownik",
	["godan_group_mismatch"] = "Nieznana końcówka dla grupy spółgłoskowej. Proszę sprawdzić, czy podane parametry są poprawne",
	["ichidan_group_mismatch"] = "Nieznana końcówka dla grupy samogłoskowej. Grupy samogłoskowe oczekują tylko czasowników kończących się na る. Proszę sprawdzić, czy podane parametry są poprawne",
	["missing_suru"] = "Rzeczownik czynnościowy wymaga zakończenia する. Proszę sprawdzić, czy podane parametry są poprawne",
	["missing_kuru"] = "Czasownik brakuje zakończenia 来る lub くる. Proszę sprawdzić, czy podane parametry są poprawne",
}

--[[	Conjugation forms	]]
local forms = {
	["czas-teraźniejszo-przyszły"] = {
		["V"] = "?る",
		["C1"] = "?う",
		["C2"] = "?く",
		["C3"] = "?ぐ",
		["C4"] = "?す",
		["C5"] = "?つ",
		["C6"] = "?ぬ",
		["C7"] = "?ぶ",
		["C8"] = "?む",
		["C9"] = "?る",
		["S"] = "?する",
		["K"] = "?くる"
	},
	["czas-przeszły"] = {
		["V"] = "?た",
		["C1"] = "?った",
		["C2"] = "?いた",
		["C3"] = "?いだ",
		["C4"] = "?した",
		["C5"] = "?った",
		["C6"] = "?んだ",
		["C7"] = "?んだ",
		["C8"] = "?んだ",
		["C9"] = "?った",
		["S"] = "?した",
		["K"] = "?きた"
	},
	["forma-adresatywna"] = {
		["V"] = "?ます",
		["C1"] = "?います",
		["C2"] = "?きます",
		["C3"] = "?ぎます",
		["C4"] = "?します",
		["C5"] = "?ちます",
		["C6"] = "?にます",
		["C7"] = "?びます",
		["C8"] = "?みます",
		["C9"] = "?ります",
		["S"] = "?します",
		["K"] = "?きます"
	},
	["negacja"] = {
		["V"] = "?ない",
		["C1"] = "?わない",
		["C2"] = "?かない",
		["C3"] = "?がない",
		["C4"] = "?さない",
		["C5"] = "?たない",
		["C6"] = "?なない",
		["C7"] = "?ばない",
		["C8"] = "?まない",
		["C9"] = "?らない",
		["S"] = "?しない",
		["K"] = "?こない"
	},
	["forma-wolitywna"] = {
		["V"] = "?たい",
		["C1"] = "?いたい",
		["C2"] = "?きたい",
		["C3"] = "?ぎたい",
		["C4"] = "?したい",
		["C5"] = "?ちたい",
		["C6"] = "?にたい",
		["C7"] = "?びたい",
		["C8"] = "?みたい",
		["C9"] = "?りたい",
		["S"] = "?したい",
		["K"] = "?きたい"
	},
	["forma-imperceptywna"] = {
		["V"] = "?そう",
		["C1"] = "?いそう",
		["C2"] = "?きそう",
		["C3"] = "?ぎそう",
		["C4"] = "?しそう",
		["C5"] = "?ちそう",
		["C6"] = "?にそう",
		["C7"] = "?びそう",
		["C8"] = "?みそう",
		["C9"] = "?りそう",
		["S"] = "?しそう",
		["K"] = "?きそう"
	},
	["forma-niefinitywna-1"] = {
		["V"] = "?",
		["C1"] = "?い",
		["C2"] = "?き",
		["C3"] = "?ぎ",
		["C4"] = "?し",
		["C5"] = "?ち",
		["C6"] = "?に",
		["C7"] = "?び",
		["C8"] = "?み",
		["C9"] = "?り",
		["S"] = "?し",
		["K"] = "?き"
	},
	["forma-niefinitywna-2"] = {
		["V"] = "?て",
		["C1"] = "?って",
		["C2"] = "?いて",
		["C3"] = "?いで",
		["C4"] = "?して",
		["C5"] = "?って",
		["C6"] = "?んで",
		["C7"] = "?んで",
		["C8"] = "?んで",
		["C9"] = "?って",
		["S"] = "?して",
		["K"] = "?きて"
	},
	["forma-niefinitywna-przeczenie-1"] = {
		["V"] = "?ないで",
		["C1"] = "?わないで",
		["C2"] = "?かないで",
		["C3"] = "?がないで",
		["C4"] = "?さないで",
		["C5"] = "?たないで",
		["C6"] = "?なないで",
		["C7"] = "?ばないで",
		["C8"] = "?まないで",
		["C9"] = "?らないで",
		["S"] = "?しないで",
		["K"] = "?こないで"
	},
	["forma-niefinitywna-przeczenie-2"] = {
		["V"] = "?ず(に)",
		["C1"] = "?わず(に)",
		["C2"] = "?かず(に)",
		["C3"] = "?がず(に)",
		["C4"] = "?さず(に)",
		["C5"] = "?たず(に)",
		["C6"] = "?なず(に)",
		["C7"] = "?ばず(に)",
		["C8"] = "?まず(に)",
		["C9"] = "?らず(に)",	
		["S"] = "?せず(に)",
		["K"] = "?こず(に)",
	},
	["forma-gerundialna-1"] = {
		["V"] = "?ながら",
		["C1"] = "?いながら",
		["C2"] = "?きながら",
		["C3"] = "?ぎながら",
		["C4"] = "?しながら",
		["C5"] = "?ちながら",
		["C6"] = "?にながら",
		["C7"] = "?びながら",
		["C8"] = "?みながら",
		["C9"] = "?りながら",
		["S"] = "?しながら",
		["K"] = "?きながら"
	},
	["forma-gerundialna-2"] = {
		["V"] = "?つつ",
		["C1"] = "?いつつ",
		["C2"] = "?きつつ",
		["C3"] = "?ぎつつ",
		["C4"] = "?しつつ",
		["C5"] = "?ちつつ",
		["C6"] = "?につつ",
		["C7"] = "?びつつ",
		["C8"] = "?みつつ",
		["C9"] = "?りつつ",
		["S"] = "?しつつ",
		["K"] = "?きつつ"
	},
	["forma-warunkowa-1"] = {
		["V"] = "?れば",
		["C1"] = "?えば",
		["C2"] = "?けば",
		["C3"] = "?げば",
		["C4"] = "?せば",
		["C5"] = "?てば",
		["C6"] = "?ねば",
		["C7"] = "?べば",
		["C8"] = "?めば",
		["C9"] = "?れば",
		["S"] = "?すれば",
		["K"] = "?くれば"
	},
	["forma-warunkowa-2"] = {
		["V"] = "?たら(ば)",
		["C1"] = "?ったら(ば)",
		["C2"] = "?いたら(ば)",
		["C3"] = "?いだら(ば)",
		["C4"] = "?したら(ば)",
		["C5"] = "?ったら(ば)",
		["C6"] = "?んだら(ば)",
		["C7"] = "?んだら(ば)",
		["C8"] = "?んだら(ば)",
		["C9"] = "?ったら(ば)",
		["S"] = "?したら(ば)",
		["K"] = "?きたら(ば)"
	},
	["forma-strony-sprawczej"] = {
		["V"] = "?させる",
		["C1"] = "?わせる",
		["C2"] = "?かせる",
		["C3"] = "?がせる",
		["C4"] = "?させる",
		["C5"] = "?たせる",
		["C6"] = "?なせる",
		["C7"] = "?ばせる",
		["C8"] = "?ませる",
		["C9"] = "?らせる",
		["S"] = "?させる",
		["K"] = "?こさせる",
	},
	["potoczna-forma-strony-sprawczej"] = {
		["V"] = "?さす",
		["C1"] = "?わす",
		["C2"] = "?かす",
		["C3"] = "?がす",
		["C4"] = "?さす",
		["C5"] = "?たす",
		["C6"] = "?なす",
		["C7"] = "?ばす",
		["C8"] = "?ます",
		["C9"] = "?らす",
		["S"] = "?さす",
		["K"] = "?こさす",
	},
	["forma-strony-biernej"] = {
		["V"] = "?られる",
		["C1"] = "?われる",
		["C2"] = "?かれる",
		["C3"] = "?がれる",
		["C4"] = "?される",
		["C5"] = "?たれる",
		["C6"] = "?なれる",
		["C7"] = "?ばれる",
		["C8"] = "?まれる",
		["C9"] = "?られる",
		["S"] = "?される",
		["K"] = "?こられる",
	},
	["forma-strony-sprawczo-biernej"] = {
		["V"] = "?させられる",
		["C1"] = "?わされる<br>?わせられる",
		["C2"] = "?かされる<br>?かせられる",
		["C3"] = "?がされる<br>?わせられる",
		["C4"] = "?させられる",
		["C5"] = "?たされる<br>?たせられる",
		["C6"] = "?なされる<br>?なせられる",
		["C7"] = "?ばされる<br>?ばせられる",
		["C8"] = "?まされる<br>?ませられる",
		["C9"] = "?らされる<br>?らせられる",
		["S"] = "?させられる",
		["K"] = "?こさせられる"
	},
	["forma-wywyższająca"] = {
		["V"] = "?られる",
		["C1"] = "?われる",
		["C2"] = "?かれる",
		["C3"] = "?がれる",
		["C4"] = "?される",
		["C5"] = "?たれる",
		["C6"] = "?なれる",
		["C7"] = "?ばれる",
		["C8"] = "?まれる",
		["C9"] = "?られる",
		["S"] = "?される",
		["K"] = "?こられる",
	},
	["forma-potencjalna"] = {
		["V"] = "?られる",
		["C1"] = "?える",
		["C2"] = "?ける",
		["C3"] = "?げる",
		["C4"] = "?せる",
		["C5"] = "?てる",
		["C6"] = "?ねる",
		["C7"] = "?べる",
		["C8"] = "?める",
		["C9"] = "?れる",
		["S"] = "?[[できる]]",
		["K"] = "?こられる"
	},
	["potoczna-forma-potencjalna"] = {
		["V"] = "?れる",
		["C1"] = "",
		["C2"] = "",
		["C3"] = "",
		["C4"] = "",
		["C5"] = "",
		["C6"] = "",
		["C7"] = "",
		["C8"] = "",
		["C9"] = "",
		["S"] = "",
		["K"] = ""
	},
	["forma-hortatywna"] = {
		["V"] = "?よう",
		["C1"] = "?おう",
		["C2"] = "?こう",
		["C3"] = "?ごう",
		["C4"] = "?そう",
		["C5"] = "?とう",
		["C6"] = "?のう",
		["C7"] = "?ぼう",
		["C8"] = "?もう",
		["C9"] = "?ろう",
		["S"] = "?しよう",
		["K"] = "?こよう"
	},
	["forma-przypuszczająca"] = {
		["V"] = "?よう",
		["C1"] = "?おう",
		["C2"] = "?こう",
		["C3"] = "?ごう",
		["C4"] = "?そう",
		["C5"] = "?とう",
		["C6"] = "?のう",
		["C7"] = "?ぼう",
		["C8"] = "?もう",
		["C9"] = "?ろう",
		["S"] = "?しよう",
		["K"] = "?こよう"
	},
	["forma-przypuszczająca-czasu-przeszłego"] = {
		["V"] = "?たろう",
		["C1"] = "?ったろう",
		["C2"] = "?いたろう",
		["C3"] = "?いだろう",
		["C4"] = "?したろう",
		["C5"] = "?ったろう",
		["C6"] = "?んだろう",
		["C7"] = "?んだろう",
		["C8"] = "?んだろう",
		["C9"] = "?ったろう",
		["S"] = "?したろう",
		["K"] = "?きたろう",
	},
	["forma-negatywno-przypuszczająca"] = {
		["V"] = "?るまい",
		["C1"] = "?うまい",
		["C2"] = "?くまい",
		["C3"] = "?ぐまい",
		["C4"] = "?すまい",
		["C5"] = "?つまい",
		["C6"] = "?ぬまい",
		["C7"] = "?ぶまい",
		["C8"] = "?むまい",
		["C9"] = "?るまい",
		["S"] = "?するまい<br>?すまい",
		["K"] = "?くるまい<br>?こまい",
	},
	["rzadsza-forma-negatywno-przypuszczająca"] = {
		["V"] = "?まい",
		["C1"] = "",
		["C2"] = "",
		["C3"] = "",
		["C4"] = "",
		["C5"] = "",
		["C6"] = "",
		["C7"] = "",
		["C8"] = "",
		["C9"] = "",
		["S"] = "",
		["K"] = ""
	},
	["forma-rozkazująca-1"] = {
		["V"] = "?ろ",
		["C1"] = "?え",
		["C2"] = "?け",
		["C3"] = "?げ",
		["C4"] = "?せ",
		["C5"] = "?て",
		["C6"] = "?ね",
		["C7"] = "?べ",
		["C8"] = "?め",
		["C9"] = "?れ",
		["S"] = "?しろ",
		["K"] = "?こい"
	},
	["pisana-forma-rozkazująca-1"] = {
		["V"] = "?よ",
		["C1"] = "",
		["C2"] = "",
		["C3"] = "",
		["C4"] = "",
		["C5"] = "",
		["C6"] = "",
		["C7"] = "",
		["C8"] = "",
		["C9"] = "",
		["S"] = "?せよ",
		["K"] = ""
	},
	["forma-rozkazująca-2"] = {
		["V"] = "?なさい",
		["C1"] = "?いなさい",
		["C2"] = "?きなさい",
		["C3"] = "?ぎなさい",
		["C4"] = "?しなさい",
		["C5"] = "?ちなさい",
		["C6"] = "?になさい",
		["C7"] = "?びなさい",
		["C8"] = "?みなさい",
		["C9"] = "?りなさい",
		["S"] = "?しなさい",
		["K"] = "?きなさい"
	},
	["forma-prohibitywna"] = {
		["V"] = "?るな",
		["C1"] = "?うな",
		["C2"] = "?くな",
		["C3"] = "?ぐな",
		["C4"] = "?すな",
		["C5"] = "?つな",
		["C6"] = "?ぬな",
		["C7"] = "?ぶな",
		["C8"] = "?むな",
		["C9"] = "?るな",
		["S"] = "?するな",
		["K"] = "?くるな"
	},
	["forma-egzemplifikatywna"] = {
		["V"] = "?たり",
		["C1"] = "?ったり",
		["C2"] = "?いたり",
		["C3"] = "?いだり",
		["C4"] = "?したり",
		["C5"] = "?ったり",
		["C6"] = "?んだり",
		["C7"] = "?んだり",
		["C8"] = "?んだり",
		["C9"] = "?ったり",
		["S"] = "?したり",
		["K"] = "?きたり"
	},
}

local convert_name_to_group = function(group)
	local to_single_letter = {
		["samogłoskowy"] = "V",
		["spółgłoskowy"] = "C",
		["suru"] = "S",
		["odrzeczownikowy"] = "S",
		["kuru"] = "K",
		["nieregularny"] = "X",
	}
	
	return to_single_letter[group]
end

local find_group_based_on_verb = function(verb)
	local possible_endings = {
		["でくる"] = "K",
		["で来る"] = "K",
		["てくる"] = "K",
		["て来る"] = "K",
		["出来る"] = "V",
		["くる"] = "K",
		["来る"] = "K",
		["する"] = "S",
		["う"] = "C",
		["く"] = "C",
		["ぐ"] = "C",
		["す"] = "C",
		["つ"] = "C",
		["ぬ"] = "C",
		["ぶ"] = "C",
		["む"] = "C",
	}
	
	for i=4,1,-1 do
		local ending = mw.ustring.sub(verb, -i)
		
		if possible_endings[ending] ~= nil then
			return possible_endings[ending]	
		end
	end
	
	return nil
end

local detect_verb_group = function(verb, group)
	if is_str_empty(group) then
		return find_group_based_on_verb(verb)
	elseif #group > 1 then
		return convert_name_to_group(group)
	else
		return group
	end
end

local get_stem_and_group = function(verb, group)
	local stem = ""
	local group = detect_verb_group(verb, group)
	local err = nil

	local godan_groups = {
		["う"] = "C1",
		["く"] = "C2",
		["ぐ"] = "C3",
		["す"] = "C4",
		["つ"] = "C5",
		["ぬ"] = "C6",
		["ぶ"] = "C7",
		["む"] = "C8",
		["る"] = "C9"
	}
	
	local get_stem = {
		["V"] = function(verb)
			stem = mw.ustring.sub(verb, 1, mw.ustring.len(verb) - 1)
			if mw.ustring.sub(verb, -1) ~= "る" then
				err = "ichidan_group_mismatch"
			end
		end,
		["C"] = function(verb)
			local ending = mw.ustring.sub(verb, -1)
			
			stem = mw.ustring.sub(verb, 1, mw.ustring.len(verb) - 1)
			group = godan_groups[ending]
			if group == nil then
				err = "godan_group_mismatch"
			end
		end,
		["K"] = function(verb)
			local ending = mw.ustring.sub(verb, -2)

			stem = mw.ustring.sub(verb, 1, mw.ustring.len(verb) - 2)
			if ending ~= "来る" and ending ~="くる" then
				err = "missing_kuru"
			end
		end,
		["S"] = function(verb)
			local ending = mw.ustring.sub(verb, -2)
			
			stem = mw.ustring.sub(verb, 1, mw.ustring.len(verb) - 2)
			if ending ~= "する" then
				err = "missing_suru"
			end
		end
	}
	
	if group == nil then
		err = "ambiguous_ending"
	else
		get_stem[group](verb)
	end
	
	return stem, group, err
end

local get_form_names = function()
	local lst = {}
	
	for k, _ in pairs(forms) do
		table.insert(lst, k)	
	end
	
	return lst
end

local get_group_name = function(group)
	local group_name = {
		["V"] = "czasownik z grupy samogłoskowej",
		["C1"] = "czasownik z grupy spółgłoskowej, zakończony na う",
		["C2"] = "czasownik z grupy spółgłoskowej, zakończony na く",
		["C3"] = "czasownik z grupy spółgłoskowej, zakończony na ぐ",
		["C4"] = "czasownik z grupy spółgłoskowej, zakończony na す",
		["C5"] = "czasownik z grupy spółgłoskowej, zakończony na つ",
		["C6"] = "czasownik z grupy spółgłoskowej, zakończony na ぬ",
		["C7"] = "czasownik z grupy spółgłoskowej, zakończony na ぶ",
		["C8"] = "czasownik z grupy spółgłoskowej, zakończony na む",
		["C9"] = "czasownik z grupy spółgłoskowej, zakończony na る",
		["X"] = "czasownik nieregularny",
		["S"] = "czasownik nieregularny",
		["K"] = "czasownik nieregularny",
		["NS"] = "czasownik odrzeczownikowy",
	}
	
	return group_name[group]
end

local get_frame_args = function(frame, args_to_fetch, arglist)
	local ret = arglist or {}
	local args = frame.args
	
	for _, n in pairs(args_to_fetch) do
		ret[n] = args[n]
	end

	return ret 
end

--[[
	Main function
]]
p.main = function(frame)
	local args = frame.args
	local template = {}
	local template_name = "Szablon:odmiana-czasownik-japoński/tabela" 
	local stem, group, err = get_stem_and_group(args[1], args[2])
	
	if err ~= nil then
		error(error_message[err])
	end
	
	template = get_frame_args(frame, get_form_names(), template)
	
	for name, _ in pairs(template) do
		if not is_str_empty(template[name]) or group == 'X' then
			if template[name] == '-' then
				template[name] = ""	
			end
		else
			template[name] = string.gsub(forms[name][group], "?", stem)
		end
	end
	
	template["grupa"] = get_group_name(ifexpr(group == "S" and stem ~= "", "NS", group))
	
	return frame:expandTemplate{title = template_name, args = template}
end

return p