Ir al contenido

Módulo:Listas

De Wikipedia, la enciclopedia libre

Este módulo devuelve varias clases de listas.

Uso

{{#invoke:listas|función|primer elemento|segundo elemento|...|último elemento|parámetros opcionales}}

Funciones

Las funciones son:

lista

Devuelve una lista de elementos separados por comas. Por ejemplo:

{{#Invoke:listas|lista|elemento1|elemento2|elemento3}} produce:

elemento1, elemento2 y elemento3
listahtml

Devuelve una lista html. En el ejemplo anterior, cambiando la función:

{{#Invoke:listas|listahtml|elemento1|elemento2|elemento3}} produce:

  • elemento1
  • elemento2
  • elemento3
primero

Devuelve el primer elemento de la lista ordenada alfabéticamente. Por ejemplo:

{{#Invoke:listas|primero|gato|perro|conejo}} produce:

conejo

Parámetros opcionales

  • enlazar: Si se informa con "sí" se genera un enlace a cada elemento de la lista.
    • La plantilla automáticamente añade a cada elemento el espacio de nombres donde se utiliza la plantilla. Por ejemplo, {{#Invoke:listas|lista|enlazar=sí|listas|math}} añade el espacio de nombre "Módulo" por haberse utilizado en Módulo:Listas/doc:
    listas y math
    Para evitarlo puede utilizarse el parámetro espacio de nombres sin informar. Por ejemplo, {{#Invoke:listas|lista|enlazar=sí|espacio de nombres=|listas|math}} produce:
    listas y math
    • La plantilla automáticamente desambigua. Así si un elemento incluye texto entre paréntesis no lo muestra aunque en caso de enlazar se enlaza al nombre completo del elemento. Por ejemplo, {{#Invoke:listas|lista|enlazar=sí|espacio de nombres=|Bill Morrison (director)|elemento2|elemento3}} muestra "Bill Morrison" pero enlaza a Bill Morrison (director):
      Bill Morrison, elemento2 y elemento3
    • Si uno de los elementos ya está enlazado se muestra correctamente. Por ejemplo {{#Invoke:listas|lista|enlazar=sí|espacio de nombres=|[[Bill Morrison]]|elemento2|elemento3}} muestra Bill Morrison en vez de [[Bill Morrison]]:
      Bill Morrison, elemento2 y elemento3
  • separador: Cadena que separa los elementos de la lista. Si no se utiliza se toma por defecto como separador ", ". Por ejemplo {{#Invoke:listas|lista|separador=<br/>|elemento1|elemento2|elemento3}} muestra:
    elemento1
    elemento2
    elemento3
  • conjunción: Cadena que separa el último elemento de la lista. Si no se utiliza se toma por defecto el separador. Por ejemplo {{#Invoke:listas|lista|conjunción=o|elemento1|elemento2|elemento3}} muestra:
    elemento1, elemento2 o elemento3
  • delimitador: Se utiliza para mostrar los elementos entre delimitadores. Por ejemplo para mostrar los elementos entre cursivas se puede hacer: {{#Invoke:listas|lista|enlazar=no|delimitador=''|El gran robo del tren (novela)|Caída libre (novela)||Jumper (novela)|}}
    El gran robo del tren (novela), Caída libre (novela) y Jumper (novela)
  • clase: Si se utiliza la función listahtml, clase CSS de la lista. Los valores normales son "plainlist" para listas sin viñetas y "hlist" para listas horizontales. Por ejemplo, {{#Invoke:listas|listahtml|enlazar=sí|clase=hlist|elemento1|elemento2}} produce:

Plantillas que usan el módulo


local listas = {}
local existeCategoria = require('Módulo:Páginas').existeCategoria

-- Función que devuelve los elementos de la lista.
-- Solo se obtienen los elementos informados.
function listas.ObtenerElementosLista(frame)
	local Argumentos = frame.args;
	local parent     = frame:getParent();

	if not Argumentos[1] then
		Argumentos = parent.args;
	end

	local categoria = Argumentos['categoría'] or ''
	local ordenar   = Argumentos['ordenar']   or ''

	separador  = frame.args['separador'] or Argumentos['separador']
	conjuncion = frame.args['conjunción'] or Argumentos['conjunción']

	local ElementosLista = {}

	local i = 1;
	local j = 0;
	while Argumentos[i] do
		local TextoAMostrar
		if Argumentos[i] and not Argumentos[i]:match('^%s*$') then
			j = j + 1

			-- Añadir el enlace si no incluye ya uno
			local enlazar = frame.args.enlazar or parent.args.enlazar

			if mw.ustring.find(Argumentos[i], '%[%[') then
				enlazar = 'no'
			end

			if enlazar == 'sí' then
				-- Desambiguar eliminando el texto ente paréntesis del argumento i-ésimo si es de la forma
				--   "Texto (lo que sea)".
				-- Esto solo se hará si después de los paréntesis no hay nada. Ejemplos:
				--   Alfonso Albacete (director) --> Alfonso Albacete
				--   [[Carlos Vera (árbitro de fútbol)|Carlos Vera]] --> [[Carlos Vera (árbitro de fútbol)|Carlos Vera]]

				TextoAMostrar = Argumentos[i]:match('^(.*)%s%(.*%)$') or Argumentos[i]

				--Obtener el espacio de nombres de los argumentos
				local espacio_nombres = frame.args.nspace or parent.args.nspace or frame.args['espacio de nombres'] or parent.args['espacio de nombres'] or mw.title.getCurrentTitle().nsText

				if espacio_nombres == '' then
					--Se accede a la función con el argumento espacio_nombres pero está sin informar
					if Argumentos[i] == TextoAMostrar then
						ElementosLista[j] = mw.ustring.format('[[%s]]', TextoAMostrar)
					else
						ElementosLista[j] = mw.ustring.format('[[%s|%s]]', Argumentos[i], TextoAMostrar)
					end
				else
					--Se accede sin el espacio de nombres (en cuyo caso se toma el espacio de nombres desde global) o informado.

					--Obtener el nombre de la página (eliminando el espacio de nombres si lo tiene). Similar a {{PAGENAME:Argumentos[i]}}
					--Por ejemplo, si argumentos[i] vale "Plantilla:A" se informa nombrepagina con "A".
					local nombrepagina

					local noError, pageObject = pcall(mw.title.new, Argumentos[i])

					if noError then
						nombrepagina = pageObject.text
					else
						nombrepagina = Argumentos[i]
					end

					-- Enlazar tomando como espacio de nombres el recibido en el argumento o el global.
					ElementosLista[j] = mw.ustring.format('[[:%s:%s|%s]]', espacio_nombres, nombrepagina, TextoAMostrar)
				end
			else
				TextoAMostrar     = Argumentos[i]
				ElementosLista[j] = mw.text.trim( TextoAMostrar )
			end

			-- Añadir el delimitador
			local delimitador = frame.args.delimitador or parent.args.delimitador or frame.args.delim or parent.args.delim

			if delimitador then
				ElementosLista[j] = delimitador .. ElementosLista[j] .. delimitador
			end

			--Añadir la categoría
			if categoria ~= '' then
				-- Utilizar argumentos[i] si existe la correspondiente categoría
				local CategoriaElemento = existeCategoria(categoria:gsub('$1',Argumentos[i]))

				-- Si no existe ver si existe la categoría eliminando el texto entre paréntesis
				if not CategoriaElemento and TextoAMostrar ~= Argumentos[i] then
					CategoriaElemento = existeCategoria(categoria:gsub('$1',TextoAMostrar))
				end
				if CategoriaElemento then
					if ordenar == '' then
						ElementosLista[j] = ElementosLista[j] .. '[[' .. CategoriaElemento .. ']]'
					else
						ElementosLista[j] = ElementosLista[j] .. '[[' .. CategoriaElemento .. '|' .. ordenar .. ']]'
					end
				end
			end
		end

		i = i + 1;
	end

	return ElementosLista
end

-- lista con los elementos separados por comas
function listas.lista(frame)
	-- Obtener los elementos de la lista informados.
	local ElementosLista= listas.ObtenerElementosLista(frame)

	if not ElementosLista[1] then
		return
	end

	if not separador and not conjuncion then
		separador  = ','
		conjuncion = 'y'
	elseif separador and not conjuncion then
		conjuncion = separador
	end
	-- Corregir el separador
	if separador == ',' then
		separador= ', '
	end
	-- Corregir la conjunción
	if conjuncion == 'o' then
		conjuncion = ' o '
	elseif conjuncion == 'y' then
		conjuncion = frame:preprocess(' {{Y-e|{{Desvincular|' .. ElementosLista[#ElementosLista] .. '}}|sin texto}} ') -- ' y '
		conjuncion = ' ' .. conjuncion .. ' '
	end
	return mw.text.listToText(ElementosLista, separador, conjuncion)
end

function listas.listahtml(frame)
	local parent = frame:getParent();

	-- Obtener los elementos de la lista informados delimitándolos con 
	local ElementosLista= listas.ObtenerElementosLista(frame)
	if not ElementosLista[1] then
		return
	end

	-- Añadir a los elementos de la lista <li> y </li>
	local i = 1;
	while ElementosLista[i] do
		ElementosLista[i] = '<li>' .. ElementosLista[i] .. '</li>'
		i = i + 1;
	end
	-- Añadir la clase en su caso
	local clase = frame.args.clase or parent.args.clase
	local final = '<ul>' .. table.concat( ElementosLista ) .. '</ul>'
	if clase then
		final = '<div class="' .. clase ..'">' .. final .. '</div>'
	end
	return final
end

function listas.primero(frame)
	local ElementosLista= listas.ObtenerElementosLista(frame)
	if not ElementosLista[1] then
		return
	end
	table.sort( ElementosLista )
	return ElementosLista[1]
end

return listas