Module:ryu-kana

Bonjour, vous êtes venu ici pour chercher la signification du mot Module:ryu-kana. Dans DICTIOUS, vous trouverez non seulement toutes les significations du dictionnaire pour le mot Module:ryu-kana, mais vous apprendrez également son étymologie, ses caractéristiques et comment dire Module:ryu-kana au singulier et au pluriel. Tout ce que vous devez savoir sur le mot Module:ryu-kana est ici. La définition du mot Module:ryu-kana vous aidera à être plus précis et correct lorsque vous parlerez ou écrirez vos textes. Connaître la définition deModule:ryu-kana, ainsi que celles d'autres mots, enrichit votre vocabulaire et vous fournit des ressources linguistiques plus nombreuses et de meilleure qualité.

 Documentation

Références


local ryu = {}

-- Il est à noter que mw.ustring.gsub ne peut pas utiliser
-- un tableau de remplacement importé par mw.loadData.
local kana = mw.loadData("Module:ryu-kana/data")

-- Cette fonction change des hiraganas en katakanas correspondants
function ryu.hira_en_kata(str)
	str = mw.ustring.gsub(str, "()",
		function (char)
			return mw.ustring.char(mw.ustring.codepoint(char) + 0x60)
		end)
	return str
end

-- Cette fonction change des katakanas en hiraganas correspondants.
function ryu.kata_en_hira(str)
    str = mw.ustring.gsub(str, "()",
                          function (char)
                              return mw.ustring.char(mw.ustring.codepoint(char) - 0x60)
                          end)
    return str
end

-- Cette fonction romanise des kanas.
function ryu.kana_en_roman(str, point, certain)
    local pref, suf
    str, pref = mw.ustring.gsub(str, "-$", "")
    str, suf = mw.ustring.gsub(str, "^-", "")
    str = ryu.hira_en_kata(str)
    str = mw.ustring.gsub(str, "", " ")
    str = mw.ustring.gsub(str, "、", ", ")

    str = mw.ustring.gsub(str, "()", function(duo)
        return kana.roman or duo
    end)

    str = mw.ustring.gsub(str, "()", function(char)
        return kana.roman or char
    end)

    str = mw.ustring.gsub(str, "()ー", function(v)
        return v .. v
    end)

    if certain and (mw.ustring.find(str, "()%1") or mw.ustring.find(str, "ou")) then
        return nil
    end
    str = mw.ustring.gsub(str, "()%1", "%1%1")

    if not point then
        str = mw.ustring.gsub(str, "%%.", "") -- symbole pour séparer des syllabes
    end

    -- ん
    str = mw.ustring.gsub(str, "n’()", "n%1") -- y compris "n’."
    str = mw.ustring.gsub(str, "n’$", "n")
    -- っ
    str = mw.ustring.gsub(str, "q+%.?()", "%1%1") -- devant une consonne
    str = mw.ustring.gsub(str, "cch", "tch")
    str = mw.ustring.gsub(str, "q+", "’") -- devant une voyelle ou à la fin

    if pref > 0 then str = str .. "-" end
    if suf > 0 then str = "-" .. str end
    return str
end

