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
aggiungo gruppo "Gastronomia"
 
(25 versioni intermedie di 4 utenti non mostrate)
Riga 3:
]]--
 
require('Modulo:No globalsstrict')
 
local getArgs = require('Modulo:Arguments').getArgs
Riga 11:
-- Permette di definire l'ordine di visualizzazione dei vari gruppi
local orderedGroupNames = {
'Ufficiali', 'Enciclopedie', 'Biografie', 'Testi',
'Letteratura', 'Politica', 'Religione', 'Architettura',
'Astronomia', 'Biologia', 'Editoria', 'Geografia',
'Linguistica', 'MAB', 'Matematica', 'Software', 'Calcio', 'Sci',
'Sport', 'Videogiochi', 'Musica', 'Fumetti', 'Cinema', 'Gastronomia'
}
-- Soglie di attenzione sul numero elevato di collegamenti, per categorie di controllo
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'
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
 
-- =============================================================================
Riga 73 ⟶ 102:
 
-- 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)
Riga 111 ⟶ 142:
--
-- @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 132 ⟶ 157:
self.title = self.from and mWikidata._getLabel({ self.from }) or self.title
self.extraConf.medium = self.linkConf.medium or 'web'
 
return self
end
Riga 138 ⟶ 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)
local titolo = self.extraConf.titolo[1i] or self.title
if self.linkConf.titolo then
titolo = self.linkConf.titolo:gsub('$1', titolo)
end
if #self.qualifierurl > 1 and self.qualifierextraConf.titolodis[1i] ~= nil then
return string.format('%s (%s)', titolo, self.qualifierextraConf.titolodis[1i])
else
return titolo
Riga 156 ⟶ 182:
-- @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
for j = 1, i - 1 do
if titolo == (self.extraConf.titolo[j] or self.title) then
ripetuto = true
break
Riga 182 ⟶ 209:
end
return tbl
end
 
-- Restituisce il parametro cid per il modulo Citazione.
--
-- @param {number} i - il numero dell'URL a cui assegnare il cid.
-- @return {string}
function ExtLink:_getCid(i)
if #self.url > 1 and self.extraConf.restrictedData then
return self.extraConf.cid[i]
else
return self.linkConf.cid
end
end
 
function ExtLink:_formatPreviewMsg()
local ret = ''
if self.extraConf.previewMsg then
ret = mw.html.create('abbr')
:css('color', 'red')
:css('font-weight', 'bold')
:attr('title', self.extraConf.previewMsg)
:wikitext('!')
ret = tostring(ret) .. ' '
end
return ret
end
 
