Vai al contenuto

Modulo:Interprogetto

Da Wikiquote, aforismi e citazioni in libertà.

Modulo Lua per svolgere le funzioni di {{Interprogetto}}.


-- Modulo per implementare le funzionalità del [[Template:Interprogetto]]
local p = {} -- per l'esportazione delle funzioni del modulo

local progetti = {} -- dati da usare per la costruzione delle righe dell'elenco di link ai progetti
local root = mw.html.create('') -- radice del markup html
local debug = {} -- per debug

local function dump(t, ...)
    local args = {...}
    for _, s in ipairs(args) do
        table.insert(t, s)
    end
end

local function sort_by_first(t1, t2)
    -- Per ordinare una tabella in base al valore del primo elemento della tabella stessa
    if t1[1] < t2[1] then
        return true
    end
end

local function add_space(s)
    -- Ritorna uno spazio se l'ultimo carattere non è un apostrofo
    if mw.ustring.sub(s, -1) == "'" then
        return ""
    else
        return " "
    end
end

local function is_defined(s)
    -- Ritorna la stringa se è definita e diversa da stringa nulla, altrimenti nil
    if s and s ~= "" then return s end
    return nil
end


local function Link(intext, pos, in_stampa)
    -- Restituisce il link nel caso normale di progetto senza interfaccia in lingua.
    -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
    local p = progetti
    local text = ""
    if intext then
        if in_stampa then
            text = table.concat({"* [[File:", p.icona[pos], "|", p.dimensione_icona[pos], "]] ",
                        p.messaggio_stampa[pos], "'''", p.base_url[pos],
                        tostring(mw.uri.localUrl( p.collegamento[pos] )), "'''" })
        else
            text = table.concat({"* [[File:", p.icona[pos], "|link=", p.prefix[pos], "|",
                        p.dimensione_icona[pos], "|Collabora a ", p.nome_progetto[pos],
                        "]]", p.prefix_site[pos], " ", "'''[[", p.prefix[pos], "|",
                        p.nome_progetto[pos], "]]'''", " contiene ", p.oggetto[pos], p.lingua[pos],
                        " ", p.preposizione[pos], add_space(p.preposizione[pos]),
                        p.testo_prima[pos], "'''[[", p.prefix[pos], p.collegamento[pos], "|",
                        p.etichetta[pos], "]]'''", p.testo_dopo[pos] })
        end
    else
        text = table.concat({"[[", p.prefix[pos], p.collegamento[pos], "|",
                    p.nome_progetto[pos], "]]", p.prefix_site[pos] })
    end
    return text
end

local function LinkRicette(intext, pos, in_stampa)
    -- Restituisce il link per le ricette su wikibooks.
    -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
    local p = progetti
    local text = ""
    if intext then
        if in_stampa then
            text = table.concat({"* [[File:", p.icona[pos], "|", p.dimensione_icona[pos], "]] ",
                        p.messaggio_stampa[pos], "'''", p.base_url[pos],
                        tostring(mw.uri.localUrl( p.collegamento[pos] )), "'''" })
        else
            text = table.concat({"* [[File:", p.icona[pos], "|link=", p.prefix[pos], "|",
                        p.dimensione_icona[pos], "|Collabora a ", p.nome_progetto[pos],
                        "]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di ",
                        "'''[[b:|Wikibooks]]''' contiene ", p.oggetto[pos],
                        " ", p.preposizione[pos], add_space(p.preposizione[pos]),
                        p.testo_prima[pos], "'''[[", p.prefix[pos], p.collegamento[pos], "|",
                        p.etichetta[pos], "]]'''", p.testo_dopo[pos] })
        end
    else
        text = table.concat({"<span class=\"plainlinks\" title=\"", p.etichetta[pos], "\">[",
                    tostring(mw.uri.fullUrl( p.prefix[pos] .. p.collegamento[pos] )),
                    " ", p.nome_progetto[pos], "]</span>" })
    end
    return text
end