-- Cette fonction génère la prononciation de la romanisation donnée.
function ryu._pron(str, certain, sans_diph, acc)
    -- syllabation simple
    str = mw.ustring.lower(str)
    str = mw.ustring.gsub(str, "", ".")
    if sans_diph then
        str = mw.ustring.gsub(str, "()", "%1.")
    else
        str = mw.ustring.gsub(str, "(i?)", "%1.") -- ai, ui, ei
        str = mw.ustring.gsub(str, "()i", "%1.i")
        if certain and mw.ustring.find(str, "i") then
            return nil
        end
    end
    -- points
    str = mw.ustring.gsub("." .. str, "%.+", ".")
    str = mw.ustring.gsub(str, "%.$", "")

    -- ん
    str = mw.ustring.gsub(str, "%.n", "n.")
    str = mw.ustring.gsub(str, "%.n()", "n.%1")
    str = mw.ustring.gsub(str, "%.n$", "n")
    -- っ
    str = mw.ustring.gsub(str, "%.tch", "q.ch")
    str = mw.ustring.gsub(str, "%.()%1", "q.%1")
    str = mw.ustring.gsub(str, "%.’$", "q")
    str = mw.ustring.gsub(str, "%.’", "q.")
    -- palatalisation
    str = mw.ustring.gsub(str, "%.()()", ".%1y%2")
    -- consonnes et voyelles
    local erreur = false
    str = mw.ustring.gsub(str, "(*)(i?)",
                          function (consonne, voyelle)
                              if kana.consonne and kana.voyelle then
                                  return kana.consonne .. kana.voyelle
                              else
                                  erreur = true
                                  return nil
                              end
                          end)

    if erreur then
        return "romanisation erronée"
    end
    
	str = mw.ustring.gsub(str, "ɑ̟%.ɑ̟", "ɑ̟ː")
	str = mw.ustring.gsub(str, "e̞%.e̞", "e̞ː")
	str = mw.ustring.gsub(str, "o̞%.o̞", "o̞ː")
	str = mw.ustring.gsub(str, "()%.%1", "%1ː")

	-- っ
	str = mw.ustring.gsub(str, "q(%.?)(?)",
		function (point, consonne)
			return (kana.geminee or consonne) .. point .. consonne
		end)

	str = mw.ustring.gsub(str, "n%.ni",  "ɲ̍.ɲi")
	str = mw.ustring.gsub(str, "n%.nya", "ɲ̍.ɲɑ̟")
	str = mw.ustring.gsub(str, "n%.nyu", "ɲ̍.ɲu")
	str = mw.ustring.gsub(str, "n%.ya",  "ɲ̍.jɑ̟")
	str = mw.ustring.gsub(str, "n%.yu",  "ɲ̍.ju")

	-- ん
	str = mw.ustring.gsub(str, "n%.(.)",
		function (consonne)
			return (kana.nasale or "ŋ̍") .. "." .. consonne
		end)

	str = mw.ustring.gsub(str, "n$", "ŋ̍")
	str = mw.ustring.gsub(str, "^%.", "")

	if mw.ustring.match(str, "^") then
		str = "ʔ" .. str
	end

	if acc then
		str = ryu.pron_accent(str, acc)
	end

	return str
end

function ryu.pron_accent(str, acc)
    str = mw.ustring.toNFD(str) .. '.◌'
    if acc == 0 then acc = 1000000 end -- assez grand
    local syllabes = 1
    str = mw.ustring.gsub(str, kana.rime,
                          function (rime)
                              local len = mw.ustring.len(mw.ustring.gsub(rime, kana.nombre_more, "%1%2%3"))
                              if syllabes <= acc and not (syllabes == 1 and acc > len) then 
                                  rime = rime .. '˦'
                                  if len >= 2 and syllabes + len > acc then
                                      rime = rime .. '˨'
                                  end
                              else
                                  rime = rime .. '˨'
                                  if len >= 2 and syllabes + len <= acc then
                                      rime = rime .. '˦'
                                  end
                              end

                              syllabes = syllabes + len
                              return rime
                          end)
    return str
end

