Vés al contingut

Mòdul:Labelled list hatnote

De Viki.cat

Aquest mòdul ofereix un grapat de funcions que faciliten la implementació de notes de text que prenen la forma d'una etiqueta davant d'una llista de pàgines, per exemple:

Ús

labelledList

Invocar la funció labelledList() és suficient per implementar la majoria de plantilles d'aquest tipus:

{{#invoke:Labelled list hatnote|labelledList|Etiqueta universal}}

o

{{#invoke:Labelled list hatnote|labelledList|Etiqueta singular|Etiqueta plural}}

Per exemple, proporcionar "Vegeu també" en lloc d'"Etiqueta universal" duplica la funcionalitat de {{Vegeu també}}, mentre que proporcionar "Article principal" i "Articles principals" en lloc d'"Etiqueta singular" i "Etiqueta plural" duplica la funcionalitat de l'(espai de noms de l'article) d'{{Article principal}}.

Si es proporcionen una tercera i una quarta etiquetes, s'utilitzaran en el cas que qualsevol de les pàgines de destinació estigui fora de l'espai de noms de l'article, per exemple a {{Article principal}} es pot implementar així:

{{#invoke:Labelled list hatnote|labelledList|Article principal|Articles principals|Pàgina principal|Pàgines principals}}

preprocessDisplays

La funció preprocessDisplays() pren una llista bruta d'arguments i es combina en qualsevol argument de visualització. Per exemple, {{see also|1|l1=Un}} inicialment té la taula d'arguments {'1', ['l1'] = 'Un'}; aquesta taula les combinaria a la taula {'1|Un'}. Anul·la la canalització manual (p. ex., {{vegeu també|1{{!}}2|l1=Un}} → {'1|Un'} i comprimeix les matrius disperses si s'omet un paràmetre o es deixa buit. Exemple:

Example: <syntaxhighlight lang="lua"> local mLabelledList = require('Module:Labelled list hatnote') local pages = mLabelledList.preprocessDisplays(args) </syntaxhighlight>

_labelledList

Per als mòduls que necessiten modificar lleugerament la funcionalitat mentre encara l'utilitzen, _labelledList() ofereix certa flexibilitat. Es necessita tres paràmetres:

  1. Una llista de pàgines, preferiblement preprocessades i comprimides per preprocessDisplays
  2. Una taula d'etiquetes, on el primer element és l'etiqueta singular o universal, i el segon una etiqueta plural o una còpia de la primera.
  3. Una taula d'opcions, preferiblement que contingui:
    • una cadena de template amb el títol complet de la plantilla. Per defecte el títol d'aquest mòdul.
    • una cadena de category (o nil) tal com la presa makeWikitextError delModule:Hatnote, per desactivar les categories d'error opcionalment
    • una cadena de selfref (o nil) tal com la pren _hatnote per habilitar l'opció selfref

Exemple: <syntaxhighlight lang="lua"> local mLabelledList = require('Module:Labelled list hatnote') return mLabelledList._labelledList(pages, labels, options) </syntaxhighlight>

Errors

Aquest mòdul fa que les plantilles basades en ell produeixin un missatge d'error si no es proporcionen noms de pàgina com a paràmetres de plantilla. Normalment, haurien de tornar a les seccions "Errors" de la documentació d'aquestes plantilles. Tanmateix, si aquestes plantilles utilitzen un mòdul amb _labelledList() i no proporcionen un element de plantilla a la seva taula d'opcions, aquest error es mostra per defecte aquí. L'error es pot resoldre proporcionant almenys un paràmetre de nom de pàgina vàlid a la plantilla en qüestió; el problema de la plantilla es pot solucionar proporcionant algun valor a l'element de template de la taula d'options _labelledList().


--------------------------------------------------------------------------------
--                               Labelled list                                --
--                                                                            --
-- This module does the core work of creating a hatnote composed of a list    --
-- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]",    --
-- for {{see also}} and similar templates.                                    --
--------------------------------------------------------------------------------

local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments --initialize lazily
local yesno --initialize lazily
local p = {}

-- Defaults global to this module
local defaults = {
	label = 'Vegeu també', --Final fallback for label argument
	labelForm = '%s: %s',
	prefixes = {'label', 'label ', 'l'},
	template = 'Module:Labelled list hatnote'
}

-- Localizable message strings
local msg = {
	errorSuffix = '#Errors',
	noInputWarning = "no s'especifica cap nom de pàgina",
	noOutputWarning =
		"'''[[%s]] — cap sortida: no existeix cap de les pàgines de destinació.'''"
}

-- Helper function that pre-combines display parameters into page arguments.
-- Also compresses sparse arrays, as a desirable side-effect.
function p.preprocessDisplays (args, prefixes)
	-- Prefixes specify which parameters, in order, to check for display options
	-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'
	prefixes = prefixes or defaults.prefixes
	local indices = {}
	local sparsePages = {}
	for k, v in pairs(args) do
		if type(k) == 'number' then
			indices[#indices + 1] = k
			local display
			for i = 1, #prefixes do
				display = args[prefixes[i] .. k]
				if display then break end
			end
			sparsePages[k] = display and
				string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
		end
	end
	table.sort(indices)
	local pages = {}
	for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end
	return pages
end

--Helper function to get a page target from a processed page string
--e.g. "Page|Label" → "Page" or "Target" → "Target"
local function getTarget(pagename)
	local pipe = string.find(pagename, '|')
	return string.sub(pagename, 0, pipe and pipe - 1 or nil)
end

-- Produces a labelled pages-list hatnote.
-- The main frame (template definition) takes 1 or 2 arguments, for a singular
-- and (optionally) plural label respectively:
-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}
-- The resulting template takes pagename & label parameters normally.
function p.labelledList (frame)
	mArguments = require('Module:Arguments')
	yesno = require('Module:Yesno')
	local labels = {frame.args[1] or defaults.label}
	labels[2] = frame.args[2] or labels[1]
	labels[3] = frame.args[3] --no defaulting
	labels[4] = frame.args[4] --no defaulting
	local template = frame:getParent():getTitle()
	local args = mArguments.getArgs(frame, {parentOnly = true})
	local pages = p.preprocessDisplays(args)
	local options = {
		category = yesno(args.category),
		extraclasses = frame.args.extraclasses,
		ifexists = yesno(frame.args.ifexists),
		namespace = frame.args.namespace or args.namespace,
		selfref = yesno(frame.args.selfref or args.selfref),
		template = template
	}
	return p._labelledList(pages, labels, options)
end

function p._labelledList (pages, labels, options)
	if options.ifexists then
		for k = #pages, 1, -1 do --iterate backwards to allow smooth removals
			local v = pages[k]
			local title = mw.title.new(getTarget(v), namespace)
			if (v == '') or title == nil or not title.exists then
				table.remove(pages, k)
			end
		end
	end
	labels = labels or {}
	label = (#pages == 1 and labels[1] or labels[2]) or defaults.label
	for k, v in pairs(pages) do
		if mHatnote.findNamespaceId(v) ~= 0 then
			label =
				(
					#pages == 1 and
					(labels[3] or labels[1] or defaults.label) or
					(labels[4] or labels[2] or defaults.label)
				) or defaults.label
		end
	end
	if #pages == 0 then
		if options.ifexists then
			mw.addWarning(
				string.format(
					msg.noOutputWarning, options.template or defaults.template
				)
			)
			return ''
		else
			return mHatnote.makeWikitextError(
				msg.noInputWarning,
				(options.template or defaults.template) .. msg.errorSuffix,
				options.category
			)
		end
	end
	local text = string.format(
		options.labelForm or defaults.labelForm,
		label,
		mHatlist.andList(pages, true)
	)
	local hnOptions = {
		extraclasses = options.extraclasses,
		selfref = options.selfref
	}
	return mHatnote._hatnote(text, hnOptions)
end

return p