Módulo:Ficha de videojuego
Apariencia
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.
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 enlazar = require('Módulo:URL').enlazar
local formatoNumero = ModuloFormatos.formatoNumero2
local numeroUnidad = ModuloFormatos.formatoUnidad2
-- :: 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 ModuloPaginas.nombrePagina({desambiguar='sí'})
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 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
local Ver = argumento['versión'] or argumento['version'] or propiedad('P348', {['calificador'] = 'P577', ['uno'] = 'último', ['ordenar'] = 'por fecha'})
local VerFecha = argumento['versión fecha'] or argumento['version fecha']
if Ver then
if VerFecha then
Version = Ver .. '<small>(' .. VerFecha .. ')</small>'
else
Version = Ver
end
else
Version = ''
end
local VersionDesa
Ver = argumento['versión desarrollo'] or argumento['versión desarrollo']
VerFecha = argumento['versión desarrollo fecha'] or argumento['version desarrollo fecha']
if Ver then
if VerFecha then
VersionDesa = Ver .. '<small>(' .. VerFecha .. ')</small>'
else
VersionDesa = Ver
end
else
VersionDesa = ''
end
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', {['valor-función'] = 'formatoNumero', ['valor-módulo'] = 'Wikidata/Formatos', ['uno'] = 'último', ['ordenar'] = 'por fecha'}) or ''
-- :: Desarrollo
local Lanzamiento = argumento['lanzamiento'] or Lanzamientovj() or ''
local Discontinuacion = argumento['discontinuación'] or propiedad('P2669', {['enlace']='no'})
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'] or ''
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},
{'Discontinuación', Discontinuacion},
{'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 style="display:table-row"><span style="display:table-cell;font-size:70%;vertical-align:top">[[' .. argumento[1] .. '|' .. argumento[2] .. ']]</span><span style="display:table-cell">' .. argumento[3] .. '</span></li>'
local Categoria
if argumento[4] then
Categoria = '[[Categoría:Wikipedia:Artículos que transcluyen Plantilla:Lanzamientovj usando una sintaxis incorrecta]]'
else
Categoria = '[[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 style="display:table-row"><span style="display:table-cell;font-size:70%;vertical-align:top">' .. argumento[1] .. '</span><span style="display:table-cell">' .. argumento[2] .. '</span></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
for kk, vv in pairs(v[2]) do
if argumento[vv] then
Valor = argumento[vv]
break
end
end
if not Valor then
for kk, vv in pairs((v[3] or {})) do
if argumento[vv] then
Valor = argumento[vv]
end
end
end
if Valor then
if v[1] == 'DESC' then
Etiqueta = '<abbr title="Fecha desconocida">?</abbr>'
elseif v[1] == 'WW' then
Etiqueta = '<abbr title="Lanzamiento mundial">WW</abbr>'
elseif v[4] then
Etiqueta = '[[' .. v[4] .. '|' .. v[1] ..']]'
elseif v[1] then
Etiqueta = v[1]
else
Etiqueta = nil
end
if Etiqueta then
table.insert(Valores, '<li style="display:table-row"><span style="display:table-cell;font-size:70%;vertical-align:top">' .. Etiqueta .. '</span><span style="display:table-cell">'.. Valor ..'</span></li>')
end
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 = {}
if not Entidad then return end
local Obj = elementoTabla(Entidad, 'claims', 'P577')
if Obj then
for k, v in pairs(Obj) do
local Valor = FormatoFechaHora(elementoTabla(v, 'mainsnak', 'datavalue', 'value'), {['enlace']='no'})
local Region = elementoTabla(v, 'qualifiers', 'P291', 1, 'datavalue', 'value', 'id')
local Etiqueta
if Region then
for kk, vv in pairs(LanzamientoDatos) do
if vv and vv[3] and (Region == vv[3][1] or Region == vv[3][2] or Region == vv[3][3]) then
if vv[4] and vv[1] then
Etiqueta = '[[' .. vv[4] .. '|' .. vv[1] ..']]'
elseif vv[1] then
Etiqueta = vv[1]
end
end
end
else
Etiqueta = '<abbr title="Lanzamiento mundial">WW</abbr>'
end
if Etiqueta and Valor then
table.insert(Valores, '<li style="display:table-row"><span style="display:table-cell;font-size:70%;vertical-align:top">' .. Etiqueta .. '</span><span style="display:table-cell">'.. Valor ..'</span></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 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í'})
local Blog = argumento['blog_oficial'] or propiedad('P1581',{['enlace']='no', uno='sí'})
local Repo = argumento['repositorio'] or propiedad('P1324', {['enlace']='no', uno='sí'})
local SegErrores= argumento['seguimiento_de_errores'] or propiedad('P1401', {['enlace']='no', uno='sí'})
if SitioWeb then table.insert(SitiosWeb, '<div>' .. enlazar(SitioWeb, 'Sitio web oficial') .. '</div>') end
if Blog then table.insert(SitiosWeb, '<div>' .. enlazar(Blog, 'Blog') .. '</div>') end
if Repo then table.insert(SitiosWeb, '<div>' .. enlazar(Repo, 'Repositorio de código') .. '</div>') end
if SegErrores then table.insert(SitiosWeb, '<div>' .. enlazar(SegErrores, 'Seguimiento de errores') .. '</div>') end
return table.concat(SitiosWeb, '\n')
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
local Obj2
local Obj3 = elementoTabla(entidad, 'claims', idPropiedad)
if type(ValorPosicional) == 'number' then Obj2 = elementoTabla(Obj3, ValorPosicional) end
if ValorPosicional == 'último' then Obj2 = elementoTabla(Obj3, #Obj3) end
if Calificador then
local Obj3 = elementoTabla(Obj2, 'qualifiers', Calificador)
if type(ValorPosicionalCalif) == 'number' then Obj2 = elementoTabla(Obj3, ValorPosicionalCalif) end
if ValorPosicionalCalif == 'último' then Obj2 = elementoTabla(Obj3, #Obj3) end
end
Obj = elementoTabla(Obj2, 'mainsnak')
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