Modulo:Collegamenti esterni: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
miglioro la performance e aggiungo categoria di servizio temporanea su richiesta
citazioni separate a stesso sito in presenza di determinati qualificatori come da discussione; riscrivo e semplifico alcune parti
Riga 28:
local catUnknownQual = 'Voci con template Collegamenti esterni e qualificatori sconosciuti'
local catExcessiveLoad = 'Voci con template Collegamenti esterni e molte entità Wikidata caricate'
local catDuplicates = 'Voci con template Collegamenti esterni e doppioni disattivati'
 
-- =============================================================================
Riga 114 ⟶ 115:
--
-- @param {table} [url] - uno o più URL, quanti sono i valori della proprietà Wikidata
-- @param {table} [qualifier] - eventuali qualificatori da annettere al titolo per ciascun URL
-- @param {table} linkConf - la configurazione fissa per questo collegamento esterno
-- @param {table} extraConf - altri elementi di configurazione ricavati dall'item
-- @param {string} from - entityId se diverso da quello collegato alla pagina corrente
-- @return {table} un nuovo oggetto ExtLink
function ExtLink:new(url, qualifier, linkConf, extraConf, from)
local self = {}
setmetatable(self, { __index = ExtLink })
 
-- sostituisce eventuali spazi con %20
for i = 1, #url do
url[i] = url[i]:gsub(' ', '%%20')
end
self.url = url
self.qualifier = #url > 1 and qualifier
self.linkConf = linkConf
self.extraConf = extraConf
Riga 135 ⟶ 130:
self.title = self.from and mWikidata._getLabel({ self.from }) or self.title
self.extraConf.medium = self.linkConf.medium or 'web'
 
return self
end
Riga 147 ⟶ 142:
titolo = self.linkConf.titolo:gsub('$1', titolo)
end
if #self.qualifierurl > 1 and self.qualifierextraConf.titolodis[1] ~= nil then
return string.format('%s (%s)', titolo, self.qualifierextraConf.titolodis[1])
else
return titolo
Riga 159 ⟶ 154:
-- @return {table}
function ExtLink:_getAltriLink()
if self.extraConf.restrictedData then return end
local tbl = {}
local titolo, specifica
for i = 2, #self.url do
titolo = self.extraConf.titolo[i] or self.title
if self.qualifier and selfextraConf.qualifiertitolodis[i] ~= nil then
specifica = self.qualifierextraConf.titolodis[i]
else
local ripetuto = false -- controllo se stesso titolo già usato
Riga 223 ⟶ 219:
-- se è specificato l'URL di formattazione è una
-- proprietà di tipo "identificativo esterno" altrimenti di tipo URL
if not self.linkConf.url then
return '* ' .. mCitazione.cita_da_moduloself:_formatPropertyURL()
end
local formattedLinks = {}
for i = 1, self.extraConf.restrictedData and #self.url or 1 do
local formattedLink = mCitazione.cita_da_modulo(
self.extraConf.medium,
{
url = self.url[1i],
titolo = self:_getTitolo(),
altrilink = self:_getAltriLink(),
Riga 234:
editore = self.linkConf.editore,
lingua = self.linkConf.lingua,
cid = self.extraConf.restrictedData and self.extraConf.cid[i] or self.linkConf.cid,
autore = self.linkConf.autore or self.extraConf.autore[i],
volume = self.extraConf.volume[i],
p = self.extraConf.pagina[i],
data = self.linkConf.data or self.extraConf.data[i],
tipo = self.linkConf.tipo or self.sitodis
})
}) .. mEditAtWikidata._showMessage({ pid = self.linkConf.pid, qid = self.from })
table.insert(formattedLinks, '* ' .. formattedLink ..
else
mEditAtWikidata._showMessage({ pid = self.linkConf.pid, qid = self.from }))
return self:_formatPropertyURL()
end
return table.concat(formattedLinks, '\n')
end
 
