Favicon Vikidia.png
¡Vikidia te necesita!Face-wink.svg
Corazón.svg

Actualmente tenemos 6602 artículos. ¡Anímate! Face-smile.svg a crear los artículos solicitados

Módulo:Ficha

De Vikidia
Ir a la navegación Ir a la búsqueda
Test Template Info-Icon - Version (2).svg Documentación de módulo

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) Sí 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 (editar | 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