Modulo:Interprogetto/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
t
use require('strict') instead of require('Module:No globals')
 
(41 versioni intermedie di 2 utenti non mostrate)
Riga 1:
-- Modulo per implementare le funzionalità di template:Interprogetto
require('Module:No globalsstrict')
local p = {} -- per l'esportazione delle funzioni del modulo
 
Riga 83:
-- ============================================================================================================
local function sort_by_ordine(t1, t2)
if t1.ordine < t2.ordine or t1.ordine == t2.ordine and t1.lingua < t2.lingua then
return true
end
Riga 96:
-- Carica i dati da Wikidata se esistono
local self = {}
if not ignore_wikidata then
self.entity = nil
if not(ignore_wikidata) and mw.wikibase then
self.entity = mw.wikibase.getEntityObject()
end
Line 105 ⟶ 104:
self.badge = {}
self.from_property_category = {}
self.articlearticle_link = {}
self:loadCollegamenti().lingua = {}
if self.entity then
-- Imposta il corsivo se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]])
self.etichetta = self.entity:getLabel('it')
-- con valore corrispondente a un'opera, come definito in cfg.check_opera
-- Imposta il corsivo se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]])
self.corsivo = self:hasPropertyValue('P31', cfg.check_opera)
-- con valore corrispondente a un'opera, come definito in cfg.check_opera
-- Considera disambigua se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]])
self.corsivo = self:hasPropertyValue('P31', cfg.check_opera)
-- con valore 4167410 ("Wikimedia disambiguation page", [[wikidata:Q4167410]])
-- Considera disambigua se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]])
self.disambigua = self:hasPropertyValue('P31', '4167410')
-- con valore 4167410 ("Wikimedia disambiguation page", [[wikidata:Q4167410]])
-- Controlla se la voce è relativa a una categoria
self.is_categorydisambigua = self:hasPropertyValue('P31', 'Q41678364167410')
-- Controlla se la voce è relativa a una categoria
self.is_category = self:hasPropertyValue('P31', '4167836')
self:loadCollegamenti()
end
return self
end
 
function Wikidata_entity:getLabelgetClaim(labelproperty_id)
if self.entity.claims thenand
return self.entity:getLabel(label).claims[property_id] and
self.entity.claims[property_id][1].mainsnak.datavalue and
self.entity.claims[property_id][1].mainsnak.datavalue.type == 'string' then
return self.entity.claims[property_id][1].mainsnak.datavalue.value
else
return nil
end
end
 
function Wikidata_entity:getInterwiki(project, property_language)
local interwiki = { project }
if property_language and self.entity.claims and self.entity.claims[property_language] then
project = project:sub(3)
for _, claim in ipairs(self.entity.claims[property_language]) do
if claim.mainsnak.datavalue.type == 'wikibase-entityid' then
local entityId = 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
if entityId ~= 'Q652' then
local claims = mw.wikibase.getBestStatements(entityId, 'P424')
local language_code = claims[1] and claims[1].mainsnak.datavalue.value
if language_code then
if project == 'wikisource' and language_code == 'grc' then
language_code = 'el'
end
table.insert(interwiki, language_code .. project)
self.lingua[language_code .. project] = language_code
end
end
end
end
end
return interwiki
end
 
