Modulo:Collegamenti esterni/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
correggo
Omega Bot (discussione | contributi)
m Bot: rimuovo no globals obsoleto
 
(47 versioni intermedie di 3 utenti non mostrate)
Riga 3:
]]--
 
require('Modulo:No globalsstrict')
 
local getArgs = require('Modulo:Arguments').getArgs
local mDelink = require('Modulo:Delink')
local mWikidata = require('Modulo:Wikidata')
local mCitazione = require('Modulo:Citazione/sandbox')
local mEditAtWikidata = require('Modulo:Modifica su Wikidata')
-- Permette di definire l'ordine di visualizzazione dei vari gruppi
local orderedGroupNames = {
'Ufficiali', 'Enciclopedie', 'Biografie', 'Testi',
-- 'sandbox/Test',
'UfficialiLetteratura', 'Politica', 'CalcioReligione', 'Sport', 'Software', 'VideogiochiArchitettura',
'FumettiAstronomia', 'CinemaBiologia', 'Musica', 'MAB', 'ArchitetturaEditoria', 'Geografia',
'Linguistica', 'MAB', 'Matematica', 'Software', 'Calcio', 'Sci',
'Biografie', 'Letteratura', 'Enciclopedie', 'Biologia'
'Sport/sandbox', 'Videogiochi', 'Musica', 'Fumetti', 'Cinema'
}
-- Soglie di attenzione sul numero elevato di collegamenti, per categorie di controllo
-- Numero di collegamenti esterni oltre il quale sono raggruppati
local THRESHOLD_GROUPED_LISTMOLTI_LINK = 12
local MOLTI_LINK_2 = 15
-- Categorie di servizio
local catLetta = ' letta da Wikidata'
local catGroupedList = 'Voci con template Collegamenti esterni e collegamenti raggruppati'
local catMultiSenzaQual = ' multipla letta da Wikidata senza qualificatore'
local catMoltiLink = 'Voci con template Collegamenti esterni e molti collegamenti'
local catMoltiLink2 = 'Voci con template Collegamenti esterni e molti collegamenti (soglia maggiore)'
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'
local catDuplicates = 'Voci con template Collegamenti esterni e doppioni disattivati'
-- Avvisi per i link omessi
local tmpFound = 'Link visibile solo nell\'anteprima della pagina. È già presente il template $1'
local tmpSection = 'Questo link potrebbe essere visibile solo nell\'anteprima della pagina se in altre sezioni c\'è già uno dei seguenti template: $1'
-- Tabella dei qualificatori riconosciuti
-- Qui vanno elencati solo quelli generali, validi per tutte le dichiarazioni
-- Ciascuno ha la sua configurazione che può essere lasciata vuota o compilata come di seguito:
-- "par" è il parametro del modulo Citazione da compilare col qualificatore
-- "fallback" è una sottotabella coi qualificatori di ripiego in ordine di priorità
-- "restricted" è true se il qualificatore impone una citazione diversa per url a stesso sito
local knownQualifiers = {
-- item o stringa dell'autore
P50 = { par = 'autore', fallback = { 'P2093' }, restricted = true },
P478 = { par = 'volume', restricted = true },
P304 = { par = 'pagina', restricted = true },
P577 = { par = 'data', restricted = true },
-- titolo o "indicato come" o "riferito come" o pseudonimo
P1476 = { par = 'titolo', fallback = { 'P1810', 'P1932', 'P742', 'P554' } },
-- url archiviato, solo per le proprietà di tipo URL
P1065 = { par = 'archivio' }, P2960 = { par = 'dataarch' }, P582 = { par = 'urlmorto' },
P407 = {}, P813 = {}
}
-- I qualificatori di ripiego sono automaticamente aggiunti con configurazione vuota
for _, t in pairs(knownQualifiers) do
if t.fallback then
for _, v in ipairs(t.fallback) do knownQualifiers[v] = {} end
end
end
 
-- =============================================================================
Line 69 ⟶ 102:
 
