Modulo:Collegamenti esterni: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Gestione url archiviati per proprietà di tipo URL. Supporto configurazione titolo anche quando c'è il qualificatore titolo
ricorsione nella ricerca dei vincoli, vedi discussione
Riga 27:
local catEmpty = 'Voci con template Collegamenti esterni senza dati da Wikidata'
local catUnknownQual = 'Voci con template Collegamenti esterni e qualificatori sconosciuti'
local catExcessiveLoad = 'Voci con template Collegamenti esterni e molte entità Wikidata caricate'
 
-- =============================================================================
Line 73 ⟶ 74:
 
-- Restituisce true se l'elemento collegato alla pagina o quello specificato in from
-- ha tra i valori (o loro sottoclassi) della proprietà indicata uno degli elementi specificati.
-- Restituisce come secondo valore una tabella con gli ID delle entità caricate ai fini della ricerca.
-- @param {string} prop - codice della proprietà 'Pxxx'
-- @param {table} [entityIds] - array dei valori (strighe 'Qxxx') che può avere
-- @param {string} from
-- @return {boolean}
-- @return {table}
local function checkEntity(prop, entityIds, from)
local args = { from = from, recursion = 8 }
for _, entityId in ipairs(entityIds) do
table.insert(args, entityId)
Line 304 ⟶ 307:
local ret, groupSites = {}, {}
local cfg = readConfig()
local loadedEntities = setmetatable({}, {
__newindex = function(t1, key, t2)
if not t2 then return end
for k, v in pairs(t2) do rawset(t1, k, v) end
end })
for _, groupName in ipairs(orderedGroupNames) do -- Per ogni gruppo tematico
groupSites[groupName] = {}
Line 312 ⟶ 320:
end
for _, linkConf in ipairs(cfg[groupName]) do -- Per ogni sito configurato
local claims, valido = true
-- se il sito non è escluso manualmente dall'utente, avviene la lettura da Wikidata
-- controlla se è un sito da escludere per soggetto non pertinente
if not (self:_Escluso(linkConf.pid, self.soloprop) or self:_Escluso(mw.getContentLanguage():ucfirst(linkConf.medium or 'web'), self.solomedium)) then
if type(linkConf.vincolo) == 'table' then
claims = mWikidata._getClaims(linkConf.pid, { from = self.from })
valido = false
local Nvincoli = 0
for _, _ in ipairs(linkConf.vincolo) do Nvincoli = Nvincoli + 1 end
for i = 2, Nvincoli, 2 do -- Per ogni coppia 'proprietà', {valori}
valido = valido or checkEntity(linkConf.vincolo[i - 1], linkConf.vincolo[i], self.from)
end
end
-- controlla se èci unsono sito escluso manualmente dall'utentevalori
if claims and #claims > 0 then
if self:_Escluso(linkConf.pid, self.soloprop) or self:_Escluso(mw.getContentLanguage():ucfirst(linkConf.medium or 'web'), self.solomedium) then
-- controlla se è un sito da escludere per soggetto non pertinente
valido = false
if type(linkConf.vincolo) == 'table' then
local Nvincoli = 0
for _ in ipairs(linkConf.vincolo) do Nvincoli = Nvincoli + 1 end
for i = 2, Nvincoli, 2 do -- Per ogni coppia 'proprietà', {valori}
valido, loadedEntities[i] = checkEntity(linkConf.vincolo[i - 1], linkConf.vincolo[i], self.from)
if valido then break end
end
else
valido = true
end
end
-- Sese il sito è abilitato, avvieneviene laaggiunto letturaa quelli da Wikidatamostrare
if valido then
local url, qualifier, extraConf
local Nqualtitoli = 0
-- Qualificatori generali
local claims = mWikidata._getClaims(linkConf.pid, { from = self.from, snaktype = 'value' })
-- In caso di valori multipli, il titolo viene letto per tutti; gli altri qualificatori solo per il primo (altrimenti bisogna rivedere la formattazione dei valori multipli)
-- Qui, se ci sono valori, il sito viene aggiunto a quelli da mostrare
-- Ricordarsi di elencare i qual. generali anche in altriQualNoti
if claims and #claims > 0 then
extraConf = {}
-- Qualificatori generali
extraConf.autore = mWikidata._formatQualifiers(claims[1], 'P50') or mWikidata._formatQualifiers(claims[1], 'P2093') -- come item o stringa
-- In caso di valori multipli, il titolo viene letto per tutti; gli altri qualificatori solo per il primo (altrimenti bisogna rivedere la formattazione dei valori multipli)
extraConf.volume = mWikidata._formatQualifiers(claims[1], 'P478')
-- Ricordarsi di elencare i qual. generali anche in altriQualNoti
extraConf.pagina = {}mWikidata._formatQualifiers(claims[1], 'P304')
extraConf.autoredata = mWikidata._formatQualifiers(claims[1], 'P50P577') or mWikidata._formatQualifiers(claims[1], 'P2093') -- come item o stringa
extraConf.volumetitolo = mWikidata._formatQualifiers(claims[1], 'P478'){}
extraConf.paginaarchivio = mWikidata._formatQualifiers(claims[1], 'P304'){}
extraConf.datadataarch = mWikidata._formatQualifiers(claims[1], 'P577'){}
extraConf.titolourlmorto = {}
for i, claim in ipairs(claims) do
extraConf.archivio = {}
extraConf.titolo[i] = mWikidata._formatQualifiers(claim, 'P1476') or mWikidata._formatQualifiers(claim, 'P1810') or mWikidata._formatQualifiers(claim, 'P1932') or mWikidata._formatQualifiers(claim, 'P742') -- titolo o "indicato come" o "riferito come" o pseudonimo
extraConf.dataarch = {}
if extraConf.urlmortotitolo[i] then Nqualtitoli = {}Nqualtitoli + 1 end
-- url archiviato, solo per le proprietà di tipo URL
for i, claim in ipairs(claims) do
extraConf.titoloarchivio[i] = mWikidata._formatQualifiers(claim, 'P1476P1065') or mWikidata._formatQualifiers(claim, 'P1810') or mWikidata._formatQualifiers(claim, 'P1932') or mWikidata._formatQualifiers(claim, 'P742') -- titolo o "indicato come" o "riferito come" o pseudonimo
if extraConf.titolodataarch[i] then Nqualtitoli = Nqualtitoli + 1mWikidata._formatQualifiers(claim, end'P2960')
extraConf.urlmorto[i] = mWikidata._formatQualifiers(claim, 'P582') or mWikidata._formatQualifiers(claim, 'P582', { snaktype = 'somevalue' })
-- url archiviato, solo per le proprietà di tipo URL
end
extraConf.archivio[i] = mWikidata._formatQualifiers(claim, 'P1065')
-- Uno o più url ed eventuali qualificatori per distinguerli
extraConf.dataarch[i] = mWikidata._formatQualifiers(claim, 'P2960')
url = {}
extraConf.urlmorto[i] = mWikidata._formatQualifiers(claim, 'P582') or mWikidata._formatQualifiers(claim, 'P582', { snaktype = 'somevalue' })
for i, claim in ipairs(claims) do
end
if claim.qualifiers then
-- Uno o più url ed eventuali qualificatori per distinguerli
local qualifierIds = ParametroElenco(linkConf.multi)
url = {}
for iqualifierId, claim_ in ipairspairs(claimsqualifierIds) do
if claim.qualifiers[qualifierId] then
local formattedQualifier = mWikidata._formatQualifiers(claim, qualifierId, { nq = '1', formatting = 'raw' })
local qualifierIds = ParametroElenco(linkConf.multi)
if formattedQualifier then
for qualifierId, _ in pairs(qualifierIds) do
if claim.qualifiers[qualifierId]not qualifier then qualifier = {} end
qualifier[i] = mw.wikibase.getLabel(formattedQualifier)
local formattedQualifier = mWikidata._formatQualifiers(claim, qualifierId, { nq = '1', formatting = 'raw' })
if formattedQualifier then
if not qualifier then qualifier = {} end
qualifier[i] = mw.wikibase.getLabel(formattedQualifier)
break
end
end
end
local altriQualNoti = {P407 = true, P50 = true, P2093 = true, P1476 = true, P1810 = true, P1932 = true, P742 = true, P577 = true, P478 = true, P304 = true, P813 = true, P1065 = true, P2960 = true, P582 = true}
for qualifierId in pairs(claim.qualifiers) do
if qualifierIds[qualifierId] ~= true and altriQualNoti[qualifierId] ~= true then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catUnknownQual))
break
end
end
end
local altriQualNoti = {P407 = true, P50 = true, P2093 = true, P1476 = true, P1810 = true, P1932 = true, P742 = true, P577 = true, P478 = true, P304 = true, P813 = true, P1065 = true, P2960 = true, P582 = true}
-- crea l'url
claimfor =qualifierId mWikidata._formatStatementin pairs(claim.qualifiers) do
if qualifierIds[qualifierId] ~= true and altriQualNoti[qualifierId] ~= true then
if linkConf.url then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catUnknownQual))
-- se proprietà di tipo id, il valore viene sotituito a "$1"
break
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
end
end
table.insert(url, claim)
end
-- nomecrea sito, di default il dominio estratto dalll'url
claim = mWikidata._formatStatement(claim)
extraConf.sito = linkConf.sito or getDomain(linkConf.url)
if linkConf.url then
-- Creazione dell'oggetto collegamento esterno, con l'url (o gli url) e gli altri dati raccolti
-- se proprietà di tipo id, il valore viene sotituito a "$1"
table.insert(ret[groupName], ExtLink:new(url, qualifier, linkConf, extraConf, self.from))
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
-- categoria per proprietà letta; se multipla e indistinguibile, usa categoria di avviso
end
local tail = #url > 1 and linkConf.url and (qualifier == nil or #qualifier ~= #url) and (Nqualtitoli < #url - 1) and
table.insert(url, claim)
catMultiSenzaQual or catLetta
table.insert(self.categories, string.format('[[%sCategoria:%s%s]]', self.catColon, linkConf.pid, tail))
-- per verificare se un sito è ripetuto nel gruppo
groupSites[groupName][extraConf.sito] = (groupSites[groupName][extraConf.sito] or 0) + 1
-- conteggio complessivo dei collegamenti
self.numExtLinks = self.numExtLinks + 1
end
-- nome sito, di default il dominio estratto dall'url
extraConf.sito = linkConf.sito or getDomain(linkConf.url)
-- Creazione dell'oggetto collegamento esterno, con l'url (o gli url) e gli altri dati raccolti
table.insert(ret[groupName], ExtLink:new(url, qualifier, linkConf, extraConf, self.from))
-- categoria per proprietà letta; se multipla e indistinguibile, usa categoria di avviso
local tail = #url > 1 and linkConf.url and (qualifier == nil or #qualifier ~= #url) and (Nqualtitoli < #url - 1) and
catMultiSenzaQual or catLetta
table.insert(self.categories, string.format('[[%sCategoria:%s%s]]', self.catColon, linkConf.pid, tail))
-- per verificare se un sito è ripetuto nel gruppo
groupSites[groupName][extraConf.sito] = (groupSites[groupName][extraConf.sito] or 0) + 1
-- conteggio complessivo dei collegamenti
self.numExtLinks = self.numExtLinks + 1
end
end
Line 410 ⟶ 419:
end
end
-- categoriecategoria di servizio sul numero di link
local catnumero
if self.numExtLinks == 0 then
Line 420 ⟶ 429:
if catnumero then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catnumero))
end
-- categoria di servizio sul numero di entità caricate
if #loadedEntities > 100 then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catExcessiveLoad))
end
return ret