Módulo:Ficha de videojuego

De Wikipedia, la enciclopedia libre
Esta es una versión antigua de esta página, editada a las 23:17 1 sep 2022 por Amitie 10g (discusión · contribs.). La dirección URL es un enlace permanente a esta versión, que puede ser diferente de la versión actual.
Icono de documentación de módulo Documentación del módulo[ver] [editar] [historial] [purgar]

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.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 a Clasificacionvj()
  • 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 a Lanzamientovj()
  • 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 para Mó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.

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>&nbsp;' .. 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>&nbsp;' .. 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')) .. '&nbsp;-&nbsp;' .. 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