local function LinkWithLanguage(intext, pos, in_stampa)
    -- Restituisce il link verso progetti con interfaccia in lingua (seleziona automaticamente quella italiana).
    -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
    local p = progetti
    local text = ""
    if intext then
        if in_stampa then
            text = table.concat({"* [[File:", p.icona[pos], "|", p.dimensione_icona[pos], "]] ",
                        p.messaggio_stampa[pos], "'''", p.base_url[pos],
                        tostring(mw.uri.localUrl( p.collegamento[pos] )), "'''" })
        else
            local main_page_link = ""
            main_page_link = tostring(mw.uri.fullUrl( p.prefix[pos] , {uselang='it'} ))
            text = table.concat({"* [[File:", p.icona[pos], "|link=", main_page_link, "|",
                        p.dimensione_icona[pos], "|Collabora a ", p.nome_progetto[pos],
                        "]]", " ", "'''<span class=\"plainlinks\">[", main_page_link, " ",
                        p.nome_progetto[pos], "]</span>'''", " contiene ", p.oggetto[pos],
                        " ", p.preposizione[pos], add_space(p.preposizione[pos]),
                        p.testo_prima[pos], "'''<span class=\"plainlinks\">[",
                        tostring(mw.uri.fullUrl( p.prefix[pos] .. p.collegamento[pos], {uselang='it'} )),
                        " ", p.etichetta[pos], "]</span>'''", p.testo_dopo[pos] })
        end
    else
        text = table.concat({"<span class=\"plainlinks\" title=\"", p.etichetta[pos], "\">[",
                    tostring(mw.uri.fullUrl( p.prefix[pos] .. p.collegamento[pos], {uselang='it'} )),
                    " ", p.nome_progetto[pos], "]</span>" })
    end
    return text
end

local function LinkIncubator(intext, pos, in_stampa)
    -- Restituisce il link verso progetti in incubator.
    -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
    local p = progetti
    local text = ""
    local prefix = {
        wikipedia = 'Wp',
        wikiquote = 'Wq',
        wikibooks = 'Wb',
        wiktionary = 'Wt',
        wikizionario = 'Wt',
        wikinews = 'Wn',
        wikinotizie = 'Wn',
        wikivoyage = 'Wy'
    }

    local oggetto = p.oggetto[pos]
    if not(prefix[oggetto]) then
        oggetto = 'wikipedia'
    end
    local collegamento = tostring(mw.uri.fullUrl( table.concat({"incubator:", prefix[oggetto],
                            "/", p.collegamento[pos] }), {uselang='it'} ))
    if intext then
        if in_stampa then
            text = table.concat({"* [[File:", p.icona[pos], "|", p.dimensione_icona[pos], "]] ",
                        p.messaggio_stampa[pos], "'''", collegamento, "'''" })
        else
            local main_page_incubator = ""
            local main_page_progetto = ""
            main_page_incubator = tostring(mw.uri.fullUrl( "incubator:Incubator:Main Page/it", {uselang='it'} ))
            if oggetto == 'wikiquote' then
                main_page_progetto = '[[Pagina principale|Wikiquote]]'
            else
                main_page_progetto = table.concat({"[[", oggetto, ":it:|",
                                        oggetto:gsub("^%l", string.upper), "]]" })
            end
            text = table.concat({"* [[File:", p.icona[pos], "|link=", main_page_incubator, "|",
                        p.dimensione_icona[pos], "|Collabora a ", p.nome_progetto[pos],
                        "]]", " ", "'''<span class=\"plainlinks\">[", main_page_incubator, " ",
                        p.nome_progetto[pos], "]</span>''' contiene un test per ", main_page_progetto,
                        p.lingua[pos], " ", p.preposizione[pos], add_space(p.preposizione[pos]),
                        "'''<span class=\"plainlinks\">[", collegamento,
                        " ", p.etichetta[pos], "]</span>'''" })
        end
    else
        -- Imposta il nome del sottotitolo da usare per il link nella barra di sinistra
        progetti.nome_leftbar[pos] = oggetto:gsub("^%l", string.upper)
        text = table.concat({"<span class=\"plainlinks\" title=\"", p.etichetta[pos], "\">[",
                    collegamento, " ", p.nome_progetto[pos], "]</span>" })
    end
    return text
end


