Módulo:Ficha de videojuego

De MacphersonWiki
Ir a la navegación Ir a la búsqueda

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[editar código]

  • 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[editar código]

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 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
	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', {['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'] 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},
			{'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')) .. '&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