Riga 305 ⟶ 306:
-- @return {table}
function LinksManager:_getExtLinks()
local duplicates = false -- per cat temporanea
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 })
local lang = mw.language.getContentLanguage()
local pageContent = mw.title.getCurrentTitle():getContent()
Riga 318 ⟶ 313:
:gsub('<[Rr][Ee][Ff]%s.-/>', '') -- facilita la ricerca successiva
:gsub('<[Rr][Ee][Ff].->.-</[Rr][Ee][Ff]%s*>', '')
local loadedEntities = setmetatable({}, {
for _, groupName in ipairs(orderedGroupNames) do -- Per ogni gruppo tematico
__newindex = function(t1, key, t2)
if not t2 then return end
for k, v in pairs(t2) do rawset(t1, k, v) end
end })
-- tabella di conversione per tipo dei qualificatori generali in ordine di priorità
local convert = {
autore = { 'P50', 'P2093' }, -- item o stringa dell'autore
volume = { 'P478' }, pagina = { 'P304' }, data = { 'P577' },
-- titolo o "indicato come" o "riferito come" o pseudonimo
titolo = { 'P1476', 'P1810', 'P1932', 'P742' },
-- url archiviato, solo per le proprietà di tipo URL
archivio = { 'P1065' }, dataarch = { 'P2960' }, urlmorto = { 'P582' }
}
-- qualificatori noti (quelli nella tabella convert sono pescati in automatico)
local knownQualifiers = { P407 = true, P813 = true }
for _, t in pairs(convert) do
for _, v in ipairs(t) do knownQualifiers[v] = true end
end
local duplicates = false -- per categoria temporanea
for _, groupName in ipairs(orderedGroupNames) do -- per ogni gruppo tematico
groupSites[groupName] = {}
ret[groupName] = {}
Riga 325 ⟶ 340:
cfg[groupName] = {}
end
for _, linkConf in ipairs(cfg[groupName]) do -- Perper ogni sito configurato
local claims, valido
-- se il sito non è escluso manualmente dall'utente e non è generato da
Riga 355 ⟶ 370:
local Nvincoli = 0
for _ in ipairs(linkConf.vincolo) do Nvincoli = Nvincoli + 1 end
for i = 2, Nvincoli, 2 do -- Perper ogni coppia 'proprietà', {valori}
valido, loadedEntities[i] = checkEntity(linkConf.vincolo[i - 1], linkConf.vincolo[i], self.from)
if valido then break end
Riga 365 ⟶ 380:
-- se il sito è abilitato, viene aggiunto a quelli da mostrare
if valido then
local url, qualifier,= extraConf{}
local NqualtitoliextraConf = { cid = {}, titolodis = { count = 0 } }
-- Qualificatoriper generaliogni dichiarazione
-- 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)
-- Ricordarsi di elencare i qual. generali anche in altriQualNoti
extraConf = {}
extraConf.autore = mWikidata._formatQualifiers(claims[1], 'P50') or mWikidata._formatQualifiers(claims[1], 'P2093') -- come item o stringa
extraConf.volume = mWikidata._formatQualifiers(claims[1], 'P478')
extraConf.pagina = mWikidata._formatQualifiers(claims[1], 'P304')
extraConf.data = mWikidata._formatQualifiers(claims[1], 'P577')
extraConf.titolo = {}
extraConf.archivio = {}
extraConf.dataarch = {}
extraConf.urlmorto = {}
for i, claim in ipairs(claims) do
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
if extraConf.titolo[i] then Nqualtitoli = Nqualtitoli + 1 end
-- url archiviato, solo per le proprietà di tipo URL
extraConf.archivio[i] = mWikidata._formatQualifiers(claim, 'P1065')
extraConf.dataarch[i] = mWikidata._formatQualifiers(claim, 'P2960')
extraConf.urlmorto[i] = mWikidata._formatQualifiers(claim, 'P582') or mWikidata._formatQualifiers(claim, 'P582', { snaktype = 'somevalue' })
end
-- Uno o più url ed eventuali qualificatori per distinguerli
url = {}
for i, claim in ipairs(claims) do
for k, t in pairs(convert) do
extraConf[k] = extraConf[k] or { count = 0 }
-- ricava i qualificatori generali e ne tiene il conto
for _, v in ipairs(t) do
extraConf[k][i] = mWikidata._formatQualifiers(claim, v) or
k == 'urlmorto' and
mWikidata._formatQualifiers(claim, v, { snaktype = 'somevalue' }) or nil
if extraConf[k][i] then
extraConf[k].count = extraConf[k].count + 1
break
end
end
end
if claim.qualifiers then
local qualifierIdsotherKnownQualifiers = ParametroElenco(linkConf.multi){}
-- cerca un disambiguante per url
for qualifierId, _ in pairs(qualifierIds) do
iffor claim.qualifiers[qualifierId] thenin mw.text.gsplit(linkConf.multi or '', '%s*,%s*') do
local formattedQualifier = mWikidata._formatQualifiers(claim,if qualifierId, { nq == '1', formattingthen =break 'raw'else }qualifierId.upper() end
if extraConf.titolodis[i] == nil and claim.qualifiers[qualifierId] then
local args = { nq = '1', formatting = 'raw' }
local formattedQualifier = mWikidata._formatQualifiers(claim, qualifierId, args)
if formattedQualifier then
extraConf.titolodis[i] = mw.wikibase.getLabel(formattedQualifier)
if not qualifier then qualifier = {} end
if extraConf.titolodis[i] then
qualifier[i] = mw.wikibase.getLabel(formattedQualifier)
extraConf.titolodis.count = extraConf.titolodis.count + 1
break
end
end
end
otherKnownQualifiers[qualifierId] = true
end
-- categoria di servizio in presenza di qualificatori non riconosciuti
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 qualifierIdsknownQualifiers[qualifierId] ~= true and altriQualNotiotherKnownQualifiers[qualifierId] ~= true then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catUnknownQual))
break
Riga 412 ⟶ 424:
-- crea l'url
claim = mWikidata._formatStatement(claim)
if linkConf.cid then
extraConf.cid[i] = linkConf.cid .. ' ' .. (extraConf.data[i] or claim)
end
if linkConf.url then
-- se proprietà di tipo id, il valore viene sotituitosostituito a "$1"
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
end
table.insert(url, (claim:gsub(' ', '%%20')))
end
-- qualificatori in presenza dei quali formattare una citazione diversa per url
local restricted = { 'autore', 'volume', 'pagina', 'data' }
for _, k in ipairs(restricted) do
if extraConf[k].count > 0 then
extraConf.restrictedData = true
break
end
end
-- nome sito, di default il dominio estratto dall'url
extraConf.sito = linkConf.sito or getDomain(linkConf.url)
-- Creazionecreazione 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
extraConf.titolodis.count ~= #url and
catMultiSenzaQual or catLetta
extraConf.titolo.count < #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
Riga 458 ⟶ 483:
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catExcessiveLoad))
end
-- categoria di servizio temporanea per i doppioni omessi
if duplicates then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, 'Voci con template Collegamenti esterni e doppioni disattivati'catDuplicates))
end
return ret