Riga 195 ⟶ 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.cita_da_modulo(
Riga 208 ⟶ 260:
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
Riga 218 ⟶ 270:
-- @return {string}
function ExtLink:getListItem()
-- restituisce il link se è già stato formattato
-- se è specificato l'URL di formattazione è una
if self.extraConf.formattedLink then
-- proprietà di tipo "identificativo esterno" altrimenti di tipo URL
return '* ' .. self:_formatPreviewMsg() .. self.extraConf.formattedLink
if self.linkConf.url then
-- se invece non è specificato l'URL di formattazione presume sia una
return '* ' .. mCitazione.cita_da_modulo(
-- proprietà di tipo URL e non di tipo "identificativo esterno"
elseif not self.linkConf.url then
return self:_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(i),
altrilink = self:_getAltriLink(),
sito = self.linkConf.opera and '' or self.extraConf.sito,
Riga 231 ⟶ 290:
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
 
Riga 278 ⟶ 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
 
Riga 304 ⟶ 374:
local ret, groupSites = {}, {}
local cfg = readConfig()
local lang = mw.language.getContentLanguage()
for _, groupName in ipairs(orderedGroupNames) do -- Per ogni gruppo tematico
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] = {}
Riga 311 ⟶ 389:
cfg[groupName] = {}
end
for _, linkConf in ipairs(cfg[groupName]) do -- Perper ogni sito configurato
local validoclaims, =valido, trueextraConf
-- se il sito non è escluso manualmente dall'utente, avviene la lettura da Wikidata
-- controlla se è un sito da escludere per soggetto non pertinente
if typenot (self:_Escluso(linkConf.vincolo)pid, == 'table'self.soloprop) thenor
self:_Escluso(lang:ucfirst(linkConf.medium or 'web'), self.solomedium)) then
valido = false
claims = mWikidata._getClaims(linkConf.pid, { from = self.from })
local Nvincoli = 0
end
for _, _ in ipairs(linkConf.vincolo) do Nvincoli = Nvincoli + 1 end
for i = 2, Nvincoli, 2 do -- Percontrolla ognise coppiaci 'proprietà',sono {valori}
if claims and #claims > 0 then
valido = valido or checkEntity(linkConf.vincolo[i - 1], linkConf.vincolo[i], self.from)
extraConf = { cid = {}, titolodis = { count = 0 } }
-- controlla se è un sito da escludere per soggetto non pertinente
if type(linkConf.vincolo) == 'table' then
local vincolo, tipo = {}, 'neg'
for i, v in ipairs(linkConf.vincolo) do
if 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
-- controllaverifica se èdeve ungenerare sitoil esclusolink manualmentecon un dall'utentesottomodulo
-- che può fare a sua volta altri controlli
if self:_Escluso(linkConf.pid, self.soloprop) or self:_Escluso(mw.getContentLanguage():ucfirst(linkConf.medium or 'web'), self.solomedium) then
if valido =and linkConf.sottomodulo falsethen
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
-- Sese il sito è abilitato, avvieneviene laaggiunto letturaa quelli da Wikidatamostrare
if valido then
local url, qualifier,= extraConf{}
-- per ogni dichiarazione
local Nqualtitoli = 0
for i, claim in ipairs(claims) do
local claims = mWikidata._getClaims(linkConf.pid, { from = self.from, snaktype = 'value' })
for k, t in pairs(knownQualifiers) do
-- Qui, se ci sono valori, il sito viene aggiunto a quelli da mostrare
if claims and #claims > 0t.par then
extraConf[t.par] = extraConf[t.par] or { count = 0 }
-- Qualificatori generali
local properties = { k, unpack(t.fallback or {}) }
-- 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 elencarericava i qual.qualificatori generali anchee ne tiene inil altriQualNoticonto
for _, v in ipairs(properties) do
extraConf = {}
extraConf[t.autorepar][i] = mWikidata._formatQualifiers(claims[1]claim, 'P50'v) or mWikidata._formatQualifiers(claims[1], 'P2093') -- come item o stringa
t.par == 'urlmorto' and
extraConf.volume = mWikidata._formatQualifiers(claims[1], 'P478')
extraConf.pagina = mWikidata._formatQualifiers(claims[1]claim, v, { snaktype = 'P304somevalue' }) or nil
if extraConf[t.data = mWikidata._formatQualifiers(claimspar][1i], 'P577')then
extraConf[t.titolopar].count = {}extraConf[t.par].count + 1
if t.restricted then
extraConf.archivio = {}
extraConf.dataarchrestrictedData = {}true
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
if claim.qualifiers then
local qualifierIds = ParametroElenco(linkConf.multi)
for qualifierId, _ in pairs(qualifierIds) do
if claim.qualifiers[qualifierId] then
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
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}
end
for qualifierId in pairs(claim.qualifiers) do
if claim.qualifiers then
if qualifierIds[qualifierId] ~= true and altriQualNoti[qualifierId] ~= true then
knownQualifiers.multi = {}
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catUnknownQual))
-- cerca un disambiguante per il titolo di ogni url
break
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
-- crea l'url
claimfor =qualifierId mWikidata._formatStatementin pairs(claim.qualifiers) do
if not (knownQualifiers[qualifierId] or knownQualifiers.multi[qualifierId]) then
if linkConf.url then
self:_addCategory(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.cid then
-- Creazione dell'oggetto collegamento esterno, con l'url (o gli url) e gli altri dati raccolti
extraConf.cid[i] = linkConf.cid .. ' ' .. (extraConf.data[i] or claim)
table.insert(ret[groupName], ExtLink:new(url, qualifier, linkConf, extraConf, self.from))
end
-- categoria per proprietà letta; se multipla e indistinguibile, usa categoria di avviso
if linkConf.url then
local tail = #url > 1 and linkConf.url and (qualifier == nil or #qualifier ~= #url) and (Nqualtitoli < #url - 1) and
-- se proprietà di tipo id, il valore viene sostituito a "$1"
catMultiSenzaQual or catLetta
claim = mw.message.newRawMessage(linkConf.url, claim):plain()
table.insert(self.categories, string.format('[[%sCategoria:%s%s]]', self.catColon, linkConf.pid, tail))
end
-- per verificare se un sito è ripetuto nel gruppo
table.insert(url, (claim:gsub(' ', '%%20')))
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, linkConf, extraConf, self.from))
-- categoria per proprietà letta; se multipla e indistinguibile, usa categoria di avviso
local tail = #url > 1 and linkConf.url and
extraConf.titolodis.count ~= #url and
extraConf.titolo.count < #url - 1 and
catMultiSenzaQual or catLetta
self:_addCategory(linkConf.pid .. tail)
-- per verificare se un sito è ripetuto nel gruppo e necessita di disambiguazione
groupSites[groupName][extraConf.sito] = (groupSites[groupName][extraConf.sito] or 0) + 1
-- conteggio complessivo dei collegamenti
self.numExtLinks = self.numExtLinks + 1
end
end
Riga 410 ⟶ 565:
end
end
-- categorie di servizio sulsu numero di link/entità caricate e doppioni omessi
local catnumero = self.numExtLinks == 0 and catEmpty or
if self.numExtLinks ==> MOLTI_LINK_2 and 0catMoltiLink2 thenor
self.numExtLinks > MOLTI_LINK and catMoltiLink
catnumero = catEmpty
self:_addCategory(catnumero,
elseif self.numExtLinks > MOLTI_LINK then
#loadedEntities > 100 and catExcessiveLoad,
if self.numExtLinks > MOLTI_LINK_2 then catnumero = catMoltiLink2
duplicates and catDuplicates)
else catnumero = catMoltiLink end
end
if catnumero then
table.insert(self.categories, string.format('[[%sCategoria:%s]]', self.catColon, catnumero))
end
return ret
end
Riga 470 ⟶ 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 label = mWikidata._getLabel({ linkConf.pid })
local wdLink = string.format('<tr><td>[[d:Property:%s|%s (%s)]]</td><td>%s</td><td>%s</td></tr>',
assert(label, string.format(
linkConf.pid, mWikidata._getLabel({ linkConf.pid }), linkConf.pid, linkConf.url or '', linkConf.cid or '')
'Impossibile trovare l\'etichetta della proprietà %s del gruppo %s',
table.insert(wdLinks, wdLink)
linkConf.pid, groupName))
local templates = {}
for template in string.gmatch(linkConf.template or '', '[^,]+') do
table.insert(templates, '[[t:' .. template .. '|' .. template .. ']]')
end
local wdLink = string.format(formatString,
linkConf.pid,
label,
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('[[Modulo:Collegamenti esterni/%s|%s]] (%s)', groupName, groupName, #wdLinks),
testo = '<table class="wikitable sortable plainlinks"><tr><th>Proprietà</th><th>Formato URL</th><th>cid</th></tr>' .. table.concat(wdLinks, '') .. '</table>'
}
}
end
table.insert(res, group)
end
Riga 494 ⟶ 673:
-- 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