Line 130 ⟶ 160:
-- ============================================================================================================
function Wikidata_entity:loadCollegamenti()
for key_progetto, progetto in pairs(cfg.automatic_link) do
if self.entity then
-- Carica i collegamenti di un progetto solo se non disambigua o tipo di progetto abilitato in disambigua
for key_progetto, progetto in pairs(cfg.automatic_link) do
if not self.disambigua or cfg.parameters[key_progetto].abilita_in_disambigua then
-- Carica i collegamenti di un progetto solo se non disambigua o tipo di progetto abilitato in disambigua
for i, interwiki in ipairs(self:getInterwiki(progetto.interwiki, progetto.property_language)) do
if not self.disambigua or cfg.progetti[key_progetto].abilita_in_disambigua then
local sitelink = self.entity:getSitelink(interwiki)
if progetto.property_category then
-- Dà sempre precedenza al sitelink se è una categoria
local property_id = progetto.property_category
if sitelink and mw.ustring.find(sitelink, '^Category:') then
if self.entity.claims
-- 'false' disabilita la consultazione della proprietà
and self.entity.claims[property_id]
self.from_property_category[key_progetto] = false
and self.entity.claims[property_id][1]
end
and self.entity.claims[property_id][1].mainsnak
local claim
and self.entity.claims[property_id][1].mainsnak.datavalue
if progetto.property_category and self.from_property_category[key_progetto] ~= false then
and self.entity.claims[property_id][1].mainsnak.datavalue.type == 'string' then
claim = self:getClaim(progetto.property_category)
self.collegamenti[key_progetto] = 'Category:' .. self.entity.claims[property_id][1].mainsnak.datavalue.value
if claim then
self.from_property_category[key_progetto] = true
self.collegamenti[key_progetto] = 'Category:' .. claim
self.from_property_category[key_progetto] = true
end
end
local sitelink = self.entity:getSitelink(progetto.interwiki)
if sitelink then
if self.from_property_category[key_progetto] then
self.article_link[key_progetto] = sitelink
elseif i > 1 then
local lingua = self.lingua[interwiki]
key_progetto = string.format('%s_%s', key_progetto, lingua)
self.lingua[key_progetto] = lingua
self.collegamenti[key_progetto] = string.format('%s:%s', lingua, sitelink)
else
self.articlecollegamenti[key_progetto] = sitelink
end
if i == 1 and 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
Line 166 ⟶ 202:
self.badge[key_progetto].title = table.concat(badge_title, ', ' )
end
elseif not self.is_category and progetto.property_gallery and not self.from_property_category[key_progetto] then
claim = self:getClaim(progetto.property_gallery)
self.collegamenti[key_progetto] = claim
end
end
Line 178 ⟶ 217:
-- ============================================================================================================
function Wikidata_entity:hasPropertyValue(propertyId, values)
if self.entity and self.entity.claims and self.entity.claims[propertyId] then
localfor claims_, =claim in ipairs(self.entity.claims[propertyId]) do
if claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
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' thenand
if datavalue.value['entity-type'] == 'item' thenand
if (type(values) == 'table' thenand values[tostring(datavalue.value['numeric-id'])]) or
ifvalues == values[tostring(datavalue.value['numeric-id'])] then
return true
end
elseif values == tostring(datavalue.value['numeric-id']) then
return true
end
end
end
end
Line 216 ⟶ 249:
setmetatable(self, { __index = Collegamento,
__tostring = function(t) return self:__tostring() end })
local default_progetto = cfg.parameters[key_progetto:match('^[^_]+')]
if default_progetto == nil then
-- Progetto non riconosciuto
Line 226 ⟶ 259:
return nil
else
self.key_progettodefault_progetto = key_progettodefault_progetto
self.ordine = default_progetto.ordine
self.badge_leftbar = {}
Line 232 ⟶ 265:
self.badge_leftbar.title = (entity.badge[key_progetto] and entity.badge[key_progetto].title) or ''
self.etichetta = is_defined(args[key_progetto .. '_etichetta']) or (default_progetto.etichetta_lower and default.etichetta_lower) or default.etichetta
-- elabora l'oggetto per i testi completi su wikisource quando il collegamento è ricavato da wikidata e il parametro testo_preposizione è compilato
self.oggetto = args[key_progetto .. '_oggetto'] or default.oggetto or default_progetto.oggetto
local alias_s_oggetto = key_progetto == 's' and args.testo_preposizione and not args.orig_s and not args.s_preposizione and cfg.parameters['testo'].oggetto
self.oggetto = args[key_progetto .. '_oggetto'] or alias_s_oggetto or default.oggetto or default_progetto.oggetto
if default.frase_unificata or default_progetto.preposizione then
-- consulta il parametro testo_preposizione se il collegamento a wikisource non è manuale
self.preposizione = args[key_progetto .. '_preposizione'] or default.preposizione or default_progetto.preposizione
local alias_s_preposizione = key_progetto == 's' and not args.orig_s and args.testo_preposizione
self.preposizione = args[key_progetto .. '_preposizione'] or alias_s_preposizione or default.preposizione or default_progetto.preposizione
else
self.preposizione = ''
Line 248 ⟶ 285:
self.testo_dopo = ' <small>' .. args.data .. '</small>'
end
iflocal default_progetto.lingua and= args[key_progetto ..== '_linguas_el' and 'lingua greca'] thenor
self entity.lingua[key_progetto] =and require(' in lingua Modulo:Linguaggi' ).get_voce(entity. argslingua[key_progetto]) .. '_lingua']or
args[key_progetto .. '_lingua'] and 'lingua ' .. args[key_progetto .. '_lingua']
if default_progetto.lingua and lingua then
self.lingua = ' in ' .. lingua
else
self.lingua = ''
Line 258 ⟶ 298:
 
