Módulo:Ficha de videojuego
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