¡Vikidia te necesita!
Actualmente tenemos 6602 artículos. ¡Anímate! a crear los artículos solicitados |
Módulo:Ficha
Este módulo permite crear fichas, ya sea desde otro módulo, o mediante la plantilla {{Ficha}}
.
Uso
El módulo puede ser invocado en dos formas distintas. La forma más fácil de crear una ficha es usando la plantilla homónima (véase la documentación en Plantilla:Ficha/pruebas). La segunda, es importando el módulo desde otro módulo, lo que es algo más complicado, pero permite realizar algunas acciones que no serían posibles, o lo serían de una manera muy complicada, usando sólo wikitexto, como el uso de bucles, o llamadas a Wikidata.
Para crear un módulo que cree una ficha, puede usarse el siguiente modelo:
local z = {}
-- Módulos y funciones externas
local modUtilidades = require('Módulo:Utilidades')
local modFicha = require('Módulo:Ficha')
--Obtener una copia de los argumentos eliminando los argumentos sin valor
local argumentos = modUtilidades.eliminarArgSinValor(mw.getCurrentFrame():getParent().args)
function z.Ficha(frame)
local ficha = {
titulo = argumentos.nombre or frame:getParent():getTitle(),
resto de parámetros
...
}
return modFicha.Ficha(ficha)
end
return z
Funciones
Pendiente
Tareas pendientes en el módulo. Si alguien se anima a añadir las funciones necesarias, es bienvenido a hacerlo:
- Integrar más tipos de filas especializados, de modo que ya no haga falta usar una sección genérica para ciertos tipos de contenido. Por ejemplo:
- Mapa de localización (adaptando Módulo:Mapa) Hecho
- Celdas tabuladas (para insertar datos tabulares en una celda)
- Gráficos simples (de barras, de pastel)
- Integrar importación de datos Wikidata (hace falta alguna de estas extensiones mw:Extension:LinkedWiki o mw:Extension:Wikibase)
- Habilitar microdatos/RDF (para proveer datos semánticos, que pueden ser usados, por ejemplo, en los resultados de búsqueda)
- Implementar los esquemas de fichas (para controlar los campos a mostrar, dependiendo de un parámetro en específico. Véase motivación principal en esta encuesta de Wikipedia)
Para sugerir una mejora al módulo, puedes comentarlo en la discusión del módulo.
Esta documentación se encuentra en la subpágina Módulo:Ficha/doc ( | historial)
Por favor, incluye las categorías a la subpágina /doc. Subpáginas de este módulo.
local z = {}
local modUtilidades = require('Módulo:Utilidades')
local modMapa
z.categorias = {}
function z.Columna(params)
local linea = mw.html.create('tr')
:addClass('columna')
local td = linea:tag('td')
:attr('colspan','2')
local div = td:tag('div')
local p
for i = 1, 4 do
if params[i] then
p = div:tag('div'):addClass(params['clase'][i])
end
end
if #params > 0 then
return linea
end
end
function z.Dato(params)
local linea
if params[2] then
linea = mw.html.create('tr')
:addClass('dato')
:addClass(params['clase'])
local celda = mw.html.create('td'):wikitext(params[2])
if params[1] then
linea:tag('th'):wikitext(params[1])
else
celda:attr('colspan', '2')
end
linea:node(celda)
end
return linea
end
function z.Imagen(params)
local linea
if params[1] and params[3] then
linea = mw.html.create('tr')
:addClass('imagen')
:addClass(params['clase'])
if params[2] then
-- HACER: aria-labelledby
linea:wikitext('<td colspan="2" role="figure">[[Archivo:' .. params[1] .. '|'.. params[3] .. 'px]]<span>' .. params[2] .. '</span></td>')
else
linea:wikitext('<td colspan="2" role="figure">[[Archivo:' .. params[1] .. '|'.. params[3] .. 'px]]</td>')
end
end
return linea
end
function z.ImagenDoble(params)
local linea = mw.html.create('tr')
linea
:addClass('imagen')
-- No se usa #params para comprobar esto porque puede haber nil en el primer elemento de la secuencia
local hayimagen
local celda
for i = 0, 1 do
celda = linea:tag('td'):attr('role', 'figure'):addClass(params['clase'][i])
if params[3*i + 1] then
hayimagen = true
if params[3*i + 2] then
celda:wikitext('[[Archivo:' .. params[3*i + 1] .. '|'.. params[3*i + 3] .. 'px]]<span>' .. params[3*i + 2] .. '</span>')
else
celda:wikitext('[[Archivo:' .. params[3*i + 1] .. '|'.. params[3*i + 3] .. 'px]]')
end
end
end
if hayimagen then return linea end
end
function z.Mapa(params)
local linea
if not modMapa then
modMapa = require('Módulo:Mapa')
end
if params.latitud and params.longitud and params.zoom then
linea = mw.html.create('tr')
:addClass('mapa')
:addClass(params['clase'])
:wikitext('<td colspan="2">' .. modMapa.Mapa({
['tipo'] = 'mapframe',
['latitud'] = params.latitud,
['longitud'] = params.longitud,
['zoom'] = params.zoom,
['sinmarco'] = true,
['altura'] = 300,
['anchura'] = 274
}, {}) ..'</td>')
end
return linea
end
function z.Pestana(params)
local linea = mw.html.create('tr')
:addClass('pestana')
local td = linea:tag('td'):attr('colspan','2')
local tabs = td:tag('div'):attr('role','tablist')
local tab
local dat
for i, v in ipairs(params) do
if v[1] then
tab = tabs:tag('span'):attr('role','tab'):wikitext(v[1])
dat = td:tag('div'):addClass(params['clase'][i]):attr('role','tabpanel'):wikitext(v[2])
if i~=1 then
-- BUG: atributos ARIA no se muestran
tab:addClass('pestana-activa')
dat:attr('hidden','hidden')
end
end
end
if #params ~= 0 then return linea end
end
function z.Seccion(params)
local linea
if params[1] then
linea = mw.html.create('tr')
:attr('data-desplegable', params['desplegable'])
:addClass('seccion')
:wikitext('<th colspan="2">' .. params[1] .. '</th>')
end
return linea
end
function z.Sucesion(params)
local linea = mw.html.create('tr')
:addClass('sucesion')
local td = linea:tag('td')
:attr('colspan','2')
local div = td:tag('div')
local p
for i = 1, 3 do
if params[i] then
p = div:tag('div'):addClass(params['clase'][i])
if i == 2 then p:addClass('sucesionActual') end
p:wikitext(params[i])
end
end
if #params > 0 then
return linea
end
end
function z.Ficha(args)
local ficha = mw.html.create('table')
:addClass('ficha')
:addClass(args['clase'])
ficha:tag('caption')
:tag('div')
:wikitext(args['título'])
if args['subtítulo'] then
fSub = ficha:tag('tr')
:addClass('subtitulo')
:wikitext('<td colspan="2">' .. args['subtítulo'] .. '</td>')
end
for i, v in ipairs(args) do
if args[i].tipo == 'columna' then
ficha:node(z.Columna(args[i]))
elseif args[i].tipo == 'imagen' then
ficha:node(z.Imagen(args[i]))
elseif args[i].tipo == 'imagendoble' then
ficha:node(z.ImagenDoble(args[i]))
elseif args[i].tipo == 'mapa' then
ficha:node(z.Mapa(args[i]))
elseif args[i].tipo == 'pestaña' then
ficha:node(z.Pestana(args[i]))
elseif args[i].tipo == 'sección' then
ficha:node(z.Seccion(args[i]))
elseif args[i].tipo == 'sucesión' then
ficha:node(z.Sucesion(args[i]))
else
ficha:node(z.Dato(args[i]))
end
end
if args['pie'] then
ficha:tag('tr'):addClass('pie'):wikitext('<td colspan="2">' .. args['pie'] .. '</td>')
end
if #args == 0 and not args['pie'] then table.insert(z.categorias, 'Vikidia:Artículos que usan fichas sin datos') end
local cats = ''
for i, v in ipairs(z.categorias) do
cats = cats .. '[[Categoría:'..v..']]'
end
return tostring(ficha) .. cats
end
function z._Ficha(frame)
local argumentos = modUtilidades.eliminarArgSinValor(mw.getCurrentFrame():getParent().args)
local obj = {
['título'] = argumentos['título'] or '',
['estilo'] = argumentos['estilo'] or 'indigo',
['clase'] = argumentos['clase'] or '',
['subtítulo'] = argumentos['subtítulo'],
['pie'] = argumentos.pie,
}
local pos -- Marcador de posición
for k, v in pairs(argumentos) do
if string.find(k, '^columna%d+%-%d+') then
pos = string.match(k, '%d+')
local lin = {
['tipo'] = 'columna',
['pos'] = tonumber(pos),
['clase'] = {},
}
local i = 0
for i = 1,4 do
if argumentos['columna'..tostring(i)..'-'..pos] then
lin[i] = argumentos['columna'..tostring(i)..'-'..pos]
lin['clase'][i] = argumentos['clase'..tostring(i)..'-'..pos]
end
end
elseif string.find(k,'^imagen%d+$') then
pos = string.match(k,'%d+$')
table.insert(obj, {
['tipo'] = 'imagen',
['pos'] = tonumber(pos),
['clase'] = argumentos['clase'..pos],
argumentos['imagen'..pos],
argumentos['pieimagen'..pos],
argumentos['tamañoimagen'..pos]
})
elseif string.find(k,'^imagenizquierda%d+$') or string.find(k,'^imagenderecha%d+$') then
pos = string.match(k,'%d+$')
table.insert(obj, {
['tipo'] = 'imagendoble',
['pos'] = tonumber(pos),
['clase'] = {argumentos['clase1-'..pos], argumentos['clase2-'..pos]},
argumentos['imagenizquierda'..pos],
argumentos['pieimagenizquierda'..pos],
argumentos['tamañoimagenizquierda'..pos],
argumentos['imagenderecha'..pos],
argumentos['pieimagenderecha'..pos],
argumentos['tamañoimagenderecha'..pos]
})
argumentos['imagenizquierda'..pos] = nil
argumentos['imagenderecha'..pos] = nil
elseif string.find(k,'^latitud%d+$') then
pos = string.match(k,'%d+$')
table.insert(obj, {
['tipo'] = 'mapa',
['pos'] = tonumber(pos),
['clase'] = argumentos['clase'..pos],
['latitud'] = argumentos['latitud'..pos],
['longitud'] = argumentos['longitud'..pos],
['zoom'] = argumentos['zoom'..pos]
})
--?: argumentos['longitud'..pos] = nil
--?: argumentos['zoom'..pos] = nil
elseif string.find(k,'^pestaña%d+%-%d+$') then
pos = string.match(k,'%d+$')
local lin = {
['tipo'] = 'pestaña',
['pos'] = tonumber(pos),
['clase'] = {}
}
local i = 0
for i = 1,4 do
if argumentos['pestaña'..tostring(i)..'-'..pos] then
lin[i] = {argumentos['pestaña'..tostring(i)..'-'..pos], argumentos['detalle'..tostring(i)..'-'..pos]}
lin['clase'][i] = argumentos['clase'..tostring(i)..'-'..pos]
end
end
table.insert(obj, lin)
for j = 1,4 do argumentos['pestaña'..tostring(j)..'-'..pos] = nil end
elseif string.find(k,'^sección%d+$') then
pos = string.match(k,'%d+$')
table.insert(obj, {
['tipo'] = 'sección',
['pos'] = tonumber(pos),
argumentos['sección'..pos],
['desplegable'] = argumentos['desplegable'..pos]
})
elseif string.find(k,'^actual%d+$') then
pos = string.match(k,'%d+$')
table.insert(obj, {
['tipo'] = 'sucesión',
['pos'] = tonumber(pos),
['clase'] = {
argumentos['clase1-'..pos],
argumentos['clase2-'..pos],
argumentos['clase3-'..pos]
},
argumentos['predecesor'..pos],
argumentos['actual'..pos],
argumentos['sucesor'..pos]
})
elseif string.find(k,'^datos%d+$') then
pos = string.match(k,'%d+$')
if argumentos['datos'..pos] and argumentos['datos'..pos] ~= '' then
table.insert(obj, {
['pos'] = tonumber(pos),
['clase'] = argumentos['clase'..pos],
argumentos['etiqueta'..pos],
argumentos['datos'..pos]
})
end
end
end
table.sort(obj, function(a,b) return a['pos'] < b['pos'] end)
return z.Ficha(obj)
end
return z