function Collegamento:Link()
local default_progetto = self.default_progetto
if cfg.parameters[self.key_progetto].link == 'Link' then return self:Link_text() end
if default_progetto.link == 'Link' then
if cfg.parameters[self.key_progetto].link == 'LinkWithLanguage' then return self:Link_language() end
return self:Link_text()
if cfg.parameters[self.key_progetto].link == 'LinkRicette' then return self:Link_ricette() end
elseif default_progetto.link == 'LinkWithLanguage' then
if cfg.parameters[self.key_progetto].link == 'LinkIncubator' then return self:Link_incubator() end
return self:Link_language()
add_error('Errore interno modulo Interprogetto:' .. self.key_progetto)
elseif default_progetto.link == 'LinkRicette' then
return self:Link_ricette()
elseif default_progetto.link == 'LinkIncubator' then
return self:Link_incubator()
end
add_error('Errore interno modulo Interprogetto')
return ''
end
 
function Collegamento:Link_lb()
local default_progetto = self.default_progetto
if cfg.parameters[self.key_progetto].link == 'Link' then return self:Link_text_lb() end
if default_progetto.link == 'Link' then
if cfg.parameters[self.key_progetto].link == 'LinkWithLanguage' then return self:Link_language_lb() end
if cfg.parameters[self.key_progetto].link == 'LinkRicette' then return self:Link_text_lb() end
elseif default_progetto.link == 'LinkWithLanguage' then
if cfg.parameters[self.key_progetto].link == 'LinkIncubator' then return self:Link_incubator_lb() end
return self:Link_language_lb()
add_error('Errore interno modulo Interprogetto:' .. self.key_progetto)
elseif default_progetto.link == 'LinkRicette' then
return self:Link_text_lb()
elseif default_progetto.link == 'LinkIncubator' then
return self:Link_incubator_lb()
end
add_error('Errore interno modulo Interprogetto')
return ''
end
 
function Collegamento:Link_text()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona, "|Collabora a ",
default_progetto.nome_progetto, "]] '''[[", default_progetto.prefix, "|", default_progetto.nome_progetto, "]]''' contiene ",
self.oggetto, self.lingua, " ", add_space(self.preposizione), self.testo_prima, "'''[[", default_progetto.prefix,
self.collegamento, "|", self.etichetta, "]]'''", self.testo_dopo
Line 284 ⟶ 336:
 
function Collegamento:Link_text_lb()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
return "[[", default_progetto.prefix, self.collegamento, "|", default_progetto.nome_leftbar or default_progetto.nome_progetto, "]]"
end
 
function Collegamento:Link_ricette()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona,
"|Collabora a ", default_progetto.nome_progetto, "]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di '''[[b:|Wikibooks]] contiene ''' contiene [[",
default_progetto.prefix, self.collegamento, "|ricette]]''' relative a questo argomento"
end
 
function Collegamento:Link_language()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
local main_page_link = tostring(mw.uri.fullUrl(default_progetto.prefix, {uselang='it'}))
return "* [[File:", default_progetto.icona, "|link=", main_page_link, "|", default_progetto.dimensione_icona, "|Collabora a ",
default_progetto.nome_progetto, "]] '''<span class=\"plainlinks\">[", main_page_link, " ", default_progetto.nome_progetto,
"]</span>''' contiene ", self.oggetto, " ", add_space(self.preposizione), self.testo_prima,
"'''<span class=\"plainlinks\">[", tostring(mw.uri.fullUrl(default_progetto.prefix .. self.collegamento, {uselang='it'})),
" ", self.etichetta, "]</span>'''", self.testo_dopo
Line 306 ⟶ 358:
 
function Collegamento:Link_language_lb()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
return "<span class=\"plainlinks\" title=\"", default_progetto.prefix , self.collegamento, "\">[",
tostring(mw.uri.fullUrl(default_progetto.prefix .. self.collegamento, {uselang='it'})), " ",
Line 313 ⟶ 365:
 
