Mòdul:llista de termes

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]


Mòdul de suport per a plantilles que mostren una llista de termes separats per comes, com {{homòfons}}, {{anagrames}}, {{vegeu}}.

La sintaxi per invocar des d'una plantilla és: {{#invoke:llista de termes|show|títol|estil|lang=|filtre=}}

  • 1= El primer paràmetre és el títol de la llista.
  • 2= El segon paràmetre opcional és l'estil del títol.
    • Si és igual a literal es mostrarà sense cap modificació. En cas contrari canviarà a plural si la llista de terme és major a un, i hi afegirà dos punts.
    • Si és igual a bold es mostrarà en negreta.
  • lang= Defineix el codi de llengua. Si no existeix buscarà el mateix paràmetre en la plantilla. Si tampoc existeix assumirà lang=mul com a multilingüe. Amb aquest paràmetre s'enllacen els termes a la secció de llengua corresponent
  • filtre=true Activa el filtre per eliminar la pàgina actual de la llista de terme. D'aquesta forma permet copiar fàcilment la mateixa llista quan s'inclou en diferents pàgines.
  • nodiacritics=true Ampliació del filtre per eliminar de la llista les variacions del títol de la pàgina amb diacrítics. Per exemple, veuré no és un anagrama de veure.

La sintaxi per cridar la plantilla és: {{plantilla|<lang>| |...}} El primer paràmetre és el codi de llengua. Tot seguit hi va la llista de termes amb un nombre de paràmetres il·limitat. La llista s'ordena automàticament segons les regles d'ordenació de cada llengua.

Paràmetres addicionals en la plantilla:

  • qx, on x és el número de terme corresponent: mostra un qualificador com a informació addicional entre parèntesis per aquell terme.
  • altx, on x és el número de terme corresponent: mostra un text alternatiu a l'enllaçat. En cas que no existeixi el paràmetre pel terme corresponent, es mostra el text alternatiu sense enllaç.

Vegeu uns exemples a {{homòfons}}. El codi original és de en:Module:homophones, adaptat i ampliat.

local p = {}

local m_links = require("Module:enllaç")
local m_util = require("Module:utilitats")
local m_languages = require("Module:llengua")

local function noDiacritics(word)
	return mw.ustring.gsub(mw.ustring.lower(word), "([àáèéíïòóúüç])", function (vowel) return mw.ustring.toNFD(vowel):sub(1, 1) end)
end

-- en cas de concurrència l'ordre de table.sort no és estable, depèn del locale
local function codepoint(str)
	local cp = {}
	for i = 1, mw.ustring.len(str) do
		table.insert(cp, string.format("%03d", mw.ustring.codepoint(str, i)))
	end
	return table.concat(cp)
end

local function alphagram(word)
	local letters = {}
	for letter in mw.ustring.gmatch(word, "(.)") do
		table.insert(letters, letter)
	end
	table.sort(letters)
	return table.concat(letters)
end

function p.show(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	
	local compat -- compatibility with parameter lang
	local langcode = args["lang"]
	if langcode then
		compat = true
	else
		langcode = pargs[1]
	end
	local lang = {}
	if langcode == "xx" then -- used by template:vegeu
		lang.code = "xx"
		lang.name = "qualsevol"
	else
		lang = m_languages.getByCode(langcode)
		if lang.code == lang.name then
			error("El primer paràmetre no és un codi de llengua vàlid")
		end
	end
	lang.sc = args.sc or lang.sc

	local text = ""
	local terms = {} -- because args is unmodifiable
	
	--copy all unnamed parameters to terms
	local list = 1
	for i, param in ipairs(pargs) do
		if compat or (not compat and i > 1) then
			terms[list] = {}
			terms[list]["term"] = param
			list = list + 1
		end
	end
	--copy all named parameters to terms
	--make the term empty string if only the alternate text exists
	for name, param in pairs(pargs) do
		local regex = mw.ustring.match(tostring(name),"^alt%d+$")
		
		if regex then
			local index = tonumber((name:gsub("alt", "")))
			
			if not terms[index] then
				terms[index] = {}
				terms[index]["term"] = ""
			end
			terms[index]["alt"] = param
		end
		
		regex = mw.ustring.match(tostring(name),"^q%d+$")
		if regex then
			local index = tonumber((name:gsub("q", "")))
			terms[index]["tr"] = param
		end
	end
	-- sort order
	for i, v in ipairs(terms) do
		terms[i]["sort"] = m_util.ordenacio(terms[i]["alt"] or terms[i]["term"], lang)
	end
	table.sort(terms, function(a, b) return codepoint(a.sort) < codepoint(b.sort) end)
	
	--main process
	local comma = false
	local count = 0
	local pagename = mw.title.getCurrentTitle().subpageText
	local pagename_nodiacritics = noDiacritics(pagename)
	
	for i, parameter in ipairs(terms) do
		if not (
			(args.filtre and pagename == parameter.term)
			or (args.nodiacritics and pagename_nodiacritics == noDiacritics(parameter.term))
			) then
			count = count + 1
			
			if comma then
				text = text .. ", "
			else
				comma = true
			end
			
			if parameter.term == "" then
				text = text .. parameter.alt
			else
				if args[2] == 'literal' then
					text = text .. m_links.full_link({term = parameter.term, alt = parameter.alt, lang = lang, tr = parameter.tr}, 'negreta')
				else
					text = text .. m_links.full_link({term = parameter.term, alt = parameter.alt, lang = lang, tr = parameter.tr})
				end
				if args.alfagrama then
					if alphagram(noDiacritics(parameter.term)) == parameter.term then
						text = text .. " <sup>(alfagrama)</sup>"
					elseif string.reverse(string.lower(parameter.term)) == pagename_nodiacritics then
						text = text .. " <sup>(revers)</sup>"
					end
				end
			end
		end
	end
	
	--return process
	local titol = args[1]
	if count > 1 and args[2] ~= "literal" then
		titol = require("Module:ca-lema").forma_plural_nominal(args[1], "-")
	end
	if args[2] == "bold" then
		titol = "<b>" .. titol .. "</b>"
	end
	
	if count > 0 then
		return titol .. (args[2] == "literal" and " " or ": ") .. text
	elseif mw.title.getCurrentTitle().nsText == "Plantilla" then
		return titol .. (args[2] == "literal" and " " or ": ") .. "[[terme#ca|terme]]"
	end
	
	--if this line is parsed, there are no terms at all and the namespace is not Template
	error("Cal proporcionar un terme com a mínim.")
	return titol
end

return p