Módulo:Obras ganadoras
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:
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:
- Si se utiliza el parámetro opcional países, por ejemplo en el Premio Hugo a la mejor novela:
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