Module:clé de tri

Invoqué dans {{clé de tri}} et {{clé par langue}}.

info Documentation du Module:clé de tri : v · d · m · h.


local p = {}

-- Le caractère ⿕ utilisé ci-après correspond au caractère de point de code le plus élevé
-- dans le jeu de caractères utilisé sur le Wiktionnaire, et permet de forcer une lettre
-- à être classée à la suite d’une lettre donnée, le classement par défaut se contentant d’ignorer les diacritiques
p.hash = {}
p.hash['default'] = {} -- pour retirer les diacritiques
p.hash['br'] = { ['ch'] = 'c⿕', ['cʼh'] = 'c⿕⿕' }
p.hash['da'] = { ['æ'] = 'z⿕', ['ø'] = 'z⿕⿕', ['å'] = 'z⿕⿕⿕' }
p.hash['eo'] = { ['ĉ'] = 'cx', ['ĝ'] = 'gx', ['ĥ'] = 'hx', ['ĵ'] = 'jx', ['ŝ'] = 'sx', ['ŭ'] = 'ux' }
p.hash['es'] = { ['ñ'] = 'n⿕' }
p.hash['esu'] = { ['gg'] = 'g⿕', ['ll'] = 'l⿕', ['ḿ'] = 'm⿕', ['n'] = 'n⿕', ['ng'] = 'n⿕⿕',
				  ['ńg'] = 'n⿕⿕⿕', ['rr'] = 'r⿕', ['ss'] = 's⿕', ['vv'] = 'v⿕' }
p.hash['fi'] = { ['å'] = 'z⿕', ['ä'] = 'z⿕⿕', ['ö'] = 'z⿕⿕⿕' }
p.hash['hu'] = { ['cs'] = 'c⿕', ['dz'] = 'd⿕', ['dzs'] = 'd⿕⿕', ['gy'] = 'g⿕', ['ly'] = 'l⿕',
				 ['ny'] = 'n⿕', ['sz'] = 's⿕', ['ty'] = 't⿕', ['zs'] = 'z⿕' }
p.hash['is'] = { ['á'] = 'a⿕', ['ð'] = 'd⿕', ['é'] = 'e⿕', ['í'] = 'i⿕', ['ó'] = 'o⿕', ['ú'] = 'u⿕', ['ý'] = 'y⿕', ['þ'] = 'z', ['æ'] = 'z⿕', ['ö'] = 'z⿕⿕' }
p.hash['koy'] = { ['dl'] = 'd⿕', ['dz'] = 'd⿕⿕', ['ee'] = 'eaa', ['gg'] = 'g⿕', ['gh'] = 'g⿕⿕',
				  ['ch'] = 'k', ['chʼ'] = 'k⿕', ['kʼ'] = 'k⿕', ['kk'] = 'k⿕⿕', ['kkʼ'] = 'k⿕⿕⿕',
				  ['nh'] = 'n⿕', ['oo'] = 'o⿕', ['tl'] = 't⿕⿕', ['tlʼ'] = 't⿕⿕⿕', ['ts'] = 't⿕⿕⿕⿕',
				  ['tsʼ'] = 't⿕⿕⿕⿕⿕', ['yh'] = 'y⿕', ['sh'] = 'y⿕',
				  ['ʼ'] = 'a⿕', ['m'] = 'b', ['j'] = 'g', ['ł'] = 'l',  ['tʼ'] = 't⿕',
                  ['ʉ'] = 'u⿕',  ['s'] = 'z' }
