En este módulo se incluyen varias funciones que devuelven la lista de obras ganadoras de un premio. Los datos se obtienen de Wikidata de las propiedades y calificativos:

  • ganador (P1346): ganador del evento - favor de no usar con las distinciones (puede usar P166 en vez de esa propiedad), ni con las guerras ni las batallas. Calificativos:
    • fecha (P585): fecha en la que ocurrió el evento
    • premiado por la obra (P1686): calificador del premio recibido para especificar la obra por la cual es reconocido

Uso

{{#invoke:obras ganadoras|función|Q...}} donde Q... es el identificador en Wikidata del premio.

Funciones

Las funciones son:

navegacion(Q...)
Devuelve una plantilla de navegación con las obras premiadas. Ejemplo para el Premio Minotauro

{{#invoke:obras ganadoras|navegacion|Q2884863}} produce:

tabla(Q...)
Devuelve una tabla con las obras premiadas. Ejemplo para el Premio Minotauro

{{#invoke:obras ganadoras|tabla|Q2884863}} produce:

Año Título Autor
2004Máscaras de matarLeón Arsenal
2005Los sicarios del cieloRodolfo Martínez
2006Señores del OlimpoJavier Negrete
2007GothikaClara Tahoces
2008El libro de NobacFederico Fernández Giordano
2009El templo de la lunaFernando Jiménez López
2010Crónicas del multiversoVíctor Conde
2011Ciudad sin estrellasMontse de Paz Toldrá
2012La torre prohibidaÁngel Gutiérrez Tapia y David Zurdo Saiz
2013PanteónCarlos Sisí
Si se utiliza el parámetro opcional países, por ejemplo en el Premio Hugo a la mejor novela:
Año Título AutorPaís
1953El hombre demolidoAlfred BesterEstados Unidos
1955La máquina de la eternidadFrank Riley y Mark CliftonEstados Unidos
1956Estrella dobleRobert A. HeinleinEstados Unidos
1958El gran tiempoFritz LeiberEstados Unidos
1959Un caso de concienciaJames BlishEstados Unidos
1960Tropas del espacioRobert A. HeinleinEstados Unidos
1961Cántico por LeibowitzWalter M. MillerEstados Unidos
1962Forastero en tierra extrañaRobert A. HeinleinEstados Unidos
1963El hombre en el castilloPhilip K. DickEstados Unidos
1964Estación de tránsitoClifford D. SimakEstados Unidos
1965El planeta erranteFritz LeiberEstados Unidos
1966
Ex-aequo
DuneFrank HerbertEstados Unidos
Tú, el inmortalRoger ZelaznyEstados Unidos
1967La Luna es una cruel amanteRobert A. HeinleinEstados Unidos
1968El señor de la luzRoger ZelaznyEstados Unidos
1969Todos sobre ZanzíbarJohn BrunnerReino Unido
1970La mano izquierda de la oscuridadUrsula K. Le GuinEstados Unidos
1971Mundo AnilloLarry NivenEstados Unidos
1972A vuestros cuerpos dispersosPhilip José FarmerEstados Unidos
1973Los propios diosesIsaac AsimovRusia Soviética, Estados Unidos y República Socialista Federativa Soviética de Rusia
1974Cita con RamaArthur C. ClarkeReino Unido
1975Los desposeídosUrsula K. Le GuinEstados Unidos
1976La guerra interminableJoe HaldemanEstados Unidos
1977Donde solían cantar los dulces pájarosKate WilhelmEstados Unidos
1978PórticoFrederik PohlEstados Unidos
1979Serpiente del sueñoVonda N. McIntyreEstados Unidos
1980Las fuentes del paraísoArthur C. ClarkeReino Unido
1981La reina de la nieveJoan D. VingeEstados Unidos
1982La estación DownbelowC. J. CherryhEstados Unidos
1983Los límites de la FundaciónIsaac AsimovRusia Soviética, Estados Unidos y República Socialista Federativa Soviética de Rusia
1984Marea estelarDavid BrinEstados Unidos
1985NeuromanteWilliam GibsonEstados Unidos y Canadá
1986El juego de EnderOrson Scott CardEstados Unidos
1987La voz de los muertosOrson Scott CardEstados Unidos
1988La rebelión de los pupilosDavid BrinEstados Unidos
1989CyteenC. J. CherryhEstados Unidos
1990HyperionDan SimmonsEstados Unidos
1991El juego de los VorLois McMaster BujoldEstados Unidos
1992BarrayarLois McMaster BujoldEstados Unidos
1993
Ex-aequo
El libro del día del Juicio FinalConnie WillisEstados Unidos
Un fuego sobre el abismoVernor VingeEstados Unidos
1994Marte verdeKim Stanley RobinsonEstados Unidos
1995Danza de espejosLois McMaster BujoldEstados Unidos
1996La era del diamanteNeal StephensonEstados Unidos
1997Marte azulKim Stanley RobinsonEstados Unidos
1998Paz interminableJoe HaldemanEstados Unidos
1999Por no mencionar al perroConnie WillisEstados Unidos
2000Un abismo en el cieloVernor VingeEstados Unidos
2001Harry Potter y el cáliz de fuegoJ. K. RowlingReino Unido
2002American GodsNeil GaimanReino Unido
2003HomínidosRobert J. SawyerCanadá y Estados Unidos
2004Paladín de almasLois McMaster BujoldEstados Unidos
2005Jonathan Strange y el señor NorrellSusanna ClarkeReino Unido
2006SpinRobert Charles WilsonCanadá
2007Al final del arco irisVernor VingeEstados Unidos
2008El sindicato de policía yiddishMichael ChabonEstados Unidos
2009El libro del cementerioNeil GaimanReino Unido
2010
Ex-aequo
La chica mecánicaPaolo BacigalupiEstados Unidos
La ciudad y la ciudadChina MiévilleReino Unido
2011El apagón / Cese de alertaConnie WillisEstados Unidos
2012Entre extrañosJo WaltonCanadá y Reino Unido
2013RedshirtsJohn ScalziEstados Unidos
2014Justicia auxiliarAnn LeckieEstados Unidos
2015El problema de los tres cuerposLiu CixinRepública Popular China
2016La quinta estaciónN. K. JemisinEstados Unidos
2017El portal de los obeliscosN. K. JemisinEstados Unidos
2018El cielo de piedraN. K. JemisinEstados Unidos
2019Hacia las estrellasMary Robinette KowalEstados Unidos
2020A Memory Called EmpireArkady MartineEstados Unidos
2021Network EffectMartha WellsEstados Unidos
2022A Desolation Called PeaceArkady MartineEstados Unidos
2023Nettle & BoneUrsula VernonEstados Unidos
2024Some Desperate GloryEmily TeshReino Unido

local z = {}

-- Módulos utilizados
local ModuloWikidata      = require('Module:Wikidata')
	local formatoDatoWikidata = ModuloWikidata.formatoDato
local ModuloFormatosWikidata = require('Módulo:Wikidata/Formatos')
	local enlazarWikidata = ModuloFormatosWikidata.enlazar
local ModuloTablas    = require('Module:Tablas')
	local elementoTabla   = ModuloTablas.elemento
	local insertar        = ModuloTablas.insertar
	local ordenarTabla    = ModuloTablas.ordenar
local navbox  = require('Module:Navbox')._navbox
	
-- Funciones internas

function formatear2(ids, opciones)
	local idsFormateados= {}	
	
	local i, id
	
    local etiqueta, enlace, etiquetaEnlazada
    local hayDatos
	
	for i, id in pairs(ids) do
		hayDatos = true
		etiqueta = mw.wikibase.label   (id)
		enlace   = mw.wikibase.sitelink(id)
		etiquetaEnlazada = enlazarWikidata(enlace, etiqueta, id, {['enlace'] =  'sí'})
		
		if etiqueta and opciones.cursivas == 'sí' then
			etiquetaEnlazada  = "''" .. etiquetaEnlazada .. "''"
		end
		table.insert(idsFormateados, etiquetaEnlazada)
	end
	
	if hayDatos then
		return mw.text.listToText(idsFormateados, opciones.separador, opciones.conjuncion)
	end
end

function obtenerDatos(frame)
	if not frame then
		return
	end
	
	local frameParent = frame:getParent()
	local opciones    = elementoTabla(frame,'args') or elementoTabla(frameParent,'args') or {} -- Puede estar sin informar
	local idEntidad   = elementoTabla(frame,'args',1) or elementoTabla(frameParent,'args',1) -- Puede estar sin informar
	local entidad     = mw.wikibase.getEntityObject(idEntidad)
	
	if not entidad then -- Sin datos en Wikidata. No devolver nada
		return
	end
	
	local declaracionesAutores = elementoTabla(entidad,'claims','P1346') -- ganadores
	
	if not declaracionesAutores then
		return
	end
	
	local obras = {}	
	local k, declaracionAutor
	local fecha, idObra1, declaracionObras, precedido, sucedido
	local fechaWikidata
	local idAutor
	
	for k, declaracionAutor in pairs(declaracionesAutores) do
		fechaWikidata = elementoTabla(declaracionAutor,'qualifiers','P585',1)
		if fechaWikidata then
			fecha = formatoDatoWikidata (fechaWikidata,{['enlace'] = 'no', ['formatoTexto']='mayúscula'})
        	idObra1=elementoTabla(declaracionAutor,'qualifiers','P1686',1,'datavalue','value','id') or k
        	if not obras[fecha] then 
        		obras[fecha] = {}
        	end
        	if not obras[fecha][idObra1] then
        		obras[fecha][idObra1]         = {}
        		obras[fecha][idObra1].idAutores = {}
        		obras[fecha][idObra1].idObras   = {}
        		if opciones['países'] == 'sí' then
        			obras[fecha][idObra1].idPaises  = {}
        		end
        		obras[fecha][idObra1].referencias   = {}
        		obras[fecha][idObra1].orden = k
        	end

			idAutor = elementoTabla(declaracionAutor,'mainsnak','datavalue','value','id')
        	table.insert (obras[fecha][idObra1].idAutores, idAutor)
        	
			local referencia = nil
			urlReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P854',1,'datavalue','value')
			tituloReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P1476',1,'datavalue','value')
			if urlReferencia and tituloReferencia then
				sitioWebReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P248',1,'datavalue','value')
				fechaReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P577',1,'datavalue','value')
				urlArchivoReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P1065',1,'datavalue','value')
				fechaArchivoReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P2960',1,'datavalue','value')
				fechaAccesoReferencia = elementoTabla(declaracionAutor,'references',1,'snaks','P813',1,'datavalue','value')
				referencia = '<ref name="' .. tostring(urlReferencia) .. '">{{cita web|url=' .. tostring(urlReferencia)
				referencia = referencia .. '|título=' .. tostring(tituloReferencia.text)
				referencia = referencia .. (sitioWebReferencia and ('|sitioweb={{Label|' .. tostring(sitioWebReferencia.id)) .. '}}' or '')
				referencia = referencia .. (fechaReferencia and ('|fecha=' .. tostring(fechaReferencia.time)) or '')
				referencia = referencia .. (fechaAccesoReferencia and ('|fechaacceso=' .. tostring(fechaAccesoReferencia.time)) or '')
				referencia = referencia .. (fechaArchivoReferencia and ('|fechaarchivo=' .. tostring(fechaArchivoReferencia.time)) or '')
				referencia = referencia .. (urlArchivoReferencia and ('|urlarchivo=' .. tostring(urlArchivoReferencia)) or '')
				referencia = referencia .. '}}</ref>'
			end
        	obras[fecha][idObra1].referencias = referencia
        	
        	if opciones['países'] == 'sí' then
        		local entidadAutor = mw.wikibase.getEntityObject(idAutor)
        		local declaracionPais = elementoTabla(entidadAutor,'claims', 'P27')
        		
        		if declaracionPais then
        			for k,v in pairs(declaracionPais) do
        				insertar(obras[fecha][idObra1].idPaises, elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'id') )
        			end
        		end
        	end
    	
    		if elementoTabla(declaracionAutor,'qualifiers','P1686') then    
        		for j,declaracionObras in pairs(elementoTabla(declaracionAutor,'qualifiers','P1686')) do
	        		obras[fecha][idObra1].idObras[j] = elementoTabla(declaracionObras,'datavalue','value','id')
    	    	end
    		end
    	end
	end
	
	-- Cambiar la estructura para poder ordenar la tabla por fecha y 
	-- las obras en el mismo orden que aparecen en Wikidata
	local tabla2 = {}
	
	local datosFecha
	
	for fecha, obrasfecha in pairs(obras) do
		datosFecha       = {}
		datosFecha.fecha = fecha
		
		for k, obra in pairs(obrasfecha) do
			table.insert(datosFecha, obra)
		end
	
		ordenarTabla(datosFecha,{'orden'})
		table.insert(tabla2, datosFecha)
	end
	
	ordenarTabla(tabla2,{'fecha'})
	
	-- Añadir a la tabla el autor y el título de la obra premiada y 
	-- eliminar los identificadores

	local resultado              = {}
	resultado['etiquetaEntidad'] = elementoTabla(entidad,'labels','es','value') -- entidad['labels']['es']['value']
	
	local nuevaFecha, nuevaObra
	
	for j, obrasfecha in ipairs(tabla2) do
		nuevaFecha       = {}
		nuevaFecha.fecha = obrasfecha.fecha
		table.insert(resultado,nuevaFecha)
		
		for k, obra in ipairs(obrasfecha) do
			nuevaFecha.numeroGanadores = k
			nuevaObra        = {}
			nuevaObra.titulo = formatear2(obra['idObras']  , {['separador']=' / ', ['conjuncion'] = ' / ', ['cursivas'] = 'sí'})
			nuevaObra.autor  = formatear2(obra['idAutores'], {['separador']=', ',  ['conjuncion'] = ' y '})
			nuevaObra.referencia  = obra['referencias']
			
			if opciones['países'] == 'sí' then
				nuevaObra.pais   = formatear2(obra['idPaises'] , {['separador']=', ',  ['conjuncion'] = ' y '})
			end
			
			if nuevaObra.titulo and nuevaObra.autor then
				nuevaObra.tituloYAutor = nuevaObra.titulo .. ' de ' .. nuevaObra.autor
			else
				nuevaObra.tituloYAutor = nuevaObra.titulo or nuevaObra.autor
			end
			table.insert(nuevaFecha,nuevaObra)
		end
	end
	
	return resultado
end

-- Funciones externas

function z.navegacion(frame)
	local datos = obtenerDatos(frame)
	
	if not datos then
		return
	end
	
	local navegacion = {['title']='Obras ganadoras del ' .. datos['etiquetaEntidad'],
		['listclass']='hlist',
		}
	local listaGrupo  = {}
	local numeroGrupo = 0
	local decadaGrupo -- ejemplo 201
	local primeraFechaGrupo
	local ultimaFechaGrupo
	local decada
	
	for j,v in ipairs(datos) do
		decada  = tostring(v.fecha):sub(1,3)
		if decada ~= decadaGrupo then
			-- Para el grupo anterior
			if numeroGrupo ~= 0 then
				navegacion['group' .. numeroGrupo]  = primeraFechaGrupo .. '-' .. ultimaFechaGrupo
				navegacion['list'  .. numeroGrupo]  = '<ul>' .. table.concat(listaGrupo) .. '</ul>'
			end
			-- Para el nuevo grupo
			listaGrupo  = {}
			numeroGrupo = numeroGrupo + 1
			decadaGrupo = decada
			primeraFechaGrupo = v.fecha
		end
		
		ultimaFechaGrupo = v.fecha
		
		for k,w in ipairs(v) do
			if w.tituloYAutor then
				if v.numeroGanadores == 1 then
					table.insert(listaGrupo, '<li>'.. w.tituloYAutor .. ' (' .. v.fecha .. ')</li>')
				else
					table.insert(listaGrupo, '<li>'.. w.tituloYAutor .. ' (' .. v.fecha .. ', ex aequo)</li>')
				end
			end
		end
	end
		
	-- Para el último grupo
	if numeroGrupo ~= 0 then
		navegacion['group' .. numeroGrupo]  = primeraFechaGrupo .. '-' .. ultimaFechaGrupo
		navegacion['list'  .. numeroGrupo]  = '<ul>' .. table.concat(listaGrupo) .. '</ul>'
	end
	
	return navbox(navegacion)
end

function z.tabla(frame)
	local opciones = elementoTabla(frame,'args') or elementoTabla(frameParent,'args') or {}
	local datos    = obtenerDatos(frame)
	local tabla    = {}
	
	if not datos then
		return
	end
	
	local celdaPais
	local celdaReferencia

	for j,v in ipairs(datos) do -- Por cada año
		for k,w in ipairs(v) do -- Por cada obra ganadora
			if opciones['países'] == 'sí' then
				celdaPais = '<td>' .. (w.pais or '') .. '</td>'
			else
				celdaPais = ''
			end
			if opciones['referencias'] == 'sí' then
				celdaReferencia = w.referencia and frame:preprocess('<td>' .. w.referencia .. '</td>') or '<td></td>'
			else
				celdaReferencia = ''
			end
			if v.numeroGanadores == 1 then
				table.insert(tabla, '<tr><td>'.. v.fecha .. '</td><td>' .. (w.titulo or '') .. '</td><td>' .. (w.autor or '') .. '</td>' .. celdaPais .. celdaReferencia .. '</tr>')
			elseif k == 1 then
				table.insert(tabla, '<tr><td rowspan=' .. v.numeroGanadores .. '>'.. v.fecha .. "<br /><small>''Ex-aequo''</small></td><td>"  .. (w.titulo or '') .. '</td><td>' .. w.autor .. '</td>' .. celdaPais .. celdaReferencia .. '</tr>')
			else
				table.insert(tabla, '<tr><td>' .. (w.titulo or '') .. '</td><td>' .. w.autor .. '</td>' .. celdaPais .. celdaReferencia .. '</tr>')
			end
		end
	end
	
	return [[<table class="sortable wikitable" width="75%" cellpadding="5" style="margin: 1em auto 1em auto">
	 <tr>
    	<th>Año</th>
    	<th>Título</th>
		<th>Autor</th>]]
		.. (opciones['países'] == 'sí' and "<th>País</th>" or "")
		.. (opciones['referencias'] == 'sí' and "<th>Ref.</th>" or "") ..
	[[</tr>]] .. table.concat(tabla) .. '</table>'
end

return z