function Collegamento:Link_incubator()
local default_progetto = cfg.parameters[self.key_progetto]default_progetto
local oggetto = self.oggetto
if not cfg.prefix_incubator[oggetto] then
Line 328 ⟶ 380:
end
return "* [[File:", default_progetto.icona, "|link=", main_page_incubator, "|", default_progetto.dimensione_icona,
"|Collabora a Incubator]] '''<span class=\"plainlinks\">[", main_page_incubator, " Incubator]</span>''' contiene un test su ",
main_page_progetto, self.lingua, " ", add_space(self.preposizione), "'''<span class=\"plainlinks\">[", collegamento, " ", self.etichetta, "]</span>'''"
end
Line 340 ⟶ 392:
local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', cfg.prefix_incubator[oggetto],
'/', self.collegamento}), {uselang='it'}))
return mw.message.newRawMessage("<span class=\"plainlinks\" title=\"$1\">[$2 Incubator]</span>", {self.etichetta, collegamento}):plain()
end
-- ============================================================================================================
Line 348 ⟶ 400:
-- ============================================================================================================
-- Scandisce la tabella progetti e produce il codice html per l'elenco dei collegamenti nella barra di sinistra
-- Imposta il tag div id="interProject" (vedi accessorio [[MediaWiki:Gadget-InterProject.js]] incluso da [[Mediawiki:Common.js]])
-- ============================================================================================================
local function RenderLeftBar(progetti)
local leftbar = mw.html.create('ul')
 
