Logo Vikidia.png
¡Quedándote en casa podemos prevenir la expansión del coronavirus!

Infórmate más aquí

Logo Vikidia.png

Módulo:Ficha

De Vikidia
Saltar a: navegación, buscar
[editar] [purgar]Template-info.svg Documentación de plantilla

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/microformatos/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 está transcluida desde Módulo:Ficha/doc.

Los editores pueden experimentar en la zona de pruebas de la plantilla.

Por favor, añade las categorías e interwikis en la subpágina de documentación. Subpáginas de esta plantilla.
local z = {}
local modUtilidades = require('Módulo:Utilidades')
local modMapa = false

z.categorias = {}
z.tieneDatos = false

function z.Dato(params)
  local linea
  if params[2] and params[2] ~= '' then
    z.tieneDatos = true
    linea = mw.html.create('tr')
    linea:addClass('dato')
    if params[1] and params[1] ~= '' then
      linea:wikitext('<th>' .. params[1] .. '</th><td>' .. params[2] .. '</td>')
    else
      linea:wikitext('<td colspan="2">' .. params[2] .. '</td>')
    end
  end
  return linea
end
function z.Imagen(params)
  local linea
  if params[1] and params[1] ~= '' then
    z.tieneDatos = true
    linea = mw.html.create('tr')
    linea:addClass('imagen')
    if params[2] and params[2] ~= '' then
      linea:wikitext('<td colspan="2"><div>[[Archivo:' .. params[1] .. '|'.. params[3] .. 'px]]<span>' .. params[2] .. '</span></div></td>')
    else
      linea:wikitext('<td colspan="2"><div>[[Archivo:' .. params[1] .. '|'.. params[3] .. 'px]]</div></td>')
    end
  end
  return linea
end
function z.ImagenDoble(params)
  local linea = mw.html.create('tr')
  linea:addClass('imagen')
  local hayimagen
  local celda
  for i = 0, 1 do
    celda = linea:tag('td')
    if params[3*i + 1] and params[3*i + 1] ~= '' then
      z.tieneDatos = true
      hayimagen = true
      if params[3*i + 2] and params[3*i + 2] ~= '' then
        celda:wikitext('<div>[[Archivo:' .. params[3*i + 1] .. '|'.. params[3*i + 3] .. 'px]]<span>' .. params[3*i + 2] .. '</span></div>')
      else
        celda:wikitext('<div>[[Archivo:' .. params[3*i + 1] .. '|'.. params[3*i + 3] .. 'px]]</div>')
      end
    end
  end
  if hayimagen then return linea end
end
function z.Mapa(params)
  local linea
  if modMapa == false then
    modMapa = require('Módulo:Mapa')
  end
  if params.latitud and params.longitud and params.zoom ~= '' then
    z.tieneDatos = true
    linea = mw.html.create('tr')
    linea
      :addClass('mapa')
      :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')
  linea:addClass('pestana')
  local td = linea:tag('td')
  td:attr('colspan','2')
  local tabs = td:tag('ul')
  local tab
  local dat
  for i, v in ipairs(params) do
    if v[1] and v[1] ~= '' then
      tab = tabs:tag('li')
      tab:wikitext(v[1])
      dat = td:tag('div')
      dat:wikitext(v[2])
      if i==1 then
        tab:addClass('pestana-activa')
        dat:addClass('pestana-activa')
      end
    end
  end
  if tab or dat then
    return linea
  end
end
function z.Seccion(params)
  local linea
  if params[1] and params[1] ~= '' then
    z.tieneDatos = true
    linea = mw.html.create('tr')
    linea
      :attr('data-desplegable-ficha', 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')
  linea:addClass('sucesion')
  local td = linea:tag('td')
  td:attr('colspan','2')
  local div = td:tag('div')
  local p
  for i = 1, 3 do
    if params[i] and params[i] ~= '' then
      p = div:tag('div')
      if i == 2 then p:addClass('sucesionActual') end
      p:wikitext(params[i])
    end
  end
  if #params > 0 then
    z.tieneDatos = true
    return linea
  end
end

function z.Ficha(args)
  local ficha = mw.html.create('table')
  ficha:css('--bg', args.estilo .. '70')
  ficha:addClass('ficha')
  local fCapt = ficha:tag('caption')
  fCapt:wikitext('<div>' .. args['título'] ..'</div>')
  if args['subtítulo'] then
    fSub = ficha:tag('tr')
    fSub
      :addClass('subtitulo')
      :wikitext('<td colspan="2">' .. args['subtítulo'] .. '</td>')
  end
  for i, v in ipairs(args) do
    if 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
    fPie = ficha:tag('tr')
    fPie
      :addClass('pie')
      :wikitext('<td colspan="2">' .. args['pie'] .. '</td>')
  end
  if not z.tieneDatos 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'],
    ['estilo'] = modUtilidades.esquemasColores[argumentos['estilo'] or 'indigo'][1],
    ['subtítulo'] = argumentos['subtítulo'],
    ['pie'] = argumentos.pie,
  }
  local pos
  for k, v in pairs(argumentos) do
    if string.find(k,'^imagen%d+$') then
      pos = string.match(k,'%d+$')
      table.insert(obj, {
        ['tipo'] = 'imagen',
        ['pos'] = tonumber(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),
        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),
        ['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 pest = {
        ['tipo'] = 'pestaña',
        ['pos'] = tonumber(pos),
      }
      local i = 0
      for i = 1,4 do
        if argumentos['pestaña'..tostring(i)..'-'..pos] then
          table.insert(pest, {argumentos['pestaña'..tostring(i)..'-'..pos], argumentos['pestañadatos'..tostring(i)..'-'..pos]})
        end
      end
      table.insert(obj, pest)
      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),
        argumentos['predecesor'..pos],
        argumentos['actual'..pos],
        argumentos['sucesor'..pos]
      })
    elseif string.find(k,'^datos%d+$') then
      pos = string.match(k,'%d+$')
       table.insert(obj, {
        ['pos'] = tonumber(pos),
        argumentos['etiqueta'..pos],
        argumentos['datos'..pos]
      })
    end
  end
  table.sort(obj, function(a,b) return a['pos'] < b['pos'] end)
  return z.Ficha(obj)
end

return z