La documentation pour ce module peut être créée à Module:TradRef/doc

-- À faire :
-- * Vérifier que le modèle est seulement utilisé dans l'espace de noms principal
-- ** S'inspirer de [[Modèle:Traduction/Référence]]

local moduleLangue = require 'Module:Langue'
local p = {}

function p.getNomProjet(prefixe, projet)

    local prefixes = {
        commons     = 'Wikimedia Commons',
        meta        = 'Meta-Wiki',
        species     = 'Wikispecies',
    }

    local projets = {
        wikibooks   = 'Wikilivres',
        wikidata    = 'Wikidata',
        wikinews    = 'Wikinews',
        wikipedia   = 'Wikipédia',
        wikisource  = 'Wikisource',
        wikiversity = 'Wikiversité',
        wikivoyage  = 'Wikivoyage',
        wiktionary  = 'Wiktionnaire',
    }

    return prefixes[prefixe] or projets[projet] or '(projet inconnu)'
end


function p.parseUrl(url)

    -- Deux formats d'URL :
    -- * https://de.wikipedia.org    /w/index.php?title=    Amandus_(Bagaudenf%C3%BChrer)&oldid=148366994
    -- * https://de.wikipedia.org    /wiki/                 Amandus_(Bagaudenf%C3%BChrer)?oldid=148366994

    local uri = mw.uri.new(url)
    local host, path, query = uri.host, uri.path, uri.query

    if not (host and path and query) then
        return
    end

    local prefixe, projet = host:match('^(%a+)%.(%a+)%.org$')

    local title
    if path == '/w/index.php' and type(query.title) == 'string' and query.title ~= '' then
        title = query.title
    elseif path:sub(1, 6) == '/wiki/' and path:sub(7) ~= '' then
        title = path:sub(7)
    end

    local oldid
    if type(query.oldid) == 'string' and query.oldid:match('^%d+$') then
        oldid = query.oldid
    end

    if prefixe and projet and title and oldid then
        return prefixe, projet, title, oldid
    end
end


function p.getIndicateurAndFragment(url)

    local prefixe, projet, title, oldid = p.parseUrl(url)

    if not prefixe then
        return
    end

    local htmlIndicateur, nomProjet
    if prefixe == 'commons' or prefixe == 'meta' or prefixe == 'species' or prefixe == 'www' then
        -- Pour les wikis multilingues :
        -- * Commons      :  https://commons.wikimedia.org/w/index.php?title=Accueil&oldid=169324172
        -- * Meta-Wiki    :  https://meta   .wikimedia.org/w/index.php?title=Accueil&oldid=15738990
        -- * Wikispecies  :  https://species.wikimedia.org/w/index.php?title=Accueil&oldid=2717007
        -- * Wikidata     :  https://    www.wikidata.org/w/index.php?title=Wikidata:Main_Page&oldid=400496920
        -- Retourne {{mul}} comme indicateur de langue et le fragment de phrase « de la page de Wikimedia Commons en ... (voir liste des auteurs) »
        -- (Les projets sans langue précisée sont, en théorie, multilingues.)
        htmlIndicateur = moduleLangue.indicationMultilingue({})
        nomProjet = p.getNomProjet(prefixe, projet)
    else
        -- Pour les wikis unilingues (WIKT.ES, WP.EN, WS.DE...)
        -- Retourne l'indicateur de langue et le fragment de phrase « de la page de Wiki... en ... (voir liste des auteurs) »
        htmlIndicateur = moduleLangue.indicationDeLangue({'', prefixe})
        nomProjet = p.getNomProjet(prefixe, projet) .. ' en ' .. moduleLangue.lienLangue(prefixe)
    end

    -- Remplacer %C3%B par un caractère Unicode, et _ par une espace
    local titleDecoded = mw.uri.decode(title, 'WIKI')

    local linkOldid   = '<span class="plainlinks">[//' .. prefixe .. '.' .. projet .. '.org/w/index.php?title=' .. title .. '&oldid=' .. oldid .. ' ' .. titleDecoded .. ']</span>'
    local linkHistory = '<span class="plainlinks">[//' .. prefixe .. '.' .. projet .. '.org/w/index.php?title=' .. title .. '&action=history voir la liste des auteurs]</span>'

    local htmlFragment = 'de la page de ' .. nomProjet .. ' intitulée « ' .. linkOldid .. ' » <small>(' .. linkHistory .. ')</small>'

    return htmlIndicateur, htmlFragment
end


function p.ConstruireTradRef(frame)
    local args = frame:getParent().args
    local hasErrors = false

    -- Selon les « préfixes » d'URL (en, de, www, commons...), noter des informations
    local indicateurs = {}
    local fragments = {}
    for i = 1, 5 do
        local nomParam = 'url'..i
        if i == 1 and not args.url1 and args.url then
            nomParam = 'url'
        end
        local url = args[nomParam]
        if not url then
            break
        end
        indicateurs[i], fragments[i] = p.getIndicateurAndFragment(url)
        if not indicateurs[i] then
            indicateurs[i], fragments[i] = '-', 'paramètre <code>'..nomParam..'</code> invalide'
            hasErrors = true
        end
    end

    -- Composer le message à l'intention des lecteurs
    local html
    if not args.url1 and not args.url then
        html = 'Chaque paramètre url1, url2, url3... doit être suivi d\'une adresse web.'
        hasErrors = true
    elseif args.url6 then
        html = 'Le modèle n\'accepte pas plus que 5 adresses web.'
        hasErrors = true
    else
        html = '<p><span style="padding-left: 1.2em;">'
            .. mw.text.listToText(indicateurs, '/', '/')
            .. ' Cet article est partiellement ou en totalité issu '
            .. mw.text.listToText(fragments)
            .. '.</span></p>'
    end

    if hasErrors then
        html = html .. '[[Kategori:Page utilisant le modèle TradRef avec une syntaxe erronée]]'
    end

    return html
end


return p