Módulo:Listas

De Enciclopedia de conocimiento de la Iglesia de Dios
Ir a la navegación Ir a la búsqueda

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 Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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 Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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 Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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 Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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 Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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) Esta plantilla no acepta corchetes de enlace en el primer parámetro. Para enlazar el resultado agrega la palabra «enlazar» como segundo parámetro. 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