La documentazione per questo modulo può essere creata in Modulo:Opera/man

-- elemento su Wikidata
local item = mw.wikibase.getEntityObject()
local a = require('Modulo:Autore')
local g = require('Modulo:Genere')
local c = require('Modulo:Common')
local d = require('Modulo:Date')
local p = {}


local outputCat = '' --le categorie le metto qui, per tenerle separate e metterle poi in fondo al testo generato
function addCat(name)
	if name and c.isNSOpera() then
		outputCat = outputCat .. c.category(mw.text.trim(name))
	end
end

--funzione che recupera i dati dell'opera
--l'idea è di richiamarla anche da fuori dell'opera, passando l'item corrispondente
function p.getDatiOpera(operaItem)
	item = operaItem or item
	c.setItem(item)
	dati = {}
	
	--il titolo è il titolo della pagina
	dati.titolo = mw.title.getCurrentTitle().text
	--togli " (Nome Autore)"
	dati.titolo = string.gsub(dati.titolo, ' %(.*%)', '')
	
	--titolo originale dell'opera (P357 e' la vecchia proprieta' deprecata, ma ancora in uso su molti item)
	dati.titoloOriginale = c.getClaimValue(c.getSingleClaimByProperty('P1476')) or c.getClaimValue(c.getSingleClaimByProperty('P357'))
	
	--sottotitolo dell'opera
	dati.sottotitolo = c.getClaimValue(c.getSingleClaimByProperty('P1680'))
	
	--autore
	dati.autori = c.getClaimValuesByProperty('P50')
	dati.autoriList = c.getListaAutori(dati.autori)
	dati.autore = c.getLinksAutori(dati.autori)
	dati.autoriString = c.concat(dati.autoriList, '/')
	
	--genere
	dati.genere = string.lower(c.concat(c.getLabelsFromPropertyValues('P136'), ', '))
	
	--lingua originale (364 è la vecchia property deprecata)
	lingua = c.getClaimValue(c.getSingleClaimByProperty('P407')) or c.getClaimValue(c.getSingleClaimByProperty('P364'))
	
	--volgare toscano -> lingua italiana
	if lingua and lingua['numeric-id'] == 1990745 then lingua['numeric-id'] = 652 end
	--greco omerico -> greco antico TODO trovare un sistema migliore!
	if lingua and lingua['numeric-id'] == 990062 then lingua['numeric-id'] = 35497 end
	--spagnolo medio -> spagnolo
	if lingua and lingua['numeric-id'] == 5364419 then lingua['numeric-id'] = 1321 end
	--early modern english -> inglese
	if lingua and lingua['numeric-id'] == 1472196 then lingua['numeric-id'] = 1860 end
	
	dati.lingua = c.getLabelFromValue(lingua)
	
	--pubblicazione
	dati.pubblicazione = d.getAllDates('P577')
	
	--composizione
	dati.composizione = d.getAllDates('P571')
	
	--secolo di composizione/pubblicazione
	dates = d.getDatesFromProperty('P571')
	if c.empty(dates) then dates = d.getDatesFromProperty('P577') end
	dataComune = d.getCommonDate(dates)
	dati.secolo = dataComune and dataComune.century and d.formatCentury(dataComune)
	
	--luogo di composizione TODO riportare il valore del qualificatore P276 (luogo) contenuto nella proprietà P571 (data di fondazione)
	claim = c.getClaimValue(c.getClaimValuesByProperty('P571'))
	dati.LuogoComp = c.concat(c.getQualifierValueFromClaim(claim), ', ')

	--main subject
	dati.argomento = c.getLabelsFromPropertyValues('P921')
		
	--movement
	dati.movimento = c.getLabelsFromPropertyValues('P135')
	
	--fa parte di
	dati.ParteOpere = c.getClaimValuesByProperty('P361')
	dati.ParteOpera = c.getLinksParteOpere(dati.ParteOpere)
	
	--incipit dell'opera
	dati.incipit = c.getClaimValue(c.getSingleClaimByProperty('P1922'))
	
	--series P179
	--follows P155
	--followed by P156
	
	--link ai progetti
	wpLang, wpLink = c.wikipedia()
	dati.wikipedia = wpLink
	dati.wikipediaLang = wpLang
	dati.wikiquote = c.wikiquote()
	dati.wikibooks = c.wikibooks()
        dati.wikiversity = c.wikiversity()
	dati.commons = c.commons()
	dati.commonscat = c.commonscat()
	if item then
		dati.wikidata = item.id
	end
	
	--immagine
	dati.immagine = c.getSingleClaimValueByProperty('P18')
	
	--edizioni
	dati.edizioni = c.getClaimValuesByProperty('P747')
	
	--TODO filtrare solo le edizioni con "language of work" P407 = Italian
	dati.edizioniItaliane = ''
	
	dati.edizioniLista = ''
	for k, edizione in pairs(dati.edizioni) do
		dati.edizioniLista = dati.edizioniLista .. '\n* ' .. c.getWikiLinkFromValue(edizione)
	end
	
	--leggo da genereItem la property 910 "topic's main category" e prendo il sitelink it per usarlo come categoria
	genereValue = c.getClaimsByProperty('P136')
	if genereValue then
		for j, k in pairs(genereValue) do
			local gen = c.getClaimValue(k);
			if gen then
				genereItem = mw.wikibase.getEntityObject('Q'..gen['numeric-id'])
				datiGenere = g.getDatiGenere(genereItem)
				dati.linkCategoriaGenere = datiGenere.categoriaLink
			end
		end
	end
	
	return dati
end

function p.opera(frame)
	--mw.log(c.printElement(item))
	
	--recupero i dati con cui popolare il box
	datiOpera = p.getDatiOpera()
	datiAutore = {}
	
	--recupera i dati dell'autore
	--TODO gestire i casi di autori multipli
	if datiOpera.autori and #datiOpera.autori == 1 then
		autoreItem = mw.wikibase.getEntityObject('Q'..datiOpera.autori[1]['numeric-id'])
		datiAutore = a.getDatiAutore(autoreItem)
	end
	
	dati = c.mergeTables(datiOpera, datiAutore, '', 'Autore-')
	
	mw.log('Argomenti di Opera/Box')
	mw.log(c.printElement(dati))

	output = c.template('Opera/Box', dati)
	
	-- CATEGORIE
	addCat('Opere')
	
	--Opere del secolo
	if (dati.secolo) then 
		addCat('Opere del '..dati.secolo) 
	else
		addCat('Opere non datate')
	end
	
	--Opere di Autore
	if c.empty(dati.autoriList) then
		addCat('Opere di autore anonimo')
	else
		for k, autore in pairs(dati.autoriList) do addCat('Opere di ' .. autore) end
	end
	
	--Opere originariamente in Lingua
	if dati.lingua then 
		addCat('Opere originariamente in '..dati.lingua) 
	else
		addCat('Opere senza lingua originale su Wikidata')
	end
	
	--categorie per edizioni
	if #dati.edizioni > 1 then addCat('Opere con edizioni multiple')
	elseif #dati.edizioni == 1 then addCat('Opere con una sola edizione')
	else addCat('Opere senza edizioni') end
	
	--categorie per argomenti e movimenti artistici
	for k, arg in pairs(dati.argomento) do addCat(arg) end
	for k, mov in pairs(dati.movimento) do addCat(mov) end
	
	
	-- OPERE SENZA ELEMENTO SU WIKIDATA
	if not item then
		addCat('Opere non collegate a Wikidata')
	end
	
	--ordinamento di default
	output = output .. c.template('DEFAULTSORT', {titolo} )
	
	return output .. outputCat
end

return p