Modul:Declension

Iz Wikipedije, proste enciklopedije
local p = {}

p.langlist = {
	ar = {
		adjective = {
			singular = {{'', 'ة'}},
			default = {{''}}
		},
	},
	de = {
		adjective = {
			singular = {
				n = {'er', 'e', 'es'},
				d = {'em', 'er', 'em'},
			},
			plural = {
				n = {'e'},
				d = {'en'},
			},
			default = {{'es'}}
		},
	},
	es = {
		adjective = {
			singular = {{'o', 'a'}},
			plural = {{'os', 'as'}}
		},
	},
	fr = {
		adjective = {
			singular = {{'', 'e'}},
			plural = {{'s', 'es'}}
		},
	},
	gl = {
		adjective = {
			singular = {{'o', 'a'}},
			plural = {{'os', 'as'}}
		},
	},
	it = {
		adjective = {
			singular = {{'o', 'a'}},
			plural = {{'i', 'e'}}
		},
	},
	nds = {
		adjective = {
			-- endings seem to be definite, but should probably be indefinite?
			singular={
				n = {'en', 'e', 'e'},
				d = {'en', 'e', 'en'},
			},
			plural={
				n = {'en'},
				d = {'en'},
			},
			default = {{'en'}}
		}
	},
	pl = { -- Polish
		adjective = {                  -- Declension of regular adjectives / Deklinacja Przymiotnikow regularnych
			singular = {               -- Number: singular  / Liczba pojedyncza
				n = {'y', 'a', 'e'},   -- nominative: masculine, feminine, neuter / mianownik  , rodzaj: męski, żenski, nijaki (np. zielonY chlopiec, zielonA dziewczynka, zielonE dziecko)
				l = {'ym', 'ej', 'ym'} -- locative  : masculine, feminine, neuter / miejscownik, rodzaj: męski, żenski, nijaki (np. na zielonYM chlopiecu, na zielonEJ dziewczynce, na zielonym dziecku)
				},
			plural = {                 -- Number: plural  / Liczba mnoga
				n = {'i', 'e', 'e'},   -- nominative: masculine, feminine, neuter / mianownik  , rodzaj: męski, żenski, nijaki (np. zielonI chlopiecy, zielonE dziewczynki, zielonE dzieci)
				l = {'ych'}            -- locative  : masculine, feminine, neuter / miejscownik, rodzaj: męski, żenski, nijaki (np. na zielonI chlopiecy, na zielonYCH dziewczynkach, na zielonYCH dzieciach)
			}
		},
	},
	pt = {
		adjective = {
			singular = {{'o', 'a'}},
			plural={{'os', 'as'}}
		}
	},
	ro = {
		adjective = {
			singular = {{'t', 'tă', 't'}},
			plural = {{'ți', 'te', 'te'}}
		},
	},
	ru = {
		adjective = {
			singular = {
				{'ый', 'ая', 'ое'},
				d = {'ому', 'ой', 'ому'},
				p = {'ом', 'ой', 'ом'},
				a = {'ый', 'ую', 'ое'},
			},
			plural = {
				{'ые'},
				d={'ым'},
				p={'ых'},
				a={'ые'},
			},
			default = {{'.'}}
		},
	},
	scn = {
		adjective = {
			singular = {{'u', 'a'}},
			plural = {{'i'}}
		},
	},
	sl = { -- Slovene
		adjective = {                  -- Declension of regular adjectives / sklanjanje običajnih pridevnikov (I. sklanjatev)
			singular = {               -- Number: singular  / Število: ednina (zgled: pogum- )
				i = {'en', 'na', 'no'},   -- nominative: masculine, feminine, neuter / imenovalnik:, spol: moški, żenski, srednji (npr. pogumen deček, pogumna deklica, pogumno bitje)
				r = {'nega', 'ne', 'nega'},   -- genitive: masculine, feminine, neuter / rodilnik:, spol: moški, żenski, srednji (npr. pogumnega dečka, pogumne deklice, pogumnega bitja)
				d = {'nemu', 'ni', 'nemu'},   -- dative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnemu dečku, pogumni deklici, pogumnemu bitju)
				t = {'nega', 'no', 'no'}, -- accusative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnega dečka, pogumno deklico, pogumno bitje)
				m = {'nem', 'ni', 'nem'}, -- locative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnem dečku, pogumni deklici, pogumnem bitju)
				o = {'nim', 'no', 'nim'} -- instrumental: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnim dečkom, pogumno deklico, pogumnim bitjem)
				},
			plural = {                 -- Number: plural  / Število: množina (zgled: pogum- )
				i = {'ni', 'ne', 'na'},   -- nominative: masculine, feminine, neuter / imenovalnik:, spol: moški, żenski, srednji (npr. pogumni dečki, pogumne deklice, pogumna bitja)
				r = {'nih', 'nih', 'nih'},   -- genitive: masculine, feminine, neuter / rodilnik:, spol: moški, żenski, srednji (npr. pogumnih dečkov, pogumnih deklicih, pogumnih bitij)
				d = {'nim', 'nim', 'nim'},   -- dative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnim dečkom, pogumnim deklicam, pogumnim bitjem)
				t = {'ne', 'ne', 'na'}, -- accusative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumne dečke, pogumne deklice, pogumna bitja)
				m = {'nih', 'nih', 'nih'}, -- locative: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnih dečkih, pogumnih deklicah, pogumnih bitjih)
				o = {'nimi', 'nimi', 'nimi'} -- instrumental: masculine, feminine, neuter / dajalnik:, spol: moški, żenski, srednji (npr. pogumnimi dečki, pogumnimi deklicami, pogumnimi bitji)
			}
		},
	},
}

function p.selectAdjectiveForm(form, grammar)
	-- form is a table
	form.singular = form.singular or form.s
	form.plural = form.plural or form.p
	form.s = form.singular
	form.p = form.plural
	if grammar.gender and not grammar.number then
		-- where grammatical info is known, but number not set explicitly
		-- set it to singular
		grammar.number = 's'
	end
	local defaultfeatures = {number='s', case='n'}
	for _,feature in ipairs({'number', 'case', 'gender'}) do
		form = form[grammar[feature]] or form.default or form[1] or form[defaultfeatures[feature]]
	end
	-- form is a string
	return form
end

function p.makeregular(lang, word, wordtype, number, gender, case)
	if wordtype == 'adj' then
		wordtype = 'adjective'
	end
	if number == 'p' then
		number = 'plural'
	end
	if number == 'sing' or number == 's' or not number then
		number = 'singular'
	end
	if not case then
		case = 'n'
	end
	
	-- clip endings 
	if lang == 'pl' then 
		if wordtype == 'adjective' then -- clip "y" at the end
			if mw.ustring.sub(word, mw.ustring.len(word), mw.ustring.len(word)) == 'y' -- use string libraries ?
				then word = mw.ustring.sub(word, 1, mw.ustring.len(word)-1)
			end
		end
	end
	word = word .. p.selectAdjectiveForm(p.langlist[lang][wordtype], {number=number, case=case, gender=gender})
	return word
end

return p