Módulo:Ficha de videojuego
Apariencia
A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]
Esta documentación explica el funcionamiento del módulo en un contexto técnico. Para instrucciones sobre el uso de la plantilla asociada, véase la documentación de la misma en {{Ficha de videojuego}}
.
Este módulo implementa la plantilla {{Ficha de videojuego}}
, y versiones experimentales de {{Clasificaciónvj}}
y {{Lanzamientovj}}
en {{Clasificaciónvj/zona de pruebas}}
y {{Lanzamientovj/zona de pruebas}}
respectivamente. El propósito de unificar las tres plantillas en un solo módulo es optimización de recursos al evitrar repetir llamadas a Wikibase para una misma entidad.
Funciones
p.Ficha()
, la función principal, la cual implementaMódulo:Ficha.infobox()
tomando los valores como argumentos o desde Wikidata.
p.clasificacionvj()
, función pública para obtener la clasificación de contenido, para ser invocada desde{{Clasificaciónvj/zona de pruebas}}
usando datos locales, la cual a su vez llama aClasificacionvj()
Clasificacionvj()
, función privada para obtener la clasificación de contenido, para ser llamada dentro del módulo usando Wikidata, o desde la función pública.
p.lanzamientovj()
, función pública para obtener las fechas de lanzamiento, para ser invocada desde{{Lanzamientovj/zona de pruebas}}
, la cual a su vez llama aLanzamientovj()
Lanzamientovj()
, función privada para obtener las fechas de lanzamiento, para ser llamada dentro del módulo usando Wikidata, o desde la función pública.
obtenerEnlaces()
, función para generar enlaces externos.propiedad()
, función envoltura paraMódulo:Tablas.elemento()
, para obtener el valor de la propiedades de clasificaciones.
Agregar clasificaciones de contenido
Véase la documentación de Módulo:Clasificaciónvj/datos.
Esta documentación está transcluida desde Módulo:Ficha de videojuego/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 p = {}
-- Cargar módulos
local ModuloWikidata = require('Módulo:Wikidata')
local ModuloFormatos = require('Módulo:Wikidata/Formatos')
local ModuloPaginas = require('Módulo:Páginas')
-- Cargar tablas de datos
local ClasificacionDatos = mw.loadData('Módulo:Clasificaciónvj/datos')
local LanzamientoDatos = mw.loadData('Módulo:Lanzamientovj/datos')
-- :: Definir funciones desde módulos
local elementoTabla = require('Módulo:Tablas').elemento
local FormatoFechaHora = require('Módulo:Wikidata/Fecha').FormateaFechaHora
local obtenerArgumentosConValor = require('Módulo:Argumentos').obtenerArgumentosConValor
local formatoNumero = ModuloFormatos.formatoNumero2
local numeroUnidad = ModuloFormatos.formatoUnidad2
local obtenerEtiquetaWikidata = ModuloWikidata.obtenerEtiquetaWikidata
-- :: Definir variables globales
local Entidad, InstanciaDeID
local argumentos -- Tabla de argumentos con los que se llama a la función
local argumento={} -- Argumentos eliminando los argumentos sin datos
-- :: Estilos por defecto
local EstiloEtiqueta = 'width:30%;background-color:#EEF'
local EstiloDatos = 'width:70%;'
local EstiloTitulo = 'font-weight:bold; background-color:#CCF'
local TipoCabecera = 'videojuego'
function p.Ficha(frame)
-- :: Inicializador
ModuloWikidata:setFrame(frame)
argumento = obtenerArgumentosConValor(frame)
Entidad = mw.wikibase.getEntity(argumento.id)
InstanciaDeID = propiedad('P31', {['formato'] = 'entidadID'})
-- :: Cabecera
local Titulo = argumento['título'] or argumento['nombre'] or obtenerEtiquetaWikidata(Entidad) or ModuloPaginas.nombrePagina({desambiguar='sí'}) or ''
local TituloOrig = argumento['título original'] or argumento['título_original'] or propiedad('P1476') or ''
local Eslogan = argumento['eslogan'] or propiedad('P6291') or ''
--if InstanciaDeID == 'Q653928' then TipoCabecera = 'pinball' end
--if InstanciaDeID == 'Q192851' then TipoCabecera = 'arcade' end
local Logo = argumento['logo'] or ModuloWikidata.obtenerImagenWikidata(Entidad, 'P154') or ''
local Captura = argumento['imagen'] or argumento['captura'] or ''
local Pie
if not Captura == '' then
Pie = argumento['pie'] or ''
else
Captura, Pie = ModuloWikidata.obtenerImagenWikidata(Entidad, 'P18')
end
-- General
local Genero = argumento['género'] or argumento['genero'] or propiedad('P136') or ''
local GeneroInic = argumento['género inicial'] or argumento['género_inicial'] or ''
local Idiomas = argumento['idioma'] or argumento['idiomas'] or propiedad('P407') or ''
local Fabricante = argumento['fabricante'] or propiedad('P176') or ''
local Desarrollador = argumento['desarrollador'] or argumento['desarrolladora'] or propiedad('P178') or ''
local Distribuidor = argumento['distribuidor'] or argumento['distribuidora'] or propiedad('P123') or ''
local Editorial = argumento['editorial'] or propiedad('P750') or ''
local Creador = argumento['creador'] or propiedad('P50') or ''
local Disenador = argumento['diseñador'] or propiedad('P287') or ''
local Director = argumento['director'] or propiedad('P57') or ''
local Productor = argumento['productor'] or propiedad('P162') or ''
local DirectorSon = argumento['director sonido'] or argumento['director_sonido'] or propiedad('Q986888') or ''
local Programador = argumento['programador'] or propiedad('P943') or ''
local Artista = argumento['artista'] or ''
local Escritor = argumento['escritor'] or propiedad('P58') or ''
local Compositor = argumento['compositor'] or propiedad('P86') or ''
local Modos = argumento['modo'] or argumento['modos'] or propiedad('P404') or ''
-- Software
local Motor = argumento['motor'] or propiedad('P408') or ''
local Version = argumento['versión'] or argumento['version'] or propiedad('P348', {['calificador'] = 'P577', ['uno'] = 'último', ['ordenar'] = 'por fecha'}) or ''
local VersionDesa = (function()
local Version = argumento['versión desarrollo'] or argumento['versión_desarrollo']
local VersionFecha = argumento['versión desarrollo'] or argumento['versión_desarrollo_fecha']
if Version and VersionFecha then return Version .. '<small>(' .. VersionFecha .. ')</small>' end
return Version
end)() or ''
local Plataformas = argumento['plataforma'] or argumento['plataformas'] or propiedad('P400') or ''
local PlatafInic = argumento['plataforma inicial'] or ''
local Requisitos = argumento['requisitos'] or ''
local Licencias = argumento['licencia'] or argumento['licencias'] or propiedad('P275') or ''
-- :: Hardware
local Formato = argumento['formato'] or propiedad('P437') or ''
local Mueble = argumento['mueble'] or ''
local Hardware = argumento['hardware'] or ''
local CPU = argumento['cpu'] or propiedad('P880') or ''
local GPU = argumento['gpu'] or propiedad('P2560') or propiedad('P6948') or ''
local Audio = argumento['audio'] or propiedad('P7501') or ''
local Pantalla = argumento['pantalla'] or propiedad('P5307') or ''
local PantallaHardware, PantallaPinball
if InstanciaDeID == 'Q653928' then
PantallaPinball = Pantalla
else
PantallaHardware = Pantalla
end
local Entrada = argumento['entradas'] or propiedad('P479') or ''
-- :: Mesa de pinball
local Tecnologia = argumento['tecnologia'] or ''
local Lanzador = argumento['lanzador'] or ''
local Flippers = argumento['flippers'] or ''
local Anchura = argumento['anchura'] or ''
local Rampas = argumento['rampas'] or ''
local Bucles = argumento['bucles'] or ''
local Dianas = argumento['dianas']
local DianasAbat = argumento['dianas abatibles'] or argumento['dianas_abatibles'] or ''
local Bumpers = argumento['bumpers'] or ''
local Slingshots = argumento['slingshots'] or ''
local Accesorios = argumento['accesorios'] or ''
local UnidadesProducidas= argumento['unidades producidas'] or argumento['unidades_producidas'] or propiedad('P1092', {['formato'] = 'número'}) or ''
local UnidadesVendidas = argumento['unidades vendidas'] or argumento['unidades_vendidas'] or propiedad('P2664', {['formato'] = 'número'}) or ''
-- :: Desarrollo
local Lanzamiento = argumento['lanzamiento'] or Lanzamientovj() or ''
local ZonaPruebas = argumento['location test'] or ''
local Estado = argumento['estado actual'] or ''
local MotivoEstado = argumento['motivo estado'] or ''
local Serie = argumento['serie'] or propiedad('P179') or 'Serie'
local Anterior = argumento['anterior'] or propiedad('P155') or ''
local Posterior = argumento['posterior'] or propiedad('P156') or ''
local Primero = argumento['primero'] or ''
local PrimeroFecha = argumento['primero fecha'] or argumento['primero_fecha']
if Primero ~= '' and PrimeroFecha ~= '' then Primero = Primero .. ' (' .. PrimeroFecha .. ')' end
local Ultimo = argumento['último'] or ''
local UltimoFecha = argumento['último fecha'] or argumento['último_fecha'] or ''
if Ultimo ~= '' and UltimoFecha ~= '' then Ultimo = Ultimo .. ' (' .. UltimoFecha .. ')' end
local Derivadas = argumento['derivada'] or propiedad('P4969') or ''
local Expansiones = argumento['expansión'] or argumento['contenido descargable'] or argumento['dlc'] or ''
local Clasificaciones = argumento['clasificación'] or Clasificacionvj()
local SitiosWeb = obtenerEnlaces()
local TablaFicha = {
titulo = Titulo,
subtitulo = Eslogan,
tipocabecera = TipoCabecera,
clasetitulo = ClaseTitulo,
estilotitulo = EstiloTitulo,
estiloseccion = EstiloTitulo,
estiloetiqueta = EstiloEtiqueta,
estilodatos = EstiloDatos,
imagen = Logo,
['tamañoimagen'] = '250x250px',
imagen2 = Captura,
['tamañoimagen2'] = '250x250px',
pie2 = Pie,
estilopie = 'font-size:88%',
{tipo='sección',
titulo = 'Información general',
{'Creador', Creador},
{'Fabricante', Fabricante},
{'Desarrollador', Desarrollador},
{'Distribuidor', (Distribuidor or Editorial)},
{'Diseñador', Disenador},
{'Director', Director},
{'Productor', Productor},
{'Director de sonido', DirectorSon},
{'Programador', Programador},
{'Artista', Artista},
{'Escritor', Escritor},
{'Compositor', Compositor},
},
{tipo='sección',
titulo = 'Datos del juego',
{'Género', Genero},
{'Género Inicial', GeneroInic},
{'Primer videojuego', Primero},
{'Ultimo videojuego', Ultimo},
{'Idiomas', Idiomas},
{'Obras derivadas', Derivadas},
{'Modos de juego', Modos},
{'Clasificaciones', Clasificaciones},
},
{tipo='sección',
titulo = 'Datos del software',
{'Motor', Motor},
{'Versión actual', Version},
{'Version en desarrollo', VersionDesa},
{'Plataformas', Plataformas},
{'Plataforma inicial', PlatafInic},
Requisitos,
{'Licencias', Licencias},
},
{tipo='sección',
titulo = 'Datos del la mesa',
{'Tecnología', Tecnologia},
{'Tipo de lanzador', Lanzador},
{'Tipo de pantalla', PantallaPinball},
{'Anchura', Anchura},
{"''Flippers''", Flippers},
{'Rampas', Rampas},
{'Bucles', Bucles},
{'Dianas', Dianas},
{'Bumpers', Bumpers},
{'Accesorios', Accesorios},
{'Unidades producidas', UnidadesProducidas},
{'Unidades comercializadas', UnidadesVendidas},
},
{tipo='sección',
titulo = 'Datos del hardware',
{'Formato', Formato},
{'Mueble', Mueble},
{'Hardware', Hardware},
{'CPU', CPU},
{'Video', GPU},
{'Pantalla', PantallaHardware},
{'Audio', Audio},
{'Dispositivos de entrada', Entrada},
},
{tipo='sección',
titulo = 'Desarrollo',
{'Lanzamiento', Lanzamiento},
{'Zona de pruebas', ZonaPruebas},
{'Estado de desarrollo', Estado},
{'Expansiones', Expansiones},
},
{tipo='sección',
titulo = Serie,
{tipo='sucesión',
anterior = Anterior,
actual = Titulo,
siguiente = Posterior,
},
},
{tipo='sección',
titulo = 'Enlaces',
--estilodatos = 'text-align:left',
{'', SitiosWeb}
},
}
return require('Módulo:Ficha').infobox(TablaFicha)
end
-- Función p.clasificacionvj() pública para ser llamada desde la plantilla {{clasificaciónvj/zona de pruebas}}
function p.clasificacionvj(frame)
ModuloWikidata:setFrame(frame)
argumento = obtenerArgumentosConValor(frame)
if argumento.id then Entidad = mw.wikibase.getEntity(argumento.id) end
return Clasificacionvj()
end
-- Función Clasificacionvj() privada para ser incluída llamada desde este módulo
function Clasificacionvj()
local Salida = {}
local apertura = '<div style="display:table-row">'
local cierre = '</div>'
for k, v in pairs(ClasificacionDatos) do
local Clasificador = argumento[v[1]] or propiedad(v[3], {['formato'] = 'entidadID'})
if Clasificador then
if v[4][Clasificador] then
table.insert(Salida, '<div style="display:table-row">')
table.insert(Salida, '<div style="display:table-cell;font-weight:bold;padding-right:0.2em">[[' .. v[2] .. '|' .. v[1] .. ']]</div>')
table.insert(Salida, '<div style="display:table-cell;">[[Archivo:' .. v[4][Clasificador][1] .. '|' .. v[4][Clasificador][2] .. '|25x30px|link=]]</div>')
table.insert(Salida, '</div>')
end
end
end
return table.concat(Salida)
end
-- Función p.lanzamientovj() pública para ser llamada desde la plantilla {{Lanzamientovj/zona de pruebas}}
function p.lanzamientovj(frame)
argumento = obtenerArgumentosConValor(frame)
local Valores = {}
-- :: Sintraxis alternativa (parámetros posicionales, tres)
if argumento[1] and argumento[2] and argumento[3] then
local Valor = '<li><sup>[[' .. argumento[1] .. '|' .. argumento[2] .. ']]</sup> ' .. argumento[3] .. '</li>'
local Categoria = (function()
if argumento[4] then return '[[Categoría:Wikipedia:Artículos que transcluyen Plantilla:Lanzamientovj usando una sintaxis incorrecta]]' end
return '[[Categoría:Wikipedia:Artículos que transcluyen Plantilla:Lanzamientovj usando la sintaxis de parámetros posicionales]]'
end)()
table.insert(Valores, Valor..Categoria)
-- :: Sintraxis alternativa (parámetros posicionales, dos)
elseif argumento[1] and argumento[2] then
local Valor = '<li><sup>' .. argumento[1] .. '</sup> ' .. argumento[2] .. '</li>'
local Categoria = '[[Categoría:Wikipedia:Artículos que transcluyen Plantilla:Lanzamientovj usando la sintaxis de parámetros posicionales]]'
table.insert(Valores, Valor..Categoria)
-- :: Sintaxis estándar (parámetros nombrados por código de región)
else
for k, v in pairs(LanzamientoDatos) do
local Valor =
(function()
for kk, vv in pairs(v[2]) do
if argumento[vv] then return argumento[vv] end
end
end)()
or
(function()
for kk, vv in pairs((v[3] or {})) do
if argumento[vv] then return argumento[vv] end
end
end)()
if Valor then
Etiqueta= (function()
if v[1] == 'DESC' then return '<small><sup><abbr title="Fecha desconocida">?</abbr></sup></small>' end
if v[1] == 'WW' then return '<small><sup><abbr title="Lanzamiento mundial">WW</abbr></sup></small>' end
if v[4] then return '<small><sup>[[' .. v[4] .. '|' .. v[1] ..']]</sup></small>' end
return '<small><sup>' .. v[1] .. '</sup></small>'
end)()
table.insert(Valores, '<li>' .. Etiqueta .. ' '.. Valor ..'</li>')
end
end
end
if #Valores > 0 then
local Apertura = '<ul style="list-style: none; line-height: inherit; margin: 0px;">'
local Cierre = '</ul>'
return Apertura..table.concat(Valores)..Cierre
end
end
-- Función privada para ser llamada desde este módulo (solo extraer datos desde Wikidata)
function Lanzamientovj()
local Valores = {}
local Obj = elementoTabla(Entidad, 'claims', 'P577')
if Obj then
for k, v in pairs(Obj) do
Valor = FormatoFechaHora(elementoTabla(v, 'mainsnak', 'datavalue', 'value'), {['enlace']='no'})
Region = elementoTabla(v, 'qualifiers', 'P291', 1, 'datavalue', 'value', 'id')
Etiqueta= (function()
for kk, vv in pairs(LanzamientoDatos) do
if Region and (Region == vv[3][1] or Region == vv[3][2] or Region == vv[3][3]) then return '<small><sup>[[' .. vv[4] .. '|' .. vv[1] ..']]</sup></small>' end
return '<small><sup><abbr title="Lanzamiento mundial">WW</abbr></sup></small>'
end
end)() or ''
table.insert(Valores, '<li>' .. Etiqueta .. ' '.. Valor ..'</li>')
end
end
if #Valores > 0 then
local Apertura = '<ul style="list-style: none; line-height: inherit; margin: 0px;">'
local Cierre = '</ul>'
return Apertura..table.concat(Valores)..Cierre
end
end
-- :: Función para obtener y formatear enlaces externos
function obtenerEnlaces()
local SitiosWeb = {}
local SitioWeb = argumento['sitio_web'] or argumento['sitio web'] or argumento['web'] or propiedad('P856',{['enlace']='no', uno='sí'}) or ''
local Blog = argumento['blog_oficial'] or propiedad('P1581',{['enlace']='no', uno='sí'}) or ''
local Repo = argumento['repositorio'] or propiedad('P1324', {['enlace']='no', uno='sí'}) or ''
local SegErrores= argumento['seguimiento_de_errores'] or propiedad('P1401', {['enlace']='no', uno='sí'}) or ''
if generarEnlace(SitioWeb, 'Sitio web oficial') then table.insert(SitiosWeb, generarEnlace(SitioWeb, 'Sitio web oficial')) end
if generarEnlace(Blog, 'Blog') then table.insert(SitiosWeb, generarEnlace(Blog, 'Blog')) end
if generarEnlace(Repo, 'Repositorio de código') then table.insert(SitiosWeb, generarEnlace(Repo, 'Repositorio de código')) end
if generarEnlace(SegErrores, 'Seguimiento de errores') then table.insert(SitiosWeb, generarEnlace(SegErrores, 'Seguimiento de errores')) end
return table.concat(SitiosWeb, '\n')
end
function generarEnlace(enlace, texto)
local enlazar = require('Módulo:URL').enlazar
enlace = enlace:match('.+:?//(.+) .+$') or enlace
enlace = enlazar(enlace, texto)
if enlace then return enlace and '<div>'..enlace..'</div>\n' end
end
-- Función, propiedad() personalizada
function propiedad(idPropiedad, opciones, entidad)
if not entidad then entidad = Entidad end
if entidad and entidad.claims and entidad.claims[idPropiedad] then
if not opciones then
opciones = {['linkback']='sí'}
end
opciones['idioma'] = 'es'
local ValorPosicional = 1
if type(opciones['valor_posicional']) == 'number' then ValorPosicional = opciones['valor_posicional'] end
local ValorPosicionalCalif = 1
if type(opciones['valor_posicional_calif']) == 'number' then ValorPosicional = opciones['valor_posicional_calif'] end
local Calificador = opciones['calificador']
local Obj = (function()
local Obj = (function()
local Obj = elementoTabla(entidad, 'claims', idPropiedad)
if type(ValorPosicional) == 'number' then return elementoTabla(Obj, ValorPosicional) end
if ValorPosicional == 'último' then return elementoTabla(Obj, #Obj) end
end)()
if Calificador then
Obj = (function()
local Obj = elementoTabla(Obj, 'qualifiers', Calificador)
if type(ValorPosicionalCalif) == 'number' then return elementoTabla(Obj, ValorPosicionalCalif) end
if ValorPosicionalCalif == 'último' then return elementoTabla(Obj, #Obj) end
end)()
end
return elementoTabla(Obj, 'mainsnak')
end)()
Tipo = elementoTabla(Obj, 'datavalue', 'type')
if opciones['formato'] == 'archivo' then
if not opciones['uno'] then opciones['uno'] = 'último' end
opciones['ordenar'] = 'por fecha'
if Calificador then return elementoTabla(Obj, 'datavalue', 'value') end
end
-- Devolver el ID de la entidad, para propiedades de entidad
if opciones['formato'] == 'entidadID' then
return elementoTabla(Obj, 'datavalue', 'value', 'id')
end
if opciones['formato'] == 'cadena' then
opciones['linkback'] = 'no'
if Tipo == 'string' then
return elementoTabla(Obj, 'datavalue', 'value')
end
end
if opciones['formato'] == 'número' then
if Tipo == 'quantity' then
return formatoNumero(elementoTabla(Obj, 'datavalue', 'value', 'amount'))
end
end
-- Valores cuya unidad deba ir a la derecha, separada de un espacio
if opciones['formato'] == 'unidad' then
if elementoTabla(entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue') then
return formatoNumero(elementoTabla(entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue', 'value', 'amount')) .. ' - ' .. numeroUnidad(elementoTabla(entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue'), opciones)
else
return numeroUnidad(elementoTabla(entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue'), opciones)
end
end
-- Invocar a la función fallback si no se cumplen las condiciones anteriores
opciones.entityId = entidad.id
opciones.propiedad = idPropiedad
return ModuloWikidata.getPropiedad(opciones, entidad.claims[idPropiedad])
end
end
return p