Modulo:Interprogetto

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