local leftbar = mw.html.create('div'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
for _, progetto in ipairs(progetti) do
leftbar:newline()
:tag('li')
leftbar:wikitext('<li class=\"', progetto.badge_leftbar.class, '\" title=\"', progetto.badge_leftbar.title, '\">')
leftbar :wikitextattr('title', progetto:Link_lb().badge_leftbar.title)
:addClass(progetto.badge_leftbar.class)
if cfg.parameters[progetto.key_progetto].nome_leftbar then
leftbar :wikitext('<br />(', cfg.parameters[progetto.key_progetto].nome_progetto, ':Link_lb()')
if progetto.default_progetto.nome_leftbar then
leftbar:wikitext('<br />(', progetto.default_progetto.nome_progetto, ')')
end
leftbar:wikitext('</li>')
end
root
:tag('div')
:attr('id', 'interProject')
:addClasscssText('toccoloursdisplay: none')
:cssText('display: none; clear: both; margin-top: 2em')
:tag('p')
:attr('id', 'sisterProjects')
:cssText('background-color: #efefef; font-weight: bold; margin: 0')
:tag('span')
:wikitext('Altri progetti')
:done()
:done()
:node(leftbar)
end
Line 388 ⟶ 433:
-- ============================================================================================================
-- Confronta i collegamenti manuali con quelli automatici e genera le categorie di classificazione nei casi di:
-- - Presenza di link manuale e assenza di link su wikidata
-- - Differenza tra link manuale e link su wikidata
-- - Differenza tra link manuale a categoria e e categoria su wikidata
-- - Presenza di link manuale a categoria e a catagoria su wikidta
-- ============================================================================================================
local function check_with_wikidata(key_progetto, entity, collegamento)
if collegamento == nil then return end -- se non c'è un collegamento manuale ritorna immediatamente
local entity_collegamento = entity.collegamenti[key_progetto]
-- si assicura che il collegamento manuale inizi con la 'C' maiuscola se è una categoria
local collegamento_normalizzato = collegamento and ustring.gsub(collegamento, '^category:', 'Category:')
local collegamento_is_categorycollegamento_normalizzato = collegamento and mw.ustring.gsub(collegamento_normalizzatocollegamento, '^category:', 'Category:')
iflocal collegamento_is_category then= mw.ustring.find(collegamento_normalizzato, '^Category:')
-- Check se il collegamento manuale è una categoria, se il tipo di progetto prevede una proprietà a parte
-- per le categorie e se la sua consultazione non è stata disabilitata
if collegamento_is_category and cfg.automatic_link[key_progetto].property_category and entity.from_property_category[key_progetto] ~= false then
-- se esiste un collegamento su wikidata dalla proprietà per la categoria la confronta con quello manuale
if entity.from_property_category[key_progetto] then
if entity_collegamento ~= collegamento_normalizzato then
add_category(cfg.automatic_link[key_progetto].category_wikidata_category_diff)
end
-- se non esiste un collegamento manuale su wikidata lo marca come assente
else
add_category(cfg.automatic_link[key_progetto].category_wikidata_category_missing)
end
else
local article_link
if entity.article[key_progetto] then
-- recupera il collegamento automatico alla voce (può essere in entity.article_link[key_progetto] o
if entity.article[key_progetto] ~= collegamento_normalizzato then
-- in entity.collegamento[key_progetto] a seconda del sitelink e della proprietà per le categorie)
if entity.from_property_category[key_progetto] then
article_link = entity.article_link[key_progetto]
else
article_link = entity_collegamento
end
-- Se ha recuperato un valore per article_link lo confronta con quello normalizzato
-- altrimenti aggiunge il tracking di collegamento mancante in wikidata
if article_link then
if article_link ~= collegamento_normalizzato then
add_category(cfg.automatic_link[key_progetto].category_wikidata_diff)
end
Line 424 ⟶ 484:
 
-- se chiamata da una sandbox carica la configurazione della sandbox
--if nil ~= string.find (frame:getTitle(), 'sandbox', 1, true) then
cfg = mw.loadData('Module:Interprogetto/Configurazione/sandbox')
--else
--cfg = mw.loadData('Module:Interprogetto/Configurazione')
--end
local origArgs
-- ========================================================================================================
Line 474 ⟶ 534:
default.etichetta = origArgs.etichetta
else
if entity.etichetta then
local wikidata_label = entity:getLabel('it')
if is_defined(wikidata_label) then
-- Elimina un eventuale "Categoria:" in fronte del nome
default.etichetta = mw.ustring.gsub(wikidata_labelentity.etichetta, '^Categoria:', '')
else
-- Elimina un'eventuale disambigua dal nome
Line 487 ⟶ 546:
if entity.corsivo then
default.etichetta = '<span style=\"font-style:italic;\">' .. default.etichetta .. '</span>'
default.etichetta_lower = '<span style=\"font-style:italic;\">' .. default.etichetta .. '</span>'
end
end
Line 507 ⟶ 566:
local newArgs = {}
local nolink = false
newArgs.orig_s = origArgs.s
for key, value in pairs(origArgs) do
if tonumber(key) then
Line 514 ⟶ 574:
add_error('Collegamento a \"' .. value .. '\" inserito sia come parametro posizionale che nominale')
else
if key_progetto == 's' then newArgs.orig_s = key_progetto end
newArgs[key_progetto] = get_default_collegamento(key_progetto, default.current_fullpagename)
end
Line 545 ⟶ 606:
end
-- ====================================================================================================
-- Aggiunge il collegamento da Wikidata se non è presente quello compilato manualmente o se rinvia a
-- un progetto in lingua non italiana che non è registrato nella configurazione e non va sovrascritto
-- ====================================================================================================
for key_progetto, collegamento in pairs(entity.collegamenti) do
if not entitycfg.disambiguaautomatic_link[key_progetto] or not (cfg.parametersnewArgs[key_progetto] andor newArgs[cfg.parametersautomatic_link[key_progetto].abilita_in_disambiguaalias]) then
newArgs[key_progetto] = collegamento
if not newArgs[key_progetto] and not (cfg.automatic_link[key_progetto].alias and newArgs[cfg.automatic_link[key_progetto].alias]) then
newArgs[key_progetto]-- =Segnala che il collegamento è stato aggiunto da Wikidata
add_category(cfg.automatic_link[key_progetto:match('^[^_]+')].category_wikidata)
-- Segnala che il collegamento è stato aggiunto da Wikidata
add_category(cfg.automatic_link[key_progetto].category_wikidata)
end
end
end
Line 563 ⟶ 623:
local collegamento_found = false
for key_progetto, collegamento in pairs(newArgs) do
if cfg.parameters[key_progetto] or entity.collegamenti[key_progetto] then
-- Salta i collegamenti a Wikidata per le voci nel namespace principale eccetto che per la Pagina principale
if key_progetto ~= 'wikidata' or current_namespace ~= 0 or current_pagename == 'Pagina principale' then
Line 569 ⟶ 629:
if progetto then
collegamento_found = true
-- Se è disambigua registra solo i valori per i progetti abilitati in disambigua
end
if not entity.disambigua or cfg.parameters[key_progetto] and cfg.parameters[key_progetto].abilita_in_disambigua then
-- Se è disambigua registra solo i valori per i progetti abilitati in disambigua
if not entity.disambigua or cfg.parameters[key_progetto].abilita_in_disambigua then
if progetto then
progetti[#progetti+1] = progetto
add_category(cfg.parameters[key_progetto].categoria)
end
end