-- Restituisce true se l'elemento collegato alla pagina o quello specificato in from
-- ha tra i valori della(o proprietàloro istanzasottoclassi) didella (P31)proprietà indicata uno degli elementi specificati.
-- Restituisce come secondo valore una tabella con gli ID delle entità caricate ai fini della ricerca.
--
-- @param {tablestring} [entityIds]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 checkInstance(entityIds, from)
local argsfunction =checkEntity(prop, {entityIds, from = from })
local args = { from = from, recursion = 8 }
for _, entityId in ipairs(entityIds) do
table.insert(args, entityId)
end
return mWikidata._instanceOf_propertyHasEntity(prop, args)
end
 
-- Converte un parametro ricevuto come 'Xxx, yyy' in { 'Xxx'=true, 'Yyy'=true }
local function ParametroElenco(param)
local chiavi = {}
local valori = param and mw.text.split(param, ',')
if valori then
for _, str in ipairs(valori) do
chiavi[mw.getContentLanguage():ucfirst(mw.text.trim(str))] = true
end
end
return chiavi
end
 
Line 95 ⟶ 142:
--
-- @param {table} [url] - uno o più URL, quanti sono i valori della proprietà Wikidata
-- @param {table} [qualifier]linkConf - eventualila qualificatoriconfigurazione dafissa annettereper al titolo perquesto ciascuncollegamento URLesterno
-- @param {table} linkConfextraConf - laaltri configurazioneelementi perdi questoconfigurazione collegamentoricavati esternodall'item
-- @param {string} from - entityId se diverso da quello collegato alla pagina corrente
-- @return {table} un nuovo oggetto ExtLink
function ExtLink:new(url, qualifierlinkConf, linkConfextraConf, 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 = qualifier
self.linkConf = linkConf
self.extraConf = extraConf
self.from = from
self.title = getCurrentTitle()
self.title = self.from and mWikidata._getLabel({ self.from }) or self.title
( self.extraConf.medium = self.linkConf.titolomedium or and'web'
self.linkConf.titolo:gsub('$1', self.title) or
self.title)
 
return self
Line 122 ⟶ 163:
-- Restituisce il parametro titolo per il modulo Citazione.
--
-- @param {number} i - il numero dell'URL a cui assegnare il titolo.
-- @return {string}
function ExtLink:_getTitolo(i)
iflocal self.qualifiertitolo and= self.qualifierextraConf.titolo[1i] ~=or nil thenself.title
if self.linkConf.titolo then
return string.format('%s (%s)', self.title, self.qualifier[1])
titolo = self.linkConf.titolo:gsub('$1', titolo)
end
if #self.url > 1 and self.extraConf.titolodis[i] then
return string.format('%s (%s)', titolo, self.extraConf.titolodis[i])
else
return self.titletitolo
end
end
 
-- Restituisce il parametro altrilink per il modulo Citazione.
-- Nel caso di valori multipli, genera quelli successivi al primo.
--
-- @return {table}
function ExtLink:_getAltriLink()
if self.extraConf.restrictedData then return end
local ret
local tbl = {}
if self.qualifier then
local tbltitolo, = {}specifica
for i = 2, #self.qualifierurl do
iftitolo = self.qualifierextraConf.titolo[i] ==or nil thenself.title
if self.qualifierextraConf.titolodis[i] = 'altra versione'then
specifica = self.extraConf.titolodis[i]
else
local ripetuto = false -- controllo se stesso titolo già usato
for j = 1, i - 1 do
if titolo == (self.extraConf.titolo[j] or self.title) then
ripetuto = true
break
end
end
if ripetuto then
specifica = 'altra versione'
else
specifica = nil -- se titoli diversi, va bene anche senza specificazione
end
table.insert(tbl, { self.url[i], string.format('%s (%s)', self.title, self.qualifier[i]) })
end
if specifica then
ret = tbl
titolo = string.format('%s (%s)', titolo, specifica)
end
table.insert(tbl, { self.url[i], titolo })
end
return rettbl
end
 
-- Restituisce il parametro posttitolocid per il modulo Citazione.
--
-- @param {number} i - il numero dell'URL a cui assegnare il cid.
-- @return {string}
function ExtLink:_getPostTitolo_getCid(i)
if #self.url > 1 and self.extraConf.restrictedData then
local ret
return self.extraConf.cid[i]
if not self.qualifier and #self.url > 1 then
else
local tbl = {}
forreturn i = 2, #self.url dolinkConf.cid
table.insert(tbl, string.format('[%s %s]', self.url[i], i))
end
ret = string.format('(%s)', table.concat(tbl, ', '))
end
return ret
end
 
function ExtLink:_formatPreviewMsg()
-- Restituisce la stringa da usare come "sito" per il modulo Citazione
local ret = ''
-- o come label nel link creato come [url label].
if self.extraConf.previewMsg then
--
ret = mw.html.create('abbr')
-- @param {boolean} delink
:css('color', 'red')
-- @return {string}
:css('font-weight', 'bold')
function ExtLink:_getSito(delink)
:attr('title', self.extraConf.previewMsg)
local sito
:wikitext('!')
if self.linkConf.sito then
ret = tostring(ret) .. ' '
sito = delink and mDelink._main({ self.linkConf.sito }) or self.linkConf.sito
else
sito = getDomain(self.url[1])
end
return sitoret
end
 
Line 190 ⟶ 247:
langs = (#langs == 1 and langs[1] == 'Q652') and {} or langs
for i, lang in ipairs(langs) do
langs[i] = mWikidatamw._getLabelwikibase.getLabel({ lang }) or lang
end
local formattedLink = mCitazione.collegamenticita_da_modulo({
self.extraConf.medium,
{
url = mWikidata._formatStatement(claim),
titolo = self.linkConf.titolo:gsub('$1', currTitle),
lingua = table.concat(langs, ','),
cid = self.linkConf.cid,
urlarchivio = self.extraConf.archivio[idx],
dataarchivio = self.extraConf.dataarch[idx],
urlmorto = self.extraConf.urlmorto[idx] and 'sì' or (self.extraConf.archivio[idx] and 'no')
})
table.insert(formattedLinks, '* ' .. self:_formatPreviewMsg() .. formattedLink ..
mEditAtWikidata._showMessage({ pid = self.linkConf.pid, qid = self.from }))
end
return table.concat(formattedLinks, '\n')
end
 
-- Setta come necessaria la disambiguazione del link (più URL con lo stesso dominio nel gruppo),
-- se configurata tramite la chiave "sitodis" nella configurazione.
function ExtLink:needSitoDis()
self.sitodis = self.linkConf.sitodis
end
 
Line 214 ⟶ 270:
-- @return {string}
function ExtLink:getListItem()
-- restituisce il link se è già stato formattato
local icon = self.linkConf.icona == 'video' and
if self.extraConf.formattedLink then
'[[File:35mm film frames.svg|16px|link=|alt=Filmato]]' or ''
return '* ' .. self:_formatPreviewMsg() .. self.extraConf.formattedLink
-- se è specificato l'URL di formattazione è una
-- se invece non è specificato l'URL di formattazione presume sia una
-- proprietà di tipo "identificativo esterno" altrimenti di tipo URL
-- proprietà di tipo URL e non di tipo "identificativo esterno"
if self.linkConf.url then
elseif not self.linkConf.url then
return '* ' .. icon .. mCitazione.collegamenti({
return self:_formatPropertyURL()
url = self.url[1],
end
titolo = self:_getTitolo(),
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[i],
titolo = self:_getTitolo(i),
altrilink = self:_getAltriLink(),
sito = self.linkConf.opera and '' or self.extraConf.sito,
posttitolo = self:_getPostTitolo(),
sitoopera = self:_getSito().linkConf.opera,
editore = self.linkConf.editore,
lingua = self.linkConf.lingua,
cid = self.linkConf.cid:_getCid(i),
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, '* ' .. self:_formatPreviewMsg() .. formattedLink ..
else
mEditAtWikidata._showMessage({ pid = self.linkConf.pid, qid = self.from }))
return self:_formatPropertyURL()
end
return table.concat(formattedLinks, '\n')
end
 
-- Formatta il collegamento esterno come elemento di un elenco puntato raggruppato.
--
-- @return {string}
function ExtLink:getGroupedListItem()
local ret = string.format('[%s %s]', self.url[1], self:_getSito(true))
return #self.url > 1 and (ret .. ' ' .. self:_getPostTitolo()) or ret
end
 
Line 267 ⟶ 326:
self.catColon = ''
self.from = args.from
self.escludi = ParametroElenco(args.escludi)
self.soloprop = ParametroElenco(args.prop)
self.sologruppi = ParametroElenco(args.gruppo)
self.solomedium = ParametroElenco(args.medium)
-- la pagina dei test utilizza uno stub del modulo Wikidata
if mw.title.getCurrentTitle().prefixedText ==
Line 275 ⟶ 338:
 
return self
end
 
-- Formatta e carica una o più categorie di servizio.
function LinksManager:_addCategory(...)
for _, category in pairs({ ... }) do
if category then
category = string.format('[[%sCategoria:%s]]', self.catColon, category)
table.insert(self.categories, category)
end
end
end
 
Line 287 ⟶ 360:
self.catColon = ':'
self.debug = true
end
 
-- Controlla se un elemento fa parte delle esclusioni richieste dall'utente
function LinksManager:_Escluso(elemento, inclusi)
return self.escludi[elemento] or (next(inclusi) and inclusi[elemento] ~= true)
end
 
Line 296 ⟶ 374:
local ret, groupSites = {}, {}
local cfg = readConfig()
local lang = mw.language.getContentLanguage()
for _, groupName in ipairs(orderedGroupNames) do
local pageContent, isPreview, isSection
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 duplicates = false -- per categoria temporanea
for _, groupName in ipairs(orderedGroupNames) do -- per ogni gruppo tematico
groupSites[groupName] = {}
ret[groupName] = {}
-- controlla se è un gruppo escluso manualmente dall'utente
for _, linkConf in ipairs(cfg[groupName]) do
if not linkConf.istanza or checkInstanceself:_Escluso(linkConf.istanzagroupName, self.fromsologruppi) then
cfg[groupName] = {}
local url, qualifier
end
local claims = mWikidata._getClaims( linkConf.pid, { from = self.from, snaktype = 'value' })
for _, linkConf in ipairs(cfg[groupName]) do -- per ogni sito configurato
if claims and #claims > 0 then
local claims, valido, extraConf
url = {}
-- se il sito non è escluso manualmente dall'utente, avviene la lettura da Wikidata
for i, claim in ipairs(claims) do
if not (self:_Escluso(linkConf.pid, self.soloprop) or
if claim.qualifiers then
self:_Escluso(lang:ucfirst(linkConf.medium or 'web'), self.solomedium)) then
local qualifierIds = {}
ifclaims = mWikidata._getClaims(linkConf.multipid, { from = self.from then})
end
qualifierIds = mw.text.split(linkConf.multi:gsub('%s', ''), ',')
-- controlla se ci sono valori
for _, qualifierId in ipairs(qualifierIds) do
if claim.qualifiers[qualifierId]claims and #claims > 0 then
extraConf = { cid = {}, titolodis = { count = 0 } }
local formattedQualifier = mWikidata._formatQualifiers(claim, qualifierId, { nq = '1', formatting = 'raw' })
-- controlla se è un sito da escludere per soggetto non pertinente
if formattedQualifier then
if type(linkConf.vincolo) == 'table' then
if not qualifier then qualifier = {} end
local vincolo, tipo = {}, 'neg'
qualifier[i] = mw.wikibase.getLabel(formattedQualifier)
for i, v in ipairs(linkConf.vincolo) do
break
endif i % 2 ~= 0 then
local ms, k = v:match('^(%-?)(.+)$')
if tipo == 'neg' and ms == '' then
vincolo, tipo = {}, 'pos'
end
if not (tipo == 'pos' and ms == '-') then
vincolo[k] = linkConf.vincolo[i + 1]
end
end
end
for k, v in pairs(vincolo) do
valido, loadedEntities[k] = checkEntity(k, v, self.from)
if tipo == 'neg' then
valido = not valido
if not valido then break end
elseif valido then
break
end
end
else
valido = true
end
-- controlla che il link non sia generato da altri template in voce
if valido and linkConf.template then
local templateList = linkConf.template
:gsub('%s*,%s*', ','):gsub(',+', ','):gsub('^,', ''):gsub(',$', '')
if templateList ~= '' then
if not pageContent then
pageContent = mw.title.getCurrentTitle():getContent()
:gsub('<!%-%-.-%-%->', '')
:gsub('<[Rr][Ee][Ff]%s.-/>', '') -- facilita la ricerca successiva
:gsub('<[Rr][Ee][Ff].->.-</[Rr][Ee][Ff]%s*>', '')
isPreview = mw.getCurrentFrame():preprocess('{{REVISIONID}}') == ''
end
for template in mw.text.gsplit(templateList, ',') do
template = template:gsub(' +', ' +')
local firstChar = template:match('^.')
firstChar = string.format('[%s%s]', firstChar:upper(), firstChar:lower())
if pageContent:match('{{%s*' .. template:gsub('^.', firstChar) .. '%s*[|}]') then
valido, duplicates = isPreview, true
if isPreview then
extraConf.previewMsg = mw.message.newRawMessage(tmpFound, template):plain()
end
break
end
end
if isPreview and not extraConf.previewMsg then
if isSection == nil then
isSection = pageContent:match('^=+[^=\n]+=+ *\n') and true or false
end
if isSection then
templateList = templateList:gsub(',', ', ')
extraConf.previewMsg = mw.message.newRawMessage(tmpSection, templateList):plain()
end
end
end
end
end
-- verifica se deve generare il link con un sottomodulo
-- che può fare a sua volta altri controlli
if valido and linkConf.sottomodulo then
local success, metamodule = pcall(require, 'Modulo:' .. linkConf.sottomodulo)
if success and type(metamodule._main) == 'function' then
extraConf.formattedLink = metamodule._main({
from = self.from,
['mostra errori'] = 'no'
})
end
if extraConf.formattedLink then
claims = {}
else
valido = false
end
end
-- se il sito è abilitato, viene aggiunto a quelli da mostrare
if valido then
local url = {}
-- per ogni dichiarazione
for i, claim in ipairs(claims) do
for k, t in pairs(knownQualifiers) do
if t.par then
extraConf[t.par] = extraConf[t.par] or { count = 0 }
local properties = { k, unpack(t.fallback or {}) }
-- ricava i qualificatori generali e ne tiene il conto
for _, v in ipairs(properties) do
extraConf[t.par][i] = mWikidata._formatQualifiers(claim, v) or
t.par == 'urlmorto' and
mWikidata._formatQualifiers(claim, v, { snaktype = 'somevalue' }) or nil
if extraConf[t.par][i] then
extraConf[t.par].count = extraConf[t.par].count + 1
if t.restricted then
extraConf.restrictedData = true
end
break
end
end
end
for _, v in ipairs(qualifierIds) do qualifierIds[v] = true end
end
for qualifierId in pairs(claim.qualifiers) do
if not qualifierIds[qualifierId]claim.qualifiers then
knownQualifiers.multi = {}
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catUnknownQual))
-- cerca un disambiguante per il titolo di ogni url
for qualifierId in mw.text.gsplit(linkConf.multi or '', ',') do
if qualifierId == '' then break end
qualifierId = mw.text.trim(qualifierId):upper()
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 extraConf.titolodis[i] then
extraConf.titolodis.count = extraConf.titolodis.count + 1
end
end
end
knownQualifiers.multi[qualifierId] = true
end
-- categoria di servizio in presenza di qualificatori non riconosciuti
claim = mWikidata._formatStatement(claim)
for qualifierId in pairs(claim.qualifiers) do
if linkConf.url then
if not (knownQualifiers[qualifierId] or knownQualifiers.multi[qualifierId]) then
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
self:_addCategory(catUnknownQual)
break
end
end
table.insert(url, claim)
end
-- 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 sostituito a "$1"
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
end
table.insert(url, (claim:gsub(' ', '%%20')))
end
-- nome sito, di default il dominio estratto dall'url
if url then
extraConf.sito = linkConf.sito or getDomain(linkConf.url)
table.insert(ret[groupName], ExtLink:new(url, #url > 1 and qualifier or nil, linkConf, self.from))
-- creazione dell'oggetto collegamento esterno, con l'url (o gli url) e gli altri dati raccolti
-- categorie
table.insert(ret[groupName], ExtLink:new(url, linkConf, extraConf, self.from))
local pattern = #url > 1 and linkConf.multi and
-- categoria per proprietà letta; se multipla e indistinguibile, usa categoria di avviso
(qualifier == nil or #qualifier ~= #url) and
local tail = #url > 1 and linkConf.url and
'multipla letta da Wikidata senza qualificatore' or
extraConf.titolodis.count ~= #url and
'letta da Wikidata'
extraConf.titolo.count < #url - 1 and
pattern = '[[%sCategoria:%s ' .. pattern .. ']]'
catMultiSenzaQual or catLetta
table.insert(self.categories, string.format(pattern, self.catColon, linkConf.pid))
self:_addCategory(linkConf.pid .. tail)
-- per verificare se un sito è ripetuto nel gruppo
-- per verificare se un sito è ripetuto nel gruppo e necessita di disambiguazione
local sito = linkConf.sito and mDelink._main({ linkConf.sito }) or getDomain(linkConf.url)
groupSites[groupName][extraConf.sito] = (groupSites[groupName][extraConf.sito] or 0) + 1
-- conteggio complessivo dei collegamenti
self.numExtLinks = self.numExtLinks + 1
self.numExtLinks = self.numExtLinks + 1
end
end
end
Line 355 ⟶ 558:
for _, groupName in ipairs(orderedGroupNames) do
for _, extLink in ipairs(ret[groupName]) do
-- necessaria la disambiguazione (più URL con lo stesso dominio nel gruppo),
local linkConf = extLink.linkConf
-- se configurata tramite "sitodis" nella configurazione.
local sito = linkConf.sito and mDelink._main({ linkConf.sito }) or getDomain(linkConf.url)
if groupSites[groupName][extLink.extraConf.sito] > 1 then
extLink:needSitoDis().sitodis = extLink.linkConf.sitodis
end
end
end
-- categorie di servizio su numero di link/entità caricate e doppioni omessi
iflocal catnumero = self.numExtLinks == 0 thenand catEmpty or
self.numExtLinks > MOLTI_LINK_2 and catMoltiLink2 or
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catEmpty))
elseif self.numExtLinks > THRESHOLD_GROUPED_LISTMOLTI_LINK and thencatMoltiLink
self:_addCategory(catnumero,
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catGroupedList))
#loadedEntities > 100 and catExcessiveLoad,
end
duplicates and catDuplicates)
 
return ret
end
Line 384 ⟶ 587:
end
return table.concat(formattedLinks, '\n')
end
 
-- Formatta i collegamenti esterni come elenco puntato, raggruppandoli.
--
-- @param {table} [groupNames]
-- @return {string}
function LinksManager:_formatGroupedList(groupNames)
local formattedGroups = {}
for _, groupName in ipairs(groupNames) do
local formattedLinks = {}
for _, extLink in ipairs(self.extLinks[groupName]) do
table.insert(formattedLinks, extLink:getGroupedListItem())
end
if #formattedLinks > 0 then
local groupTitle = groupName == 'Enciclopedie' and
groupName or 'Banche dati ' .. mw.ustring.lower(groupName)
table.insert(formattedGroups, string.format("* %s: %s%s", groupTitle,
table.concat(formattedLinks, '<span style="font-weight:bold;">&nbsp;·</span> '),
mEditAtWikidata._showMessage({ sezione = 'identifiers', qid = self.from })))
end
end
return table.concat(formattedGroups, '\n')
end
 
-- Restituisce tutti i collegamenti esterni formattandoli come elenco puntato
-- e raggruppandoli quando sono più di THRESHOLD_GROUPED_LIST.
--
-- @return {string}
function LinksManager:getList()
local categories, groupNames, olinks, links
-- categorie di servizio
 
-- categorie
categories = (mw.title.getCurrentTitle().namespace == 0 or self.debug) and
table.concat(self.categories) or ''
-- collegamenti
-- i siti web ufficiali sono sempre visualizzati uno per riga
olinkslinks = self:_formatList({ 'Ufficiali' }orderedGroupNames)
return links .. categories
-- tutti gli altri collegamenti
groupNames = { unpack(orderedGroupNames, 2) }
links = self.numExtLinks <= THRESHOLD_GROUPED_LIST and
self:_formatList(groupNames) or
self:_formatGroupedList(groupNames)
 
return olinks .. ((links ~= '' and olinks ~= '') and '\n' or '') .. links .. categories
end
 
Line 435 ⟶ 608:
local p = {}
 
-- FunzioneFunzioni di utilità per il manuale, restituiscedanno la soglia THRESHOLD_GROUPED_LISTdi attenzione sul n° di link.
function p.threshold(frame)
return THRESHOLD_GROUPED_LISTMOLTI_LINK
end
function p.threshold2(frame)
return MOLTI_LINK_2
end
 
Line 445 ⟶ 621:
local res = {}
local cfg = readConfig()
local formatString = '<tr><td>[[d:P:%s|%s (%s)]]</td><td>%s</td><td>%s</td><td>%s</td></tr>'
table.sort(orderedGroupNames)
for _, groupName in ipairs(orderedGroupNames) do
local wdLinks = {}
for _, linkConf in ipairs(cfg[groupName]) do
local templates = {}
local wdLink = string.format('* [[d:Property:%s|%s (%s)]]',
linkConf.pid,for template mWikidatain string._getLabelgmatch({ linkConf.pidtemplate })or '', linkConf.pid'[^,]+') do
table.insert(wdLinkstemplates, wdLink)'[[t:' .. template .. '|' .. template .. ']]')
end
local wdLink = string.format(formatString,
linkConf.pid,
mWikidata._getLabel({ linkConf.pid }),
linkConf.pid,
linkConf.url or '',
linkConf.cid or '',
table.concat(templates, ', '))
table.insert(wdLinks, wdLink)
end
 