-- default_parameter: contiene i valori di default dei parametri per tutti i progetti disponibili
--   priorità: ordine di priorità in cui visualizzare il link del progetto (un numero intero)
--   funzione da richiamare per inserire il link del progetto
--   prefisso_progetto: prefisso da usare per il link del progetto
--   prefisso_lingua: codice della lingua da usare per il link del progetto (solo per link a progetti in altra lingua)
--              (false se disabilitato, altrimenti una stringa vuota, oppure 'en' come valore predefinito per wikipedia)
--   nome_progetto: nome del progetto
--   nome_leftbar: nome del sottotitolo da usare per il link del progetto nella barra di sinistra
--              (false se disabilitato, altrimenti una stringa, da usare per esempio per wikiricette)
--   logo del progetto: nome del file che contiene il logo del progetto
--   dimensioni del logo: dimensioni da usare per il logo del progetto
--   oggetto standard: complemento oggetto nella frase standard ('opere originali', 'testi o manuali', ecc...)
--   preposizione standard: preposizione da anteporre all'etichetta nella frase standard ('di o su', 'riguardanti', ecc...),
--              (se è false non viene inserita e/o modificata)
--   testo di apertura intorno all'etichetta: stringa vuota o testo da usare immediatamente prima dell'etichetta
--              (usata per esempio dal wikizionario per la virgoletta di apertura)
--   testo di chiusura intorno all'etichetta: stringa vuota o testo di chiusura da usare immediatamente dopo l'etichetta
--              (usata per esempio dal wikizionario per la virgoletta di chiusura)
--   lingua originale: lingua di un testo linkato (false se non è possibile impostarla, true per i progetti per cui si può impostare).
--              da usare per i progetti che prevedono l'inserimento di 'in lingua xxxxx'
--              tra il nome del progetto e l'etichetta standard per il tipo di contenuto
--   messaggio da visualizzare in stampa
--   collegamento da visualizzare in stampa

