Diferencia entre revisiones de «Módulo:Listas»
Apariencia
Contenido eliminado Contenido añadido
Función adicional para obtener el primer elemento de la lista ordenada |
Arreglo para que en caso de que la última parte comience por «i» o «y», la conjunción final se modifique automáticamente por «e» en lugar de «y» [ejemplo: «Alemania e Italia»] |
||
Línea 5: | Línea 5: | ||
-- Solo se obtienen los elementos informados. |
-- Solo se obtienen los elementos informados. |
||
function listas.ObtenerElementosLista(frame) |
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 |
|||
if not Argumentos[1] then |
|||
-- Añadir el enlace si no incluye ya uno |
|||
Argumentos = parent.args; |
|||
local enlazar = frame.args.enlazar or parent.args.enlazar |
|||
end |
|||
local categoria = Argumentos['categoría'] or '' |
|||
local ordenar = Argumentos['ordenar'] or '' |
|||
if enlazar == 'sí' then |
|||
separador = frame.args['separador'] or Argumentos['separador'] |
|||
-- Desambiguar eliminando el texto ente paréntesis del argumento i-ésimo si es de la forma |
|||
conjuncion = frame.args['conjunción'] or Argumentos['conjunción'] |
|||
-- "Texto (lo que sea)". |
|||
-- Esto solo se hará si después de los paréntesis no hay nada. Ejemplos: |
|||
local ElementosLista = {} |
|||
-- Alfonso Albacete (director) --> Alfonso Albacete |
|||
-- [[Carlos Vera (árbitro de fútbol)|Carlos Vera]] --> [[Carlos Vera (árbitro de fútbol)|Carlos Vera]] |
|||
local i = 1; |
|||
local j = 0; |
|||
TextoAMostrar=Argumentos[i]:match('^(.*)%s%(.*%)$') or Argumentos[i] |
|||
while Argumentos[i] do |
|||
local TextoAMostrar |
|||
--Obtener el espacio de nombres de los argumentos |
|||
if Argumentos[i] and not Argumentos[i]:match('^%s*$') then |
|||
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 |
|||
j = j + 1 |
|||
if espacio_nombres == '' then |
|||
-- Añadir el enlace si no incluye ya uno |
|||
--Se accede a la función con el argumento espacio_nombres pero está sin informar |
|||
local enlazar = frame.args.enlazar or parent.args.enlazar |
|||
if Argumentos[i] == TextoAMostrar then |
|||
ElementosLista[j] = mw.ustring.format('[[%s]]',TextoAMostrar) |
|||
if mw.ustring.find(Argumentos[i], '%[%[') then |
|||
else |
|||
enlazar = 'no' |
|||
ElementosLista[j] = mw.ustring.format('[[%s|%s]]',Argumentos[i],TextoAMostrar) |
|||
end |
|||
else |
|||
if enlazar == 'sí' then |
|||
--Se accede sin el espacio de nombres (en cuyo caso se toma el espacio de nombres desde global) o informado. |
|||
-- Desambiguar eliminando el texto ente paréntesis del argumento i-ésimo si es de la forma |
|||
-- "Texto (lo que sea)". |
|||
--Obtener el nombre de la página (eliminando el espacio de nombres si lo tiene). Similar a {{PAGENAME:Argumentos[i]}} |
|||
-- Esto solo se hará si después de los paréntesis no hay nada. Ejemplos: |
|||
--Por ejemplo, si argumentos[i] vale "Plantilla:A" se informa nombrepagina con "A". |
|||
-- Alfonso Albacete (director) --> Alfonso Albacete |
|||
local nombrepagina |
|||
-- [[Carlos Vera (árbitro de fútbol)|Carlos Vera]] --> [[Carlos Vera (árbitro de fútbol)|Carlos Vera]] |
|||
local noError, pageObject = pcall(mw.title.new, Argumentos[i]) |
|||
TextoAMostrar=Argumentos[i]:match('^(.*)%s%(.*%)$') or Argumentos[i] |
|||
if noError then |
|||
--Obtener el espacio de nombres de los argumentos |
|||
nombrepagina = pageObject.text |
|||
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 |
|||
else |
|||
nombrepagina = Argumentos[i] |
|||
if espacio_nombres == '' then |
|||
end |
|||
--Se accede a la función con el argumento espacio_nombres pero está sin informar |
|||
if Argumentos[i] == TextoAMostrar then |
|||
-- Enlazar tomando como espacio de nombres el recibido en el argumento o el global. |
|||
ElementosLista[j] = mw.ustring.format('[[%s]]', TextoAMostrar) |
|||
else |
|||
end |
|||
ElementosLista[j] = mw.ustring.format('[[%s|%s]]', Argumentos[i], TextoAMostrar) |
|||
else |
|||
end |
|||
TextoAMostrar = Argumentos[i] |
|||
else |
|||
ElementosLista[j] = TextoAMostrar |
|||
--Se accede sin el espacio de nombres (en cuyo caso se toma el espacio de nombres desde global) o informado. |
|||
end |
|||
--Obtener el nombre de la página (eliminando el espacio de nombres si lo tiene). Similar a {{PAGENAME:Argumentos[i]}} |
|||
-- Añadir el delimitador |
|||
--Por ejemplo, si argumentos[i] vale "Plantilla:A" se informa nombrepagina con "A". |
|||
local delimitador = frame.args.delimitador or parent.args.delimitador or frame.args.delim or parent.args.delim |
|||
local nombrepagina |
|||
if delimitador then ElementosLista[j] = delimitador .. ElementosLista[j] .. delimitador end |
|||
local noError, pageObject = pcall(mw.title.new, Argumentos[i]) |
|||
--Añadir la categoría |
|||
if noError then |
|||
nombrepagina = pageObject.text |
|||
-- Utilizar argumentos[i] si existe la correspondiente categoría |
|||
else |
|||
local CategoriaElemento = existeCategoria(categoria:gsub('$1',Argumentos[i])) |
|||
nombrepagina = Argumentos[i] |
|||
end |
|||
-- Si no existe ver si existe la categoría eliminando el texto entre paréntesis |
|||
if not CategoriaElemento and TextoAMostrar ~= Argumentos[i] then |
|||
-- Enlazar tomando como espacio de nombres el recibido en el argumento o el global. |
|||
CategoriaElemento = existeCategoria(categoria:gsub('$1',TextoAMostrar)) |
|||
ElementosLista[j] = mw.ustring.format('[[:%s:%s|%s]]', espacio_nombres, nombrepagina, TextoAMostrar) |
|||
end |
|||
end |
|||
if CategoriaElemento then |
|||
else |
|||
if ordenar == '' then |
|||
TextoAMostrar = Argumentos[i] |
|||
ElementosLista[j] = ElementosLista[j] .. '[[' .. CategoriaElemento .. ']]' |
|||
ElementosLista[j] = TextoAMostrar |
|||
else |
|||
end |
|||
ElementosLista[j] = ElementosLista[j] .. '[[' .. CategoriaElemento .. '|' .. ordenar .. ']]' |
|||
end |
|||
-- Añadir el delimitador |
|||
end |
|||
local delimitador = frame.args.delimitador or parent.args.delimitador or frame.args.delim or parent.args.delim |
|||
end |
|||
end |
|||
if delimitador then |
|||
ElementosLista[j] = delimitador .. ElementosLista[j] .. delimitador |
|||
i = i + 1; |
|||
end |
|||
--Añadir la categoría |
|||
return ElementosLista |
|||
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 |
end |
||
-- lista con los elementos separados por comas |
-- lista con los elementos separados por comas |
||
function listas.lista(frame) |
function listas.lista(frame) |
||
-- Obtener los elementos de la lista informados. |
-- Obtener los elementos de la lista informados. |
||
local ElementosLista= listas.ObtenerElementosLista(frame) |
local ElementosLista= listas.ObtenerElementosLista(frame) |
||
if not ElementosLista[1] then |
if not ElementosLista[1] then |
||
return |
|||
end |
|||
if not separador and not conjuncion then |
if not separador and not conjuncion then |
||
separador = ',' |
|||
return mw.text.listToText(ElementosLista,', ',' y ') |
|||
conjuncion = 'y' |
|||
elseif separador and not conjuncion then |
elseif separador and not conjuncion then |
||
conjuncion = separador |
|||
return mw.text.listToText(ElementosLista, separador, separador) |
|||
end |
|||
else |
|||
-- 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 = ' y ' |
|||
end |
|||
return mw.text.listToText(ElementosLista, separador, conjuncion) |
|||
end |
|||
end |
end |
||
function listas.listahtml(frame) |
function listas.listahtml(frame) |
||
local parent = frame:getParent(); |
|||
-- Obtener los elementos de la lista informados delimitándolos con |
-- Obtener los elementos de la lista informados delimitándolos con |
||
local ElementosLista= listas.ObtenerElementosLista(frame) |
local ElementosLista= listas.ObtenerElementosLista(frame) |
||
if not ElementosLista[1] then |
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 |
|||
if clase then |
|||
return '<div' .. ' class="' .. clase ..'">' .. '<ul>' .. table.concat( ElementosLista ) .. '</ul></div>' |
|||
final = '<div class="' .. clase ..'">' .. final .. '</div>' |
|||
else |
|||
end |
|||
--Devolver la lista |
|||
return final |
|||
return '<ul>' .. table.concat( ElementosLista ) .. '</ul>' |
|||
end |
|||
end |
end |
||
function listas.primero(frame) |
function listas.primero(frame) |
||
local ElementosLista= listas.ObtenerElementosLista(frame) |
local ElementosLista= listas.ObtenerElementosLista(frame) |
||
if not ElementosLista[1] then |
if not ElementosLista[1] then |
||
return |
|||
end |
|||
table.sort( ElementosLista ) |
table.sort( ElementosLista ) |
||
return ElementosLista[1] |
return ElementosLista[1] |
Revisión del 02:30 4 may 2019
A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]
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:
- 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:
- 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): - 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]]:
- La plantilla automáticamente añade a cada elemento el espacio de nombres donde se utiliza la plantilla. Por ejemplo,
- 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
- elemento1
- 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:
- categoría:. Incluye la página donde se invoca al módulo en la categoría correspondiente si existe. Por ejemplo
{{#Invoke:listas|lista|enlazar=sí|espacio de nombres=|categoría=Películas dirigidas por $1|Aleksandar Petrović (director de cine)}}
incluirá la página en la categoría Categoría:Películas dirigidas por Aleksandar Petrović (director de cine) si existe. Si no es así la incluirá en la categoría Categoría:Películas dirigidas por Aleksandar Petrović si existe. Si no existe no se incluirá en ninguna de las categorías.- Puede usarse opcionalmente un parámetro llamado ordenar.
Plantillas que usan el módulo
{{en varias líneas|entrada1|entrada2|entrada3}}
→ entrada1
entrada2
entrada3{{lista|entrada1|entrada2|entrada3}}
→ entrada1, entrada2 y entrada3{{lista de enlaces|entrada1|entrada2|entrada3}}
→ entrada1, entrada2 y entrada3{{lista sin viñetas|entrada1|entrada2|entrada3}}
→- entrada1
- entrada2
- entrada3
Esta documentación está transcluida desde Módulo:Listas/doc.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este módulo.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este 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] = 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 '
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