Mòdul:gl-lema

De Viccionari
Salta a la navegació Salta a la cerca
Icona de documentació de mòdul Documentació del mòdul[mostra] [modifica] [refresca]

A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]


Mòdul de suport per les plantilles de lema en gallec, com {{gl-nom}}.

Genera les formes en plural a partir d'unes regles vàlides en la majoria de casos.

local export = {}
local pos_functions = {}

-- Funció d'entrada per mostrar el lema flexionat, l'única que s'invoca des d'una plantilla
function export.flex(frame)
	local args = frame:getParent().args
	pagename = args.pagename
	if not pagename or pagename == "" then
		pagename = mw.title.getCurrentTitle().subpageText
	end
	
	local data = {lang = "gl", sc = "Latn", heads = {}, genders = {}, inflections = {}, categories = {}}
	local lema = args.lema; if lema == "" then lema = nil end
	table.insert(data.heads, lema)
	local isLemma = frame.args['forma'] == nil and true or nil

	local poscat = frame.args[1] or error("Falta especificar la categoria lèxica com a primer paràmetre.")
	if pos_functions[poscat] then
		pos_functions[poscat].func(args, data, isLemma)
	else
		table.insert(data.categories, poscat .. " en gallec")
	end
	if args.cat and args.cat ~= "" then
		table.insert(data.categories, args.cat)
	end
	
	if args.bot then
		return require("Mòdul:lema").make_bot_list(data.inflections)
	else
		return require("Mòdul:lema").full_headword(data)
	end
end

-- Informació de flexió per a substantius
pos_functions["Substantius"] = {func = function(args, data, isLemma)
	
	-- Codis gènere-nombre:
	--	"m", "f", "mf"
	--	"m-p", "f-p", "mf-p" pluralia tantum
	--	"m-s", "f-s", "mf-s" només o normalment en singular
	--	"m-i", "f-i", "mf-i" invariable en nombre
	--	"m-?", "f-?", "mf-?" sense plural conegut
	--	"mp", "fp", "mfp"    flexionats en plural

	local genere = args[1] or ""
	local genere2 = args[g2]
	local plural = args[2] or args.p
	local plural2 = args.p2
	local fem = args["f"]; if fem == "" then fem = nil end
	
	local tipus = nil
	local gn = mw.text.split(genere, "-")
	if #gn > 1 then
		genere = gn[1]
		tipus = gn[2]
	end
	if genere == "" then
		table.insert(data.genders, "?")
	else
		local generes = mw.text.split(genere, "")
		table.insert(data.genders, table.concat(generes, "-")) -- conversió a "m", "f", "m-f", "m-p", "f-p", "m-f-p"
	end
	if genere2 then
		table.insert(data.genders, genere2)
	end
	
	-- Categoria gramatical
	if mw.ustring.find(pagename, "[^ ]+ [^ ]+") then
		if genere:find("p$") then
			table.insert(data.categories, "Formes de locucions nominals en gallec")
		else
			table.insert(data.categories, "Locucions nominals en gallec")
		end
	elseif isLemma == nil then
		table.insert(data.categories, "Formes de substantius en gallec")
	else
		table.insert(data.categories, "Substantius en gallec")
	end
	
	-- Plural
	if not (tipus == "?" or genere:find("p$")) then
		if tipus == "i" then
			table.insert(data.inflections, {label = "plural invariable"})
		elseif tipus == "p" then
			table.insert(data.inflections, {label = "plurale tantum"})
		elseif tipus == "s" then
			if plural then
				table.insert(data.inflections, {label = "normalment en singular"})
			else
				table.insert(data.inflections, {label = "només en singular"})
			end
		end
		if plural ~= nil or tipus == nil then
			if plural == "" or plural == nil then
				plural = forma_plural(pagename)
			end
			if plural then
				local infl_parts = {label = "plural", accel = "plural-form-of gender-" .. genere}
				table.insert(infl_parts, plural)
				if plural2 ~= "" then
					table.insert(infl_parts, plural2)
				end
				table.insert(data.inflections, infl_parts)
				if not mw.title.new(plural).exists or (plural2 and plural2 ~= "" and not mw.title.new(plural2).exists) then
					table.insert(data.categories, "Termes en gallec amb flexions a crear")
				end
			end
		end
	end
	
	-- Femení
	if fem then
		table.insert(data.inflections, {label = "femení", fem, accel = "femenina-form-of gender-f"})
		if not mw.title.new(fem).exists then
			table.insert(data.categories, "Termes en gallec amb flexions a crear")
		end
	end
end
}


-- Forma plural, [[:en:Module:gl-plural]]
function forma_plural(lemma)
	local accented_letters = {'á', 'é', 'í', 'ó', 'ú'}
	local remove_accent = {['á']='a', ['é']='e', ['í']='i', ['ó']='o', ['ú']='u'}
	local vowels = {'a', 'e', 'i', 'o', 'u', 'á', 'é', 'í', 'ó', 'ú'}
	
	-- local functions
	local function suffix(word, length)
		return mw.ustring.sub(word, mw.ustring.len(word) - length + 1)
	end
	local function prefix(word, suf_length)
		return mw.ustring.sub(word, 1, mw.ustring.len(word) - suf_length)
	end
	local function word_has_letter(word, array)
		for c = 1, #array do
			if (mw.ustring.find(word, array[c])) then
				return true
			end
		end
		return false
	end
	local function is_accented(word)
		return word_has_letter(word, accented_letters)
	end
	local function is_vowel(letter)
		return word_has_letter(letter, vowels)
	end
	local function has_space_or_hyphen(word)
		return mw.ustring.find(word, "[ -]")
	end
	local function has_multiple_vowels(word)
		local vowels = 0
		for c = 1, mw.ustring.len(word) do
			if (is_vowel(mw.ustring.sub(word, c, c))) then
				vowels = vowels + 1
				if (vowels >= 2) then return true end
			end
		end
		return false
	end
	
	if (has_space_or_hyphen(lemma)) then return nil end
	
	local suf3 = suffix(lemma, 3)
	if (suf3 == "bel") then
		return prefix(lemma, 3) .. "beis"
	end
	local suf2 = suffix(lemma, 2)
	local pre2 = prefix(lemma, 2)
	local suf1 = suffix(lemma, 1)
	local pre1 = prefix(lemma, 1)
	
	if suf1 == "l" then
		if (has_multiple_vowels(lemma) and not is_accented(pre2)) then
			if (suf2 == "il") then
				return pre2 .. "is"
			else
				return pre1 .. "is"
			end
		else
			return lemma .. "es"
		end
	elseif suf1 == "z" then
		return pre1 .. "ces"
	elseif suf1 == "r" then
		return lemma .. "es"
	elseif suf1 == "x" then
		return lemma
	elseif is_vowel(suf1) or suf1 == "n" then
		return lemma .. "s"
	elseif suf1 == "s" then
		local penult = mw.ustring.sub(suf2, 1, 1)
		if not is_vowel(penult) then return lemma end
		
		local antepenult = mw.ustring.sub(suf3, 1, 1)
		if is_vowel(antepenult) then return lemma .. "es" end
		
		if (is_accented(penult)) then
			return pre2 .. remove_accent[penult] .. "ses"
		else
			return lemma
		end
	end
	
	return nil
end

return export