Módulo:Zona de pruebas/Juan Mayordomo/Obras ganadoras

De Wikipedia, la enciclopedia libre
Este módulo no tiene página de documentación[crear]
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