local default_parameter = {
    wikipedia =    {1, Link, 'wikipedia:', 'en', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'una voce', 'riguardante', '', '' , false, "'''Wikipedia''' contiene la voce in inglese: ", "https://en.wikipedia.org"},
    w =            {2, Link, 'w:', '', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'una voce', 'riguardante', '', '' , true, "'''Wikipedia''' contiene la voce: ", "https://it.wikipedia.org"},
    w2 =           {3, Link, 'w:', '', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'inoltre una voce', 'riguardante', '', '' , true, "'''Wikipedia''' contiene la voce: ", "https://it.wikipedia.org"},
    wikisource =   {4, Link, 'wikisource:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', false, "'''Wikisource''' contiene opere originali in inglese: ", 'https://en.wikisource.org'},
    s =            {5, Link, 's:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
    s2 =           {6, Link, 's:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
    testo =        {7, Link, 's:', false, 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
    testo2 =       {8, Link, 's:', false, 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'inoltre il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
--  disabilitato: siamo già qui!
--  wikiquote =    {9, Link, 'wikiquote:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , false, "'''Wikiquote''' contiene citazioni in inglese: ", "https://en.wikiquote.org"},
--  q =            {10, Link, 'q:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "https://it.wikiquote.org"},
--  q2 =           {11, Link, 'q:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'inoltre citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "https://it.wikiquote.org"},
    wikibooks =    {12, Link, 'wikibooks:', false, 'Wikibooks', false, 'Wikibooks-logo.svg', '18px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali in inglese: ", "https://en.wikibooks.org"},
    b =            {13, Link, 'b:', false, 'Wikibooks', false, 'Wikibooks-logo.svg', '18px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali: ", "https://it.wikibooks.org"},
    ricetta =      {14, LinkRicette, 'b:Libro di cucina/Ricette/', false, 'Wikibooks', 'Ricette', 'Wikibooks-logo.svg', '18px', 'ricette', 'relative a', '', '' , false, "'''Wikibooks''' contiene la ricetta: ", "https://it.wikibooks.org/Libro di cucina/Ricette"},
    wiktionary =   {15, Link, 'wiktionary:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario in inglese: ", "https://en.wiktionary.org"},
    wikt =         {16, Link, 'wikt:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario: ","https://it.wiktionary.org"},
    wikt2 =        {17, Link, 'wikt:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario: ","https://it.wiktionary.org"},
    wikiversity =  {18, Link, 'wikiversity:', false, 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni in inglese: ", "https://en.wikiversity.org"},
    v =            {19, Link, 'v:', false, 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni: ", "https://it.wikiversity.org"},
    wikinews =     {20, Link, 'wikinews:', false, 'Wikinotizie', false, 'Wikinews favicon.svg', '18px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità in inglese: ", "https://en.wikinews.org"},
    n =            {21, Link, 'n:', false, 'Wikinotizie', false, 'Wikinews favicon.svg', '18px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", "https://it.wikinews.org"},
    wikivoyage =   {22, Link, 'wikivoyage:', false, 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', '', '', false, "'''Wikivoyage''' contiene informazioni turistiche in inglese: ", "https://en.wikiwoyage.org"},
    voy =          {23, Link, 'voy:', false, 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', '', '', false, "'''Wikivoyage''' contiene informazioni turistiche: ", "https://it.wikiwoyage.org"},
    species =      {24, LinkWithLanguage, 'species:', false, 'Wikispecies', false, 'Wikispecies-logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "https://species.wikimedia.org"},
    wikispecies =  {25, LinkWithLanguage, 'wikispecies:', false, 'Wikispecies', false, 'Wikispecies-logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "https://species.wikimedia.org"},
    wikidata =     {26, LinkWithLanguage, 'wikidata:', false, 'Wikidata', false, 'Wikidata-logo.svg', '20px', 'informazioni', 'su', '', '', false, "'''Wikidata''' contiene informazioni: ", 'https://www.wikidata.org'},
    d =            {27, LinkWithLanguage, 'd:', false, 'Wikidata', false, 'Wikidata-logo.svg', '20px', 'informazioni', 'su', '', '', false, "'''Wikidata''' contiene informazioni: ", 'https://www.wikidata.org'},
    commons =      {28, LinkWithLanguage, 'commons:', false, 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "https://commons.wikimedia.org"},
    c =            {29, LinkWithLanguage, 'c:', false, 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "https://commons.wikimedia.org"},
    meta =         {30, LinkWithLanguage, 'meta:', false, 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "https://meta.wikimedia.org"},
    m =            {31, LinkWithLanguage, 'm:', false, 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "https://meta.wikimedia.org"},
    mw =           {32, LinkWithLanguage, 'mw:', false, 'Mediawiki', false, 'MediaWiki-notext.svg', '18px', 'informazioni', 'su', '', '', false, "'''Mediawiki''' contiene informazioni: ", "https://www.mediawiki.org"},
    incubator =    {33, LinkIncubator, 'incubator:', false, 'Incubator', 'true', 'Incubator-notext.svg', '18px', '', 'su', '', '', true, "'''Wikimedia Incubator''' contiene un test: ", "https://incubator.wikimedia.org"}
}


local automatic_link = {
    -- Tabella dei link gestiti in automatico se assenti, basandosi sui dati di wikidata.
    -- Formata da coppie "codice progetto" (come compare nella tabella sopra) e nome proprietà
    -- su wikidata con il link al progetto, più l'opzione per la categorizzazione (disabilitata)
    w = {interwiki = 'itwiki', category = nil },
    s = {interwiki = 'itwikisource', category = nil },
--  disabilitato: siamo già qui!
--  q = {interwiki = 'itwikiquote', category = nil },
    n = {interwiki = 'itwikinews', category = nil },
    voy = {interwiki = 'itwikivoyage', category = nil },
    wikidata = {interwiki = 'wikidatawiki', category = nil },
    commons = {interwiki = 'commonswiki', category = nil },
    v = {interwiki = 'itwikiversity', category = nil },
    species = {interwiki = 'specieswiki', category = nil },
    b = {interwiki = 'itwikibooks', category = nil }
}

local automatic_link_bis = {
    -- Tabella delle corrispondenze tra i "codici progetto" (come compaiono nella tabella sopra).
    -- Evita che wikidata aggiunga il link automatico se esiste già un link a uno di questi progetti
    testo = 's',
    testo2 = 's',
    d = 'wikidata',
    c = 'commons',
    v = 'wikiversity',
    wikispecies = 'species',
    b = 'wikibooks'
}

-- L'identificatore P31 corrisponde alla proprietà di wikidata "istanza di" [[d:Property:P31]]
local instance_of = 'P31'

local check_property = {
    commons = 'P373'
}

local check_opera = {
    -- Tabella dei possibili valori per la proprietà "istanza di" nel caso di opere.
    -- Formata da coppie nome e identificatore di wikidata
    opera = '386724', -- opera (generica)
    film = '11424',
    cortometraggio = '24862',
    film_collettivo = '336144',
    film_animazione = '202866',
    programma_televisivo = '15416',
    programma_radiofonico = '1555508',
    film_TV = '506240',
    serie_TV_o_radio = '15709880',
    serie_televisiva = '5398426',
    serie_televisiva_animata = '581714',
    anime = '1107',
    fumetto = '1004',
    manga = '8274',
    dramma = '25379',
    opera_lirica = '1344', -- opera (lirica)
    musical = '2743',
    rivista = '41298',
    periodico = '1092563',
    opera_letteraria = '7725634',
    libro = '571',
    testi_sacri = '179461',
    testo_scritto = '17481121',
    videogioco = '7889',
    -- Per aggiungere a questa lista un elemento di wikidata del tipo [[d:Qxxxxxx]],
    -- inserire qui sopra una nuova riga con la seguente sintassi:
    -- nome_valore = 'xxxxxx',
    -- NOTA BENE: LA VIRGOLA!!!
}

local namespace_whitelist = {
	-- Tabella dei namespace per i quali abilitare l'inserimento nelle
	-- categorie di errore/avviso
	[0] = true,
	[4] = true,
	[6] = true,
	[8] = true,
	[10] = true,
	[12] = true,
	[14] = true,
	[100] = true
}

local function is_wikizionario(rif)
    -- Ritorna vero se il riferimento è al wikizionario/wiktionary
    return (rif == 'wiktionary' or rif == 'wikt' or rif == 'wikt2')
end

local function is_wikidata(rif)
    -- Ritorna vero se il riferimento è a wikidata
    return (rif == 'wikidata' or rif == 'd')
end

local function template_lingua(lang_code)
    -- Riproduce i template per i link a siti in altra lingua; vedi "Categoria:Template collegamenti esterni"
    local text = ""
    text = table.concat({" (<span style=\"font-weight: bolder; font-size: smaller; color:#002BD0;\" title=\"{{nomelingua|",
                lang_code, "}}\">", string.upper(lang_code), "</span>)" })
    return text
end


local function RenderLeftBar()
    -- Scandisce la tabella progetti e crea la barra di sinistra con i link interprogetto.
    -- Costruisce le righe per la barra di sinistra come un elenco puntato.
    local leftbar = mw.html.create('ul'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
    for i = 1, #progetti.ordine do
        local pos = progetti.ordine[i][2]
        local link = progetti.link[pos]
        leftbar:newline()
        leftbar:wikitext('<li class="', progetti.badge_leftbar[pos], '">')
        leftbar:wikitext(link(false, pos))
        if progetti.nome_leftbar[pos] then
            -- Inserisce l'eventuale nome del sottotitolo del progetto (tra parentesi, con caretteri più piccoli)
            leftbar:wikitext('<br /><small>(', progetti.nome_leftbar[pos], ')</small>')
        end
        leftbar:wikitext('</li>')
    end
    -- Apertura del tag div id="interProject" (vedi [[Commons:MediaWiki:InterProject.js]] incluso da [[Mediawiki:Common.js]])
    root
    :tag('div')
        :attr('id', 'interProject')
        :attr('class', 'toccolours')
        :cssText('display: none; clear: both; margin-top: 2em')
        :tag('p')
            :attr('id', 'sisterProjects')
            :cssText('background-color: #efefef; font-weight: bold; margin: 0; color:#000')
            :tag('span')
                :wikitext('Altri progetti')
                :done()
            :done()
        :node(leftbar)
end

local function RenderLinksInText(in_stampa)
    -- Scandisce la tabella progetti e produce il codice html per l'elenco puntato dei link interprogetto
    for i = 1, #progetti.ordine do
        local pos = progetti.ordine[i][2]
        local link = progetti.link[pos]
        root:newline()
        root:wikitext(link(true, pos, in_stampa))
    end
end


function p.interprogetto(frame)

    local origArgs
    -- Se chiamata mediante #invoke, usa gli argomenti passati al template invocante,
    -- altrimenti a scopo di test assume che gli argomenti siano passati direttamente
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
    else
        origArgs = frame.args
    end

    local in_stampa = false
    if frame.args['stampa'] then
        in_stampa = true
    end

    local pos = 0
    local add_categories = {}
    local incubator_without_value = false
    local notizia_presente = false

    -- Carico tutti i dati della pagina corrente
    local current_page = mw.title.getCurrentTitle()
    local current_namespace = current_page.namespace
    local current_pagename = current_page.text
    local current_fullpagename = ''
    -- Per i namespace uso il nome canonico (inglese) per non avere differenze tra progetti:
    -- esempio: Utente/User, Categoria/Category, ma anche Wikiquote/Wikipedia (Project), ecc.
    if current_namespace ~= 0 then
        current_fullpagename = mw.site.namespaces[current_namespace].canonicalName .. ':' .. current_pagename
    else
        current_fullpagename = current_pagename
    end

    -- Carico i dati da wikidata se esistono
    local entity = nil
    if mw.wikibase then
        entity = mw.wikibase.getEntityObject()
    end

    local function hasPropertyValue(propertyId, value)
        -- Verifica se una determinata proprietà ha il valore specificato.
        -- Riadattata da "function instanceof(arg)" su [[wikisource:it:Modulo:Autore]]
        if entity and entity.claims and entity.claims[propertyId] then
            local claims = entity.claims[propertyId]
            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' then
                            if datavalue.value['entity-type'] == 'item'
                                and datavalue.value['numeric-id'] == tonumber(value) then
                                    return true
                            end
                        elseif datavalue.type == 'string' then
                            if datavalue.value == value then
                                return true
                            end
                        end
                end
            end
        end
        return false
    end

    -- Cerco su wikidata se la pagina corrente in cui è inserito il template
    -- corrisponde alla voce di un'opera (per la gestione dell'etichetta in corsivo)
    local is_opera = false
    for _, value in pairs(check_opera) do
        if hasPropertyValue(instance_of, value) then
            is_opera = true
        end
    end

    -- Carico l'etichetta globale se specificata
    local etichetta = origArgs.etichetta
    local etichetta_lower = nil
    -- Se non è stata specificata un'etichetta globale, la cerco su wikidata.
    -- Se esiste l'etichetta su wikidata uso questa come etichetta di default dei collegamenti,
    -- altrimenti utilizzo il nome della pagina corrente in cui è inserito il template.
    if etichetta == nil or etichetta == '' then
        if entity and entity.labels and entity.labels.it and entity.labels.it.value ~= '' then
            etichetta = mw.ustring.gsub(entity.labels.it.value, '^Categoria:', '') -- Elimino un'eventuale "Categoria:" in fronte del nome
        else
            etichetta = mw.ustring.gsub(current_pagename, ' %(.*%)$', '') -- Elimino un'eventuale disambigua dal nome
            if current_namespace == 0 then
                etichetta_lower = etichetta:gsub("^%u", string.lower) -- Solo nel namespace principale (per il wikizionario)
            end                                                       -- converto l'iniziale dell'etichetta in minuscolo
        end
        if is_opera then
            etichetta = table.concat({"''", etichetta, "''" }) -- Se è un opera, converto l'etichetta in corsivo
        end
    end

    -- Carico oggetto e preposizione globali, se specificati
    local oggetto = origArgs.oggetto
    local preposizione = origArgs.preposizione
    -- Per le categorie utilizzo una frase standard unificata, se non diversamente specificato
    if current_namespace == 14 then
        oggetto = oggetto or "una categoria"
        preposizione = preposizione or "sull'argomento"
        -- Forzo tutti i progetti (in particolare il wikizionario) a visualizzare la frase standard
        -- con la preposizione (10) e senza le virgolette (11/12)
        for k, _ in pairs(default_parameter) do
            for j = 10, 12 do
                default_parameter[k][j] = ''
            end
        end
    end

    -- Verifico se è una pagina di disambiguazione.
    -- L'identificatore 4167410 corrisponde all'elemento di wikidata [[d:Q4167410]]
    -- "pagina di disambiguazione di un progetto Wikimedia"
    local is_disambigua = hasPropertyValue(instance_of, '4167410')

    -- Carico tutti gli argomenti in una nuova tabella.
    -- Controllo se i valori per i link presenti nella tabella "automatic_link" sono definiti,
    -- in caso contrario provo a leggere il link da wikidata
    local newArgs = {}
    local automatic_found = {}
    local collegamento_found = false
    for key, _ in pairs(automatic_link) do
        automatic_found[key] = false
    end
    for k, value in pairs(origArgs) do
    	newArgs[k] = value
        if automatic_link[k] then
            automatic_found[k] = true
        elseif automatic_link_bis[k] then
            automatic_found[automatic_link_bis[k]] = true
        elseif tonumber(k) and automatic_link[mw.text.trim(value)] then
            automatic_found[mw.text.trim(value)] = true
        elseif tonumber(k) and automatic_link_bis[mw.text.trim(value)] then
            automatic_found[automatic_link_bis[mw.text.trim(value)]] = true
        end
    end
    for key, found in pairs(automatic_found) do
        if not(found) then
            if not(is_disambigua) and entity then
                if entity.sitelinks and entity.sitelinks[automatic_link[key].interwiki] then
                    newArgs[key] = entity.sitelinks[automatic_link[key].interwiki].title
                    if automatic_link[key].category then
                        add_categories[#add_categories+1] = automatic_link[key].category
                    end
                elseif check_property[key] and entity.claims and entity.claims[check_property[key]]
                    and entity.claims[check_property[key]][1]
                    and entity.claims[check_property[key]][1].mainsnak
                    and entity.claims[check_property[key]][1].mainsnak.datavalue
                    and entity.claims[check_property[key]][1].mainsnak.datavalue.type == 'string' then
                        newArgs[key] = 'Category:' .. entity.claims[check_property[key]][1].mainsnak.datavalue.value
                end
            end
        end
    end

    progetti = {
        ordine = {},
        link = {},
        prefix = {},
        prefix_site = {},
        nome_progetto = {},
        nome_leftbar = {},
        badge_leftbar = {},
        collegamento = {},
        etichetta = {},
        icona = {},
        dimensione_icona = {},
        oggetto = {},
        preposizione = {},
        testo_prima = {},
        testo_dopo = {},
        lingua = {},
        messaggio_stampa = {},
        base_url = {}
    }

    -- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link interprogetto
    -- con le opzioni che sono state settate per quel progetto
    for k, collegamento in pairs(newArgs) do
        -- Controlla se k è un parametro posizionale e in questo caso usa il suo valore come nome
        -- del progetto a cui puntare, con pagina corrispondente a quella della pagina corrente in
        -- cui è inserito il template
        if tonumber(k) then
            k = mw.text.trim(collegamento) -- Elimino eventuali spazi iniziali e finali
            if k == 'incubator' then
                k = ''
                incubator_without_value = true -- Se incubator non è valorizzato loggo l'errore
            else
                -- Di default il collegamento al wikizionario è con iniziale in minuscolo
                if is_wikizionario(k) then
                    collegamento = current_fullpagename:gsub("^%u", string.lower)
                else
                    collegamento = current_fullpagename
                end
            end
        end

        -- PRIMA OPZIONE (come da default su Wikipedia)
        -- Se viene specificato un collegamento vuoto, lo valorizzo con il nome della pagina corrente
        -- if collegamento == '' then collegamento = current_fullpagename end
        -- SECONDA OPZIONE (escamotage per annullare eventuali link automatici da wikidata, per esempio |w=)
        -- Se viene specificato un collegamento vuoto, annullo il link al progetto corrispondente
        if collegamento == '' then k = '' end

        -- Disabilito i link a wikidata per le voci (ns0), escludendo la Pagina principale
        if not(is_wikidata(k) or is_wikidata(collegamento))
            or current_namespace ~= 0 or current_pagename == 'Pagina principale' then
            	if default_parameter[k] then
            		collegamento_found = true
            	end
                -- Se è disambigua registro solo i valori per i link al wikizionario
                if is_disambigua
                	and not is_wikizionario( mw.ustring.gsub( k, '_%w*$', '' ) )
                	and not is_wikizionario(collegamento) then
                        k = ''
                end
        end

        -- Se k corrisponde a un progetto inserito nella tabella default_parameter aggiungo una
        -- riga alla tabella progetti con le opzioni da usare per visualizzare il link a quel progetto
        if default_parameter[k] then
            pos = pos+1
            progetti.ordine[pos] = {default_parameter[k][1], pos}
            progetti.link[pos] = default_parameter[k][2]
            progetti.prefix[pos] = default_parameter[k][3]
            if default_parameter[k][4] then
                progetti.prefix_site[pos] = newArgs[k .. '_site'] or default_parameter[k][4]
            end
            progetti.nome_progetto[pos] = default_parameter[k][5]
            progetti.nome_leftbar[pos] = default_parameter[k][6]
            progetti.badge_leftbar[pos] = ''
            progetti.collegamento[pos] = collegamento
            progetti.etichetta[pos] = is_defined(newArgs[k .. '_etichetta'])
                or (is_wikizionario(k) and etichetta_lower) or etichetta
            progetti.icona[pos] = default_parameter[k][7]
            progetti.dimensione_icona[pos] = default_parameter[k][8]
            progetti.oggetto[pos] = newArgs[k .. '_oggetto'] or oggetto or default_parameter[k][9]
            if default_parameter[k][10] then
                progetti.preposizione[pos] = newArgs[k .. '_preposizione'] or preposizione or default_parameter[k][10]
            else
                progetti.preposizione[pos] = ''
            end
            progetti.testo_prima[pos] = default_parameter[k][11]
            progetti.testo_dopo[pos] = default_parameter[k][12]
            if default_parameter[k][13] and newArgs[k .. '_lingua'] then
                progetti.lingua[pos] = table.concat({" in lingua ", newArgs[k .. '_lingua'] })
            else
                progetti.lingua[pos] = ''
            end
            progetti.messaggio_stampa[pos] = default_parameter[k][14]
            progetti.base_url[pos] = default_parameter[k][15]

            -- Se è definito il parametro "_site" per i progetti in altra lingua, aggiungo una
            -- categoria di servizio, aggiorno il prefisso verso il progetto in altra lingua
            -- e predispongo il template corrispondente alla lingua
            if is_defined(progetti.prefix_site[pos]) then
                add_categories[#add_categories+1] = table.concat({"Voci con interprogetto verso ",
                            progetti.nome_progetto[pos], " in altra lingua - ", progetti.prefix_site[pos] })
                progetti.prefix[pos] = table.concat({progetti.prefix[pos], progetti.prefix_site[pos], ":" })
                progetti.prefix_site[pos] = template_lingua(progetti.prefix_site[pos])
            else
                progetti.prefix_site[pos] = ''
            end

            -- Se è definito un collegamento al wikizionario, aggiungo una categoria di servizio
            if is_wikizionario(k) then
                add_categories[#add_categories+1] = "Voci con interprogetto verso Wikizionario"
            end
        end
        if k == 'notizia' then
            notizia_presente = true -- Se notizia è presente loggo l'errore
        end
    end

    if #progetti.ordine > 0 then
        table.sort(progetti.ordine, sort_by_first)
        if not(in_stampa) then
            RenderLeftBar()
        end
        if not(newArgs[1]) or mw.text.trim(newArgs[1]) ~= 'nolink' then
            RenderLinksInText(in_stampa)
        end
    end

    -- Aggiungo eventuali categorie di servizio
    if #add_categories > 0 then
        for _, category in ipairs(add_categories) do
            root:wikitext('[[Categoria:' .. category .. ']]')
        end
    end

    -- Segnalo e categorizzo eventuali errori
    if incubator_without_value then
        root:wikitext('<br /><strong class="error">Errore: il parametro "incubator" deve essere valorizzato</strong>'
            .. '[[Categoria:Errori di compilazione del template Interprogetto]]')
    end
    if notizia_presente then
        root:wikitext('<br /><strong class="error">Errore: parametro "notizia" non valido. Vedi: [[Template:Interprogetto/notizia]]</strong>'
            .. '[[Categoria:Errori di compilazione del template Interprogetto]]')
    end
    if is_disambigua and #progetti.ordine == 0 and collegamento_found then
    	root:wikitext('<br /><strong class="error">Errore: collegamenti non visualizzabili perché la voce è una disambigua su Wikidata</strong>'
            .. '[[Categoria:Errori di compilazione del template Interprogetto - collegamenti in disambigua]]')
    elseif #progetti.ordine == 0 and namespace_whitelist[current_namespace] then
    	root:wikitext('[[Categoria:Errori di compilazione del template Interprogetto - template vuoto]]')
    end
    return tostring(root)
end

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy