-- Modulo per implementare le funzionalità di template:Interprogetto
require('Module:No globals')
local p = {} -- per l'esportazione delle funzioni del modulo  
local cfg = mw.loadData('Module:Interprogetto/Configurazione')
local root = mw.html.create('') -- radice del markup html
local debug = {} -- per debug
local categories = {} -- categorie di errore da aggiungere
local errors_msg = {} -- messaggi di errore da aggiungere  
-- ============================================================================================================
-- Ritorna la stringa se è definita e diversa da stringa vuota, altrimenti nil
-- ============================================================================================================
local function is_defined(s)
if s and s ~= '' then
return s
else
return nil
end
end  
-- ============================================================================================================
-- Aggiunge uno spazio alla stringa se non termina per "'" (apostrofo)
-- ============================================================================================================
local function add_space(s)
if not is_defined(s) then
return ''
elseif mw.ustring.sub(s, -1) == "'" then
return s
else
return s .. ' '
end
end  
-- ============================================================================================================
-- Aggiunge la categoria "category" alla lista di categorie da aggiungere alla voce
-- ============================================================================================================
local function add_category(category)
if category then
categories[category] = true
end
end  
-- ============================================================================================================
-- Aggiunge il messaggio di errore "error_msg" alla lista di messaggi di errore da visualizzare.
-- Se viene precisata una categoria di errore la aggiunge alle categorie in cui inserire la voce,
-- altrimenti inserisce la categoria di errore standard
-- ============================================================================================================
local function add_error(error_msg, category)
if error_msg then
errors_msg[#errors_msg+1] = error_msg
if category then
add_category(category)
else
add_category('Errori di compilazione del template Interprogetto')
end
end
end  
-- ============================================================================================================
-- Ritorna un collegamento di default dato il nome di un progetto, nil in caso di errori
-- ============================================================================================================
local function get_default_collegamento(key_progetto, fullpagename)
if cfg.parameters[key_progetto] then
if cfg.parameters[key_progetto]['collegamento_non_esistente'] then
add_error(cfg.parameters[key_progetto]['collegamento_non_esistente'])
return nil
elseif cfg.parameters[key_progetto].collegamento_default_minuscolo then
return mw.ustring.gsub(fullpagename, '^%u', string.lower)
else
return fullpagename
end
else
return nil
end
end  
-- ============================================================================================================
-- Ordina una tabella in funzione della chiave "ordine" degli elementi della tabella
-- ============================================================================================================
local function sort_by_ordine(t1, t2)
if t1.ordine < t2.ordine then
return true
end
end  
-- ============================================================================================================
-- Classe per gestire la raccolta di informazioni da Wikidata
-- ============================================================================================================
local Wikidata_entity = {}  
function Wikidata_entity:new
-- Carica i dati da Wikidata se esistono
local self = {}
self.entity = nil
if mw.wikibase then
self.entity = mw.wikibase.getEntityObject
end
setmetatable(self, { __index = Wikidata_entity,
__tostring = function(t) return self:__tostring end })
self.collegamenti = {}
self.badge = {}
self:loadCollegamenti
-- Imposta il corsivo se la pagina su Wikidata ha la proprietà P31 ("Istance of", wikidata:Property:P31)
-- con valore corrispondente a un'opera, come definito in cfg.check_opera
self.corsivo = self:hasPropertyValue('P31', cfg.check_opera)
-- Considera disambigua se la pagina su Wikidata ha la proprietà P31 ("Istance of", wikidata:Property:P31)
-- con valore 4167410 ("Wikimedia disambiguation page", wikidata:Q4167410)
self.disambigua = self:hasPropertyValue('P31', '4167410')
return self
end  
function Wikidata_entity:getLabel(label)
if self.entity then
return self.entity:getLabel(label)
else
return nil
end
end  
-- ============================================================================================================
-- Carica collegamenti e badge da Wikidata controllando i progetti elencati in cfg.automatic_link
-- ============================================================================================================
function Wikidata_entity:loadCollegamenti
if self.entity then
for key_progetto, progetto in pairs(cfg.automatic_link) do
-- Carica i collegamenti di un progetto solo se non disambigua o tipo di progetto abilitato in disambigua
if not self.disambigua or cfg.progetti[key_progetto].abilita_in_disambigua then
local sitelink = self.entity:getSitelink(progetto.interwiki)
if sitelink then
self.collegamenti[key_progetto] = sitelink
if self.entity.sitelinks[progetto.interwiki].badges then
local badge_class = {}
local badge_title = {}
for _, badge_quality in ipairs(self.entity.sitelinks[progetto.interwiki].badges) do
if cfg.badges[badge_quality] then
badge_class[#badge_class+1] = cfg.badges[badge_quality].class
badge_title[#badge_title+1] = cfg.badges[badge_quality].title
end
end
self.badge[key_progetto] = {}
self.badge[key_progetto].class = table.concat(badge_class, ' ' )
self.badge[key_progetto].title = table.concat(badge_title, ', ' )
end
elseif progetto.property_category then
local property_id = progetto.property_category
if self.entity.claims
and self.entity.claims[property_id]
and self.entity.claims[property_id][1]
and self.entity.claims[property_id][1].mainsnak
and self.entity.claims[property_id][1].mainsnak.datavalue
and self.entity.claims[property_id][1].mainsnak.datavalue.type == 'string' then
self.collegamenti[key_progetto] = 'Category:' .. self.entity.claims[property_id][1].mainsnak.datavalue.value
end
end
end
end
end
end  
-- ============================================================================================================
-- Verifica se una determinata proprietà ha uno dei valori specificati nella lista "values".
-- Riadattata da "hasPropertyValue" su wikiquote:it:Modulo:Interprogetto a sua volta
-- riadattata da "instanceof(arg)" su wikisource:it:Modulo:Autore
-- ============================================================================================================
function Wikidata_entity:hasPropertyValue(propertyId, values)
if self.entity and self.entity.claims and self.entity.claims[propertyId] then
local claims = self.entity.claims[propertyId]
for _, claim in pairs(claims) do
if claim and claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
local datavalue = claim.mainsnak.datavalue
if datavalue.type == 'wikibase-entityid' then
if datavalue.value['entity-type'] == 'item' then
if type(values) == 'table' then
if values[tostring(datavalue.value['numeric-id'])] then
return true
end
elseif values == tostring(datavalue.value['numeric-id']) then
return true
end
end
end
end
end
end
return false
end
-- ============================================================================================================
-- Fine definizione della classe Wikidata_entity
-- ============================================================================================================