Vés al contingut

Mòdul:roa-oca-entrada

De Viccionari
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]


Aquest mòdul presenta un lema en català antic amb la flexió i les categories corresponents ordenades. Actualment dóna suport a les plantilles {{roa-oca-nom}}. Vegeu la documentació de les plantilles per a la seva utilització.

El mòdul es basa en Mòdul:lema pel format general d'un lema. S'invoca amb una única funció flex amb l'argument apropiat. Exemple: {{#invoke:roa-oca-lema|flex|Substantius}}

Genera les formes en plural a partir d'unes regles vàlides en la majoria de casos. Genera també les etiquetes necessàries per a l'edició accelerada de formes flexionades.

local p = {}

local lang = {code = "roa-oca", name = "català antic", 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"
	--	"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 plural = {args.p, args.p2, args.p3, args.p4}
	local fem = args["f"]
	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
	
	-- Categoria gramatical
	if mw.ustring.find(pagename, "[^ ]+ [^ ]+") then
		if isLemma then
			table.insert(data.categories, "Locucions nominals en " .. lang.name)
		else
			table.insert(data.categories, "Formes de locucions nominals en " .. lang.name)
		end
	elseif isLemma then
		table.insert(data.categories, "Substantius en " .. lang.name)
	else
		table.insert(data.categories, "Formes de substantius en " .. lang.name)
	end
	
	-- Plural
	if isLemma and tipus ~= "?" 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
			table.insert(data.inflections, {label = "només en singular"})
		end
		if tipus == nil then
			local infl_parts = {label = "plural", accel = "plural-form-of gender-" .. genere}
			local p1, p2, p3, p4 = p.forma_plural(pagename, genere)
			local plural1 = plural[1] or p1
			local plural2 = plural[2] or p2
			local plural3 = plural[3] or p3
			local plural4 = plural[4] or p4
			if plural1 and plural1 ~= "" then table.insert(infl_parts, plural1) end
			if plural2 and plural2 ~= "" then table.insert(infl_parts, plural2) end
			if plural3 and plural3 ~= "" then table.insert(infl_parts, plural3) end
			if plural4 and plural4 ~= "" then table.insert(infl_parts, plural4) end
			table.insert(data.inflections, infl_parts)
		end
	end
	
	-- Femení
	if fem then
		table.insert(data.inflections, {label = "femení", fem, accel = "femenina-form-of gender-f"})
	end
end
}

function p.forma_plural(mot, genere)
	local p1, p2, p3, p4 = '', '', '', ''
	
	if string.find(mot, "[aeiou]$") then
		p1 = mot .. 's'
		if mw.ustring.find(mot, "[cçgj]a$") then
			p2 = mw.ustring.gsub(mot, "([cçgj]a)$", {['ca']='ques',['ça']='ces',['ga']='gues',['ja']='ges'})
		elseif string.find(mot, "([gq])ua$") then
			p2 = string.gsub(mot, "([gq])ua$", "%1ües")
		elseif string.find(mot, "a$") then
			p2 = string.gsub(mot, "a$", "es")
		end
	elseif string.find(mot, "sc$") then -- cascs/casques/cascos
		p1 = mot .. 's'
		p2 = string.gsub(mot, "c$", "ques")
		if genere == 'm' then
			p3 = mot .. 'os'
		end
	elseif string.find(mot, "st$") then -- aquests/aquets/aquestes/aquestos
		p1 = mot .. 's'
		p2 = string.gsub(mot, "st$", "ts")
		p3 = mot .. 'es'
		if genere == 'm' then
			p4 = mot .. 'os'
		end
	elseif string.find(mot, "nt$") then -- gents/gens
		p1 = mot .. 's'
		p2 = string.gsub(mot, "t$", "s")
	elseif string.find(mot, "[aeiou]t$") then -- dits/ditz
		p1 = mot .. 's'
		p2 = mot .. 'z'
	elseif string.find(mot, "s$") then -- mes/meses/mesos
		p1 = mot
		if mw.ustring.find(mot, "[aàéíoòu]s$") then
			p2 = mw.ustring.gsub(mot, "([àéíò])s$", {['à']='as',['é']='es',['í']='is',['ò']='os'}) .. 'ses'
		elseif mw.ustring.find(mot, "[eèóú]s$") then
			p2 = mw.ustring.gsub(mot, "([àéíò])s$", {['è']='es',['ó']='os',['ú']='us'}) .. 'es'
		else
			p2 = mot .. 'es'
		end
		if genere == 'm' then
			p3 = mw.ustring.gsub(p2, "es$", "os")
		end
	elseif string.find(mot, "ç$") then -- braç/braces/braços
		p1 = mot
		p2 = string.gsub(mot, "ç$", "ces")
		if genere == 'm' then
			p3 = mot .. 'os'
		end
	elseif string.find(mot, "ig$") then -- passeigs/passeits/passeges/passejos
		p1 = mot .. 's'
		p2 = string.gsub(mot, "g$", "ts")
		p3 = string.gsub(mot, "ig$", "ges")
		if genere == 'm' then
			p4 = string.gsub(mot, "ig$", "jos")
		end
	elseif string.find(mot, "x$") then -- peixs/peis/peixes/peixos
		p1 = mot .. 's'
		p2 = string.gsub(mot, "x$", "s")
		p3 = mot .. 'es'
		if genere == 'm' then
			p4 = mot .. 'os'
		end
	elseif mw.ustring.find(mot, "[àéèíóòú]$") then -- vocal accentuada -> sense accent + ns
		p1 = mw.ustring.gsub(mot, "([àéèíóòú])$", {['à']='a',['è']='e',['é']='e',['í']='i',['ò']='o',['ó']='o',['ú']='u'}) .. 'ns'
	elseif mw.ustring.find(mot, "[ei]n$") and not mw.ustring.find(mot, "[àèéíòóú]") then -- en/in -> accent ... + ens/ins
		p1 = string.gsub(mot, "([aeiou])[^aeio]+[ei]n$", {['a']='à',['e']='è',['i']='í',['o']='ò',['u']='ú'})
		p1 = p1 .. string.match(mot, "([^aeio]+[ei]n)$") .. 's'
	else
		p1 = mot .. 's'
	end
	
	return p1, p2, p3, p4
end

return p