La documentation pour ce module peut être créée à Module:langues/analyse/Documentation

b = require("Module:bases")
l = require("Module:langues")

local wlangues = mw.loadData('Module:langues/data')

p = {}

-- Recherche la langue dans la liste de Wikimedia
function p.get_nom_wikimedia(code)
    if (code) then
        local langue = mw.language.fetchLanguageName(code, 'fr') -- fr = nom en français
        
        -- Langue trouvée ? On renvoie nil si c'est vide, pas ''
        if (langue ~= nil and langue ~= '') then
            return langue
        else
            return nil
        end
    else
        return nil
    end
end

-- AFFICHAGE DES LANGUES
-- Affiche directement le nom de la langue
function p.affiche_nom_wikimedia(frame)
    local code = frame.args[1]
    if (code == nil) then
        return 'Pas de code langue donné'
    end
    
    -- Récupère la langue dans la liste Wikimedia
    local langue = p.get_nom_wikimedia(code)
    
    -- A-t-on un résultat ?
    if (langue ~= nil and langue ~= '') then
        return langue
    else
        return 'Pas de langue Wikimédia'
    end
end

function p.sort_nom_langue(nom_langue)
	-- retourne nil si la langue ne contient pas de caractère spécial
	if mw.ustring.toNFD(nom_langue) == nom_langue and not mw.ustring.find(nom_langue, '[’)(]') then
		return
	end
	-- retourne la clé de tri sinon
	cle_de_tri = mw.ustring.toNFD(nom_langue)
	cle_de_tri = mw.ustring.gsub(cle_de_tri, '[^%a-]', '')
	cle_de_tri = mw.ustring.gsub(cle_de_tri, 'æ',        "ae")
	cle_de_tri = mw.ustring.gsub(cle_de_tri, '[œ]',      "oe")
	cle_de_tri = mw.ustring.gsub(cle_de_tri, "['’)(]",   "")
	cle_de_tri = mw.ustring.gsub(cle_de_tri, '[-\/]',    " ")
	return cle_de_tri
end

function p.sort_langues(tab1, tab2)
	t1 = wlangues[tab1]['tri'] and wlangues[tab1]['tri'] or p.sort_nom_langue(wlangues[tab1]['nom']) or wlangues[tab1]['nom']
	t2 = wlangues[tab2]['tri'] and wlangues[tab2]['tri'] or p.sort_nom_langue(wlangues[tab2]['nom']) or wlangues[tab2]['nom']
    if t1 < t2 then
        return true
    else
        return false
    end
end

-- Affiche les langues
-- (seules les langues locales, je ne sais pas si on peut récupérer un tableau de Wikimédia)
function p.affiche_tableau_langues_locales(frame)
    local titres = {'n', 'Code', 'Nom', 'Lien Wikimédia'}
    
    -- Récupère les clés
    local keyset={}
    local n=0
    
    for k,v in pairs(wlangues) do
      n=n+1
      keyset[n]=k
    end
    
    -- Intro
    local textet_tableau = {"Cette liste est générée automatiquement à partir de [[Module:langues/data]].\r\n\r\nIl y a actuellement " .. n .. " codes langues dans cette liste.\r\nLa liste peut être triée par nom de langue (défaut) ou par code."}
    
    -- Tri par nom de langue
    table.sort(keyset, p.sort_langues)
    
    table.insert(textet_tableau, b.tableau_entete(titres))
    for k, code in ipairs(keyset) do
        local infos = wlangues[code]
        local langue = infos['nom'] or 'NOM MANQUANT'
        local langue_tri = infos['tri'] or p.sort_nom_langue(langue) or langue
        local langue_cat = b.fait_categorie(langue, langue, true)
        local langue_col = 'data-sort-value="' .. langue_tri .. '"|' .. langue_cat
        local lien_WM = infos['wmlien'] or ''
        local ligne = {k, '<span id="' .. code ..'">' .. code .. '</span>', langue_col, lien_WM}
        table.insert(textet_tableau, b.tableau_ligne(ligne))
    end
    
    table.insert(textet_tableau, b.tableau_fin())
    return table.concat(textet_tableau, "\r\n")
end

-- Affiche la liste des langues en format python
function p.affiche_langues_python(frame)
    -- Récupère les clés
    local keyset={}
    local n=0
    
    local debut = "<pre>\r\nlangues = {\r\n"
    local fin = "\r\n}\r\n</pre>\r\n"
    local lignes = {}
    for k,v in pairs(wlangues) do
      --table.insert(lignes, "\t'" .. k .. "': '" ..v .. "'")
      table.insert(lignes, '\t"' .. k .. '": "' .. v['nom'] .. '",')
    end
    
    local liste_python = debut .. table.concat(lignes, "\r\n") .. fin
    return liste_python
end

-- À partir d'une liste de codes donnés en paramètres:
-- 1) vérifie que le code est présent dans la liste des langues locales
-- 2) sinon, écrit une ligne à copier-coller dans la liste (en supposant que le modèle correspondant existe)
function p.compare_liste(frame)
    -- Récupère tous les codes langue
    local codes = frame.args
    -- Récupère la liste de langues locales actuelle
    local langues = mw.loadData('Module:langues/data')
    
    -- Pour chaque code langue, vérifier qu'il existe dans la liste locale
    -- Sinon, le garder à part
    local langues_locales = {}
    local autres_langues = {}
    for i, code in pairs(codes) do
        code = mw.ustring.gsub(code, "%s", '')
        if (type(i)=='number') then
            if (langues[code] ~= nil and langues[code]['nom'] ~= nil) then
                table.insert(langues_locales, code)
            else
                table.insert(autres_langues, code)
            end
        end
    end
    
    -- Affiche statistiques
    local stats = "* Langues locales : " .. #langues_locales .. "\r\n* Langues à ajouter : " .. #autres_langues
    
    if (#autres_langues > 0) then
        -- Liste les langues restantes !
        nouvelles_langues = {}
        for i, code in pairs(autres_langues) do
            local langue = frame:preprocess("{{" .. code .. "}}")
            
            if (langue ~= nil and langue ~= '') then
                nouvelles_langues[code] = langue
            else
                nouvelles_langues[code] = 'ERREUR!!'
            end
        end
    
        -- Affichage !
        textet = {'<pre>'}
        for code, langue in pairs(nouvelles_langues) do
            table.insert(textet, "l['" .. code .. "'] = { nom = '" .. langue .. "' }")
        end
        table.insert(textet, '</pre>')
        
        return stats .. "\r\n\r\n" .. frame:preprocess(table.concat(textet, "\r\n"))
    else
        return stats
    end
end

return p