local group = frame.args[1] == 'modulo' and
local group
string.format('* [[Modulo:Collegamenti esterni/%s]] (%s)', groupName, #wdLinks) or
if frame.args[1] == 'modulo' then
mw.getCurrentFrame():expandTemplate {
group = string.format('* [[Modulo:Collegamenti esterni/%s]] (%s)',
groupName, #wdLinks)
else
local wikitable = mw.html.create('table')
local title = string.format('[[Modulo:Collegamenti esterni/%s|%s]] (%s)',
groupName, groupName, #wdLinks)
wikitable
:addClass('wikitable sortable plainlinks')
:tag('tr')
:tag('th'):wikitext('Proprietà')
:tag('th'):wikitext('Formato URL')
:tag('th'):wikitext('cid')
:tag('th'):wikitext('Template equivalenti')
:allDone()
:wikitext(table.concat(wdLinks))
group = mw.getCurrentFrame():expandTemplate{
title = 'Cassetto',
args = { titolo = title, testo = tostring(wikitable) }
titolo = string.format('%s (%s)', groupName, #wdLinks),
testo = table.concat(wdLinks, '\n')
}
}
end
table.insert(res, group)
end
Line 469 ⟶ 669:
-- Funzione di utilità per il manuale, verifica l'assenza di proprietà duplicate.
function p.checkdup(frame)
local ids, vin, res = {}, {}, {}
local cfg = readConfig()
for _, groupName in ipairs(orderedGroupNames) do
for _, linkConf in ipairs(cfg[groupName]) do
iflocal duplicate = ids[linkConf.pid] then
if vin[linkConf.pid] == nil then
vin[linkConf.pid] = { pos = {}, neg = {} }
end
if vin[linkConf.pid] ~= false and linkConf.vincolo then
duplicate, vin[linkConf.pid].cur = false, {}
local tipo = 'neg'
for i, v in ipairs(linkConf.vincolo) do
if i % 2 ~= 0 then
local ms, p = v:match('^(%-?)(.+)$')
if tipo == 'neg' and ms == '' then
vin[linkConf.pid].cur, tipo = {}, 'pos'
end
if not (tipo == 'pos' and ms == '-') then
for _, q in ipairs(linkConf.vincolo[i + 1]) do
vin[linkConf.pid].cur[p .. q] = true
end
end
end
end
if tipo == 'pos' then
for k in pairs(vin[linkConf.pid].cur) do
for _, t in ipairs(vin[linkConf.pid].pos) do
if t[k] then duplicate = true break end
end
for _, t in ipairs(vin[linkConf.pid].neg) do
if not t[k] then duplicate = true break end
end
end
else
if #vin[linkConf.pid].neg == 1 then
duplicate = true
else
for _, t in ipairs(vin[linkConf.pid].pos) do
for k in pairs(t) do
if not vin[linkConf.pid].cur[k] then
duplicate = true
break
end
end
end
end
end
table.insert(vin[linkConf.pid][tipo], vin[linkConf.pid].cur)
end
if duplicate then
table.insert(res, linkConf.pid)
else
ids[linkConf.pid] = true
if not linkConf.vincolo then vin[linkConf.pid] = false end
end
end