Módulo:Obras ganadoras
Ir a la navegación
Ir a la búsqueda
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: Plantilla:Ayuda propiedad
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].orden = k end idAutor = elementoTabla(declaracionAutor,'mainsnak','datavalue','value','id') table.insert (obras[fecha][idObra1].idAutores, idAutor) 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 '}) 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 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 -- 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 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 v.numeroGanadores == 1 then table.insert(tabla, '<tr><td>'.. v.fecha .. '</td><td>' .. (w.titulo or '') .. '</td><td>' .. w.autor .. '</td>' .. celdaPais .. '</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 .. '</tr>') else table.insert(tabla, '<tr><td>' .. (w.titulo or '') .. '</td><td>' .. w.autor .. '</td>' .. celdaPais .. '</tr>') end end end if opciones['países'] == 'sí' then 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> <th>País</th> </tr>]] .. table.concat(tabla) .. '</table>' else 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> </tr>]] .. table.concat(tabla) .. '</table>' end end return z