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 portugupès, com {{pt-nom}}.

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

local p = {}

local lang = {code = "pt", name = "portuguès", sc = "Latn"}
local pos_functions = {}

-- Funció d'entrada per mostrar el lema flexionat, l'única que s'invoca des d'una plantilla
function p.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 = lang, 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 " .. lang.name)
	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", "mof"
	--	"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, "")
		local str_gender, sep = '', ''
		for _, g in ipairs(generes) do
			if g ~= "-" and g ~= "o" then
				str_gender = str_gender .. sep
				sep = '-'
			else
				sep = ''
			end
			str_gender = str_gender .. g
		end
		table.insert(data.genders, str_gender)
	end
	
	-- Categoria gramatical
	if mw.ustring.find(pagename, "[^ ]+ [^ ]+") then
		if genere:find("p$") then
			table.insert(data.categories, "Formes de locucions nominals en " .. lang.name)
		else
			table.insert(data.categories, "Locucions nominals en " .. lang.name)
		end
	elseif isLemma == nil then
		table.insert(data.categories, "Formes de substantius en " .. lang.name)
	else
		table.insert(data.categories, "Substantius en " .. lang.name)
	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 portuguès 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 portuguès amb flexions a crear")
		end
	end
end
}


-- Forma plural, [[:en:Module:pt-plural]]
function forma_plural(lemma)
	local accented_letters = {'á', 'é', 'í', 'ó', 'ú', 'â', 'ê', 'ô'}
	local remove_accent = {['á']='a', ['é']='e', ['í']='i', ['ó']='o', ['ú']='u', ['â']='a', ['ê']='e', ['ô']='o'}
	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)
	local pre3 = prefix(lemma, 3)
	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 not is_accented(pre2) then
			if suf2 == "il" then
				return pre2 .. "is"
			elseif suf2 == "el" then
				return pre2 .. "éis"
			elseif suf2 == "ol" then
				return pre2 .. "óis"
			end
		end
		return pre1 .. "is"
	elseif suf1 == "m" then
		return pre1 .. "ns"
	elseif suf1 == "r" then
		return lemma .. "es"
	elseif suf1 == "x" then
		return lemma
	elseif suf1 == "z" then
		return pre1 .. "ces"
	elseif is_vowel(suf1) or suf1 == "n" then
		if suf3 == "ção" or suf3 == "são" then
			return pre2 .. "ões"
		elseif suf2 == "ão" then
			return nil
		end
		return lemma .. "s"
	elseif suf1 == "s" then
		local penult = mw.ustring.sub(suf2, 1, 1)
		if not is_vowel(penult) then
			return lemma
		elseif is_accented(penult) then
			return pre2 .. remove_accent[penult] .. "ses"
		else
			local antepenult = mw.ustring.sub(suf3, 1, 1)
			if is_vowel(antepenult) then
				return lemma .. "es"
			else
				return lemma
			end
		end
	end
	
	return nil
end

return p