function ryu.kana_accent(str, acc)
    str = mw.ustring.gsub(str, "()", ".%1") -- on écrit ー pour les katakanas
    if acc == 0 then acc = 1000000 end -- assez grand
    str = ryu.hira_en_kata(str)
    str = mw.ustring.gsub(str, "", " ")
    str = mw.ustring.gsub(str, "(?)()",
                          function (char1, char2)
                              if char1 == "" or not kana.roman then
                                  return char1 .. mw.ustring.char(mw.ustring.codepoint(char2) + 1)
                              end
                          end)

    -- voyelles longues
    str = mw.ustring.gsub(str, "()ー", function(char)
        local roman = kana.roman
        if roman then
            local v = mw.ustring.sub(roman, -1)
            return char .. v
        end
        return char
    end)

    str = mw.ustring.gsub(str, "", "")

    -- accent
    local mores = 1
    local span = false
    str = mw.ustring.gsub(str, "(?)(ー??)",
                          function (char, coda)
                              local coda_len = mw.ustring.len(coda)
                              if (acc <= 1 + coda_len and mores == 1) or (acc ~= 1 and mores == 2) then
                                  char = '<span style="border-top: 1px solid black; position: relative; padding: 1px;">' .. char
                                  span = true
                              elseif coda_len > 0 and mores == 1 then
                                  coda = '<span style="border-top: 1px solid black; position: relative; padding: 1px;">' .. coda
                                  span = true
                              end
                              if mores <= acc and mores + coda_len >= acc then
                                  char = char .. '<span style="position: absolute; top: 0; bottom: 67%; right: 0%; border-right: 1px solid black;">&#8203;</span></span>'
                                  span = false
                              end
                              mores = mores + 1 + coda_len
                              return char .. coda
                          end)
    if span then
        str = str .. '</span>'
    end

    return str
end

local function voyelle_longue(char)
    local roman = kana.roman
    if roman then
        if mw.ustring.match(char, "$") then -- exclure っ et ん
            return char .. kana.hiragana_voyelle
        elseif mw.ustring.match(char, "$") then -- exclure ッ et ン
            return char .. kana.katakana_voyelle
        end
    end
    return char
end

-- Cette fonction supprime les voyelles longues pour générer une clé de tri.
function ryu.kana_sans_longue(str)
    str = mw.ustring.gsub(str, "()ー", voyelle_longue)
    str = mw.ustring.gsub(str, "", "")
    return str
end

-- Cette function compte les mores.
function ryu.compter_mores(str)
    str = ryu.hira_en_kata(str)
    str = mw.ustring.gsub(str, "(?)()",
                          function (char1, char2)
                              if char1 == "" or not kana.roman then
                                  return char1 .. mw.ustring.char(mw.ustring.codepoint(char2) + 1)
                              end
                          end)

    local mores = 0
    for i in mw.ustring.gmatch(str, "?") do
        mores = mores + 1
    end
    return mores
end

-- Fonctions pour des modèles
function ryu.katakana(frame)
    local str = frame.args or ""
    return ryu.hira_en_kata(str)
end

function ryu.hiragana(frame)
    local str = frame.args or ""
    return ryu.kata_en_hira(str)
end

-- Cette fonction retourne true si la chaîne donnée comprend seulement des kanas.
function ryu.tous_kana(frame)
    local str = frame.args or ""
    if not mw.ustring.find(str, "") then
        return str
    else
        return nil
    end
end

-- Cette fonction retourne true si la chaîne donnée comprend seulement des hiraganas.
function ryu.tous_hira(frame)
    local str = frame.args or ""
    if not mw.ustring.find(str, "") then
        return str
    else
        return nil
    end
end

-- Cette fonction retourne true si la chaîne donnée comprend seulement des katakanas.
function ryu.tous_kata(frame)
    local str = frame.args or ""
    if not mw.ustring.find(str, "") then
        return str
    else
        return nil
    end
end

function ryu.normaliser_kana(frame)
    local str = frame.args or ""
    str = mw.ustring.gsub(str, "", "")
    str = mw.ustring.gsub(str, "-$", "") -- préfixe
    str = mw.ustring.gsub(str, "^-", "") -- suffixe
    return str
end

function ryu.roman(frame)
    local str = frame.args or ""
    local certain = ((frame.args or "") ~= "")
    return ryu.kana_en_roman(str, false, certain)
end

function ryu.pron(frame)
    local str = frame.args or ""
    local certain = ((frame.args or "") ~= "")
    local sans_diph = ((frame.args or "") ~= "")
    local acc = tonumber(frame.args)
    if mw.ustring.find(str, "") then
        sans_diph = sans_diph or not mw.ustring.find(str, "")
        str = ryu.kana_en_roman(str, true, certain) or ""
    end
    return ryu._pron(str, certain, sans_diph, acc)
end

function ryu.mores(frame)
    local str = frame.args or ""
    return ryu.compter_mores(str)
end

return ryu