p.hash['nb'] = p.hash['da']
p.hash['nn'] = p.hash['da']
p.hash['no'] = p.hash['da']
p.hash['os'] = { ['ӕ'] = 'a⿕', ['ё'] = 'e⿕' }
p.hash['se'] = { ['á'] = 'a⿕', ['č'] = 'c⿕', ['đ'] = 'd⿕', ['ŋ'] = 'n⿕', ['š'] = 's⿕', ['ŧ'] = 't⿕', ['ž'] = 'z⿕' }
p.hash['sl'] = { ['č'] = 'c⿕', ['š'] = 's⿕', ['ž'] = 'z⿕' }
p.hash['sv'] = p.hash['fi']
p.hash['vi'] = { ['ă'] = 'a⿕', ['ằ'] = 'a⿕', ['ẳ'] = 'a⿕', ['ẵ'] = 'a⿕', ['ắ'] = 'a⿕', ['ặ'] = 'a⿕',
				 ['â'] = 'a⿕⿕', ['ầ'] = 'a⿕⿕', ['ẩ'] = 'a⿕⿕', ['ẫ'] = 'a⿕⿕', ['ấ'] = 'a⿕⿕', ['ậ'] = 'a⿕⿕',
				 ['đ'] = 'd⿕',
				 ['ê'] = 'e⿕', ['ề'] = 'e⿕', ['ể'] = 'e⿕', ['ễ'] = 'e⿕', ['ế'] = 'e⿕', ['ệ'] = 'e⿕',
				 ['ô'] = 'o⿕', ['ồ'] = 'o⿕', ['ổ'] = 'o⿕', ['ỗ'] = 'o⿕', ['ố'] = 'o⿕', ['ộ'] = 'o⿕',
				 ['ơ'] = 'o⿕⿕', ['ờ'] = 'o⿕⿕', ['ở'] = 'o⿕⿕', ['ỡ'] = 'o⿕⿕', ['ớ'] = 'o⿕⿕', ['ợ'] = 'o⿕⿕',
				 ['ư'] = 'u⿕', ['ừ'] = 'u⿕', ['ử'] = 'u⿕', ['ữ'] = 'u⿕', ['ứ'] = 'u⿕', ['ự'] = 'u⿕' }

local function ucfirst(text)
	return text and mw.ustring.gsub(text, "^.", mw.ustring.upper)
end

local function str_subst(text, hash, max_len)
	local len_text = mw.ustring.len(text)
	local position = 1
	local result = {}
	while position <= len_text do
		local val = nil
		local found_len = nil
		for len_sub = max_len, 1, -1 do
			val = hash[mw.ustring.sub(text, position, position + len_sub - 1)]
			if val then
				found_len = len_sub
				break
			end
		end	

		table.insert(result, val or mw.ustring.sub(text, position, position)) -- par défaut
		position = position + (found_len or 1)
	end
	
	return table.concat(result)
end

function p.clef(titre, langue)
    if titre == nil then return nil end
    langue = mw.text.trim(langue or 'fr') -- français par défaut

    -- Remplacement de certains symboles par des espaces
    titre = mw.ustring.gsub(titre, "[-,./()]", " ")
    titre = mw.ustring.gsub(titre, "%s+", " ")
    titre = mw.ustring.gsub(titre, "’", "") -- les apostrophes sont supprimées

	-- Fonctions particulières par langue
	if langue == 'ja' then
		local ja = require('Module:ja-kana')
		return ja.kana_sans_longue(titre)
	end

    -- Cas particuliers par langue
	local hash = p.hash[langue]
	if hash == nil then
		return titre -- pas une langue spéciale
	end

	-- table pour la majuscule
	local hash_maj = {}
	local max_len = 1
	for key, value in pairs(hash) do
		max_len = math.max(max_len, mw.ustring.len(key))
		hash_maj[key] = value
		hash_maj[mw.ustring.upper(key)] = mw.ustring.upper(value)
		hash_maj[ucfirst(key)] = ucfirst(value)
	end

    -- Cas particuliers par langue
    titre = str_subst(titre, hash_maj, max_len)

    -- Décompose la chaîne notamment en séparant les accents
    local nfd = mw.ustring.toNFD(titre)
    if nfd == nil then return nil end

    -- Enlève les caractères qui ne sont ni des lettres, ni des chiffres, ni le signe ⿕
    local noacc = mw.ustring.gsub(nfd, "[^%w⿕ ]", "")
    return noacc
end

function p.cle_de_tri(frame)
    local titre = frame.args[1]
    local langue = frame.args[2]
    return p.clef(titre, langue)
end

return p