La documentation pour ce module peut être créée à Module:ko-hangeul/Documentation
local ko = {}
local sinogramme = require('Module:sinogramme')
-- Il est à noter que mw.ustring.gsub ne peut pas utiliser
-- un tableau de remplacement importé par mw.loadData.
local hangeul = mw.loadData("Module:ko-hangeul/data")
-- Cette fonction décompose des hangeuls en jamos.
-- La barre oblique supprime un rieul précédent s’il y en a.
-- La fonction mw.ustring.toNFD est inutile ici
-- parce qu’elle décompose un hangeul en nouveaux jamos (bloc U+1100-U+11FF)
-- tandis que nous avons besoin des jamos de compatibilité (bloc U+3130-U+318F).
function ko.decompos(str)
str = mw.ustring.gsub(str, "()", jamos)
str = mw.ustring.gsub(str, "ㄹ?/", "")
str = mw.ustring.gsub(str, "+()", "%1") -- au plus deux consonnes
str = mw.ustring.gsub(str, "+()$", "%1") -- au plus une seule consonne à la fin
return str
end
-- Fonction internelle pour décomposer un hangeul en jamos.
function jamos(caractere)
local code = mw.ustring.codepoint(caractere)
return hangeul.initiale ..
hangeul.voyelle ..
hangeul.finale
end
-- Cette fonction supprime tous les clés de prononciation ("'", "-", "." et "s")
-- et elle compose des hangeuls.
function ko.compos(str, conserver)
if not conserver then
str = mw.ustring.gsub(str, "", "") -- conserver seulement les hangeuls, les jamos et les espaces
end
str = mw.ustring.gsub(str, "()()", hangeul_sans_finale)
str = mw.ustring.gsub(str, "()()", hangeul_avec_finale)
return str
end
-- fonction internelle
function hangeul_sans_finale(initiale, voyelle)
return mw.ustring.char((hangeul.indice_initiale - 1) * 21 * 28
+ (hangeul.indice_voyelle - 1) * 28
+ 0xac00)
end
-- fonction internelle
function hangeul_avec_finale(caractere, finale)
return mw.ustring.char(mw.ustring.codepoint(caractere)
+ hangeul.indice_finale - 1)
end
-- Cette fonction modifie des hangeuls selon les règles du Standard
-- et les clés de prononciation ("'", "-", "." et "s").
function ko.modif_jamo(str, pron, changer_oe)
str = ko.decompos(str)
-- apostrophes (Articles 26-29)
if pron then -- pour la prononciation
str = mw.ustring.gsub(str, "'ㅇ", "ㄴ") -- Article 29
str = mw.ustring.gsub(str, "'()", consonne_forte) -- Articles 26, 27 et 28
else -- pour la romanisation
str = mw.ustring.gsub(str, "()'ㅇ", "%1ㄴ") -- Article 29
end
str = mw.ustring.gsub(str, "'", "")
-- s (Article 16)
str = mw.ustring.gsub(str, "()s", "ㅅ")
-- changements phonologiques qu’il faut traiter avant la supression des traits d’union
-- Article 17
str = mw.ustring.gsub(str, "()()",
function (frontiere, voyelle)
return (hangeul.palatale or frontiere) .. voyelle
end)
if pron then
-- Article 4
if changer_oe then
str = mw.ustring.gsub(str, "ㅚ", "ㅞ")
end
-- Article 5
str = mw.ustring.gsub(str, "()ㅖ", "%1ㅔ") -- ㅖ est prononcé ㅔ dans 계, 례, 몌, 혜 et 폐
str = mw.ustring.gsub(str, "()ㅢ", "%1ㅣ") -- ㅢ est prononcé ㅣ après une consonne
str = mw.ustring.gsub(str, "(ㅇ)ㅢ", "%1ㅣ") -- ㅢ est prononcé ㅣ au milieu du mot ; -의 sera conservé
end
-- traits d’union et espaces (Articles 20 et 15)
str = mw.ustring.gsub(str, "%-ㄹ", "ㄴㄴ") -- Article 20
if pron then -- pour la prononciation
str = mw.ustring.gsub(str, " ㄹ", "ㄴㄴ") -- Article 20
else -- pour la romanisation
str = mw.ustring.gsub(str, "()%-ㅎ", "%1--ㅎ") -- pour éviter la suppression
str = mw.ustring.gsub(str, "() ", "%1- ") -- pour éviter la suppression
end
str = mw.ustring.gsub(str, "()", neutralisation) -- Article 15
-- fin du mot
str = mw.ustring.gsub(str, "()$", neutralisation) -- Articles 9, 10 et 11
-- frontières
str = mw.ustring.gsub(str, "(?)()()", pron_frontiere)
if pron then -- pour la prononciation
str = mw.ustring.gsub(str, "'()", consonne_forte)
-- Article 5
str = mw.ustring.gsub(str, "()()", -- ㅈ, ㅉ et ㅊ sont déjà palatales
function (consonne, voyelle)
return consonne .. (hangeul.non_palatale or voyelle)
end)
else -- pour la romanisation
str = mw.ustring.gsub(str, "", "") -- consonnes fortes pas romanisées
end
return str
end
-- Fonction internelle de la neutralisation des finales.
function neutralisation(jamo)
return hangeul.neutralisation or jamo
end
-- Fonction internelle des consonnes fortes.
function consonne_forte(jamo)
return hangeul.forte or jamo
end
-- Fonction internelle pour la prononciation.
function pron_frontiere(finale, initiale, voyelle)
return (hangeul.frontiere
or hangeul.neutralisation .. initiale)
.. voyelle
end
-- Cette fonction change des hangeuls en phonèmes
function ko.phoneme(str, son, sonore)
str = ko.modif_jamo(str, true, false)
-- prononciations modernes sans géminée
str = mw.ustring.gsub(str, "()",
function (frontiere)
return hangeul.sans_geminee or frontiere
end)
-- phonèmes d’une initiale et d’une voyelle
str = mw.ustring.gsub(str, "ㅅㅞ", "sjwe") -- prononciation populaire de 쉐
str = mw.ustring.gsub(str, "()()",
function (initiale, voyelle)
return "." .. hangeul.phoneme_initiale .. hangeul.phoneme_voyelle
end)
-- phonème d’une finale
str = mw.ustring.gsub(str, "()",
function (finale)
return hangeul.phoneme_finale
end)
-- Article 12-4 : ㄹㅎ, ㄴㅎ, ㅁㅎ et ㅇㅎ
-- Article 13 : ㅇㅇ
str = mw.ustring.gsub(str, "()%.(h?)", ".%1%2")
-- réalisation des phonèmes
if son then
-- sonorisation après une voyelle ou une consonne sonore
if not sonore then
str = mw.ustring.gsub(str, "^%.", "")
end
str = mw.ustring.gsub(str, "%.(ɕ?)()",
function (consonne, voyelle)
return "." .. hangeul.sonorisation .. voyelle
end)
-- implosives
str = mw.ustring.gsub(str, "()%.(ˀ?)", "%1̚.%2") -- pas implosive devant ㅅ
str = mw.ustring.gsub(str, "()$", "%1̚")
-- ㄹㄹ
str = mw.ustring.gsub(str, "l%.l", "ɭ.ɭ")
-- ㄹ devant une voyelle
str = mw.ustring.gsub(str, "l(h?)", "ɾ%1")
-- ㄹ de finale
str = mw.ustring.gsub(str, "l", "ɭ")
-- Article 12-4 : ㄹㅎ, ㄴㅎ, ㅁㅎ et ㅇㅎ
str = mw.ustring.gsub(str, "()h", "%1ʱ")
-- distinction perdue entre 에 et 애
str = mw.ustring.gsub(str, "", "e̞")
-- palatalisation de 위
str = mw.ustring.gsub(str, "wi", "ɥi")
-- palatalisation de ㅅ et ㅆ
str = mw.ustring.gsub(str, "sjw", "ʃw") -- prononciation populaire de 쉐
str = mw.ustring.gsub(str, "sj", "ɕ")
str = mw.ustring.gsub(str, "si", "ɕi")
str = mw.ustring.gsub(str, "sɥi", "ʃɥi")
-- palatalisation de ㅎ
str = mw.ustring.gsub(str, "hj", "ç")
str = mw.ustring.gsub(str, "h(ɥ?i)", "ç%1")
-- palatalisation de ㅋ, ㅌ, ㅍ
str = mw.ustring.gsub(str, "()ʰj", "%1ç")
str = mw.ustring.gsub(str, "()ʰ(ɥ?i)", "%1ç%2")
-- /w/ après une consonne
str = mw.ustring.gsub(str, "()w", "%1ʷ")
-- le suffixe -요
str = mw.ustring.gsub(str, "o%.$", "o̞")
end
-- suppression des points au début et à la fin
str = mw.ustring.gsub(str, "^%.", "")
str = mw.ustring.gsub(str, "%.$", "")
return str
end
-- Fonction internelle pour la romanisation des finales
function roman_finale(finale, initiale)
return (hangeul.roman_finale or finale) .. (initiale or "")
end
-- Fonctions pour des modèles.
-- Prononciation (Modèle:ko-pron)
function ko.pron(frame)
local str = frame.args or ""
local phon = frame.args or ""
local sonore = frame.args or ""
return ko.phoneme(str, phon == "", sonore ~= "")
end
-- Initiale du premier hangeul donné
function ko.initiale(frame)
local str = ko.decompos(frame.args or "")
str = mw.ustring.gsub(str, "", "")
return mw.ustring.match(str, "^()") or "" -- première consonne suivie par une voyelle
end
-- Voyelle du dernier hangeul donné
function ko.voyelle(frame)
local str = ko.decompos(frame.args or "")
str = mw.ustring.gsub(str, "", "")
return mw.ustring.match(str, "()?$") or "" -- dernière voyelle
end
-- Finale du dernier hangeul donné
function ko.finale(frame)
local str = ko.decompos(frame.args or "")
str = mw.ustring.gsub(str, "", "")
return mw.ustring.match(str, "(?)$") or "" -- dernière consonne
end
-- Translittération (Modèle:ko-translit)
function ko.translit(frame)
local str = frame.args or ""
str = ko.decompos(str)
str = mw.ustring.gsub(str, "", "")
str = mw.ustring.gsub(str, "ㅇ()", "-%1")
str = mw.ustring.gsub(str, "^%-", "")
str = mw.ustring.gsub(str, " %-", " ")
str = mw.ustring.gsub(str, "()",
function (jamo) return hangeul.translit end)
return str
end
-- Romanisation (Modèle:ko-roman)
function ko.roman(frame)
local str = frame.args or ""
str = ko.modif_jamo(str)
str = mw.ustring.gsub(str, "ㅇ()", "%1")
str = mw.ustring.gsub(str, "()",
function (jamo) return hangeul.translit end)
-- ㄹ devant une voyelle
str = mw.ustring.gsub(str, "l()", "r%1")
-- ㄹㄹ
str = mw.ustring.gsub(str, "lr", "ll")
-- finale : b → p ; d → t ; g → k ; ng → ng sans changement
str = mw.ustring.gsub(str, "(n?)()", roman_finale)
str = mw.ustring.gsub(str, "(n?)$", roman_finale)
-- majuscule
if frame.args and frame.args ~= "" then
str = mw.ustring.gsub(str, "^(.)", mw.ustring.upper)
end
return str
end
-- Composer des hangeuls utilisant des jamos (Modèle:hangeul mot)
function ko.hangeul_mot(frame)
local str = frame.args or ""
local pron = frame.args or ""
return ko.compos(ko.decompos(str), pron ~= "")
end
-- Hangeul phonétique (Modèle:ko-hangeul-phon)
function ko.hangeul_phonetique(frame)
local str = frame.args or ""
return ko.compos(ko.modif_jamo(str, true, true))
end
-- Frontière des sinogrammes
function ko.frontiere_hanja(frame)
-- Article 26
local str = frame.args or ""
local hanja = frame.args or ""
if hanja == "" then return str end
local hanjas = {}
local finales = {}
local regex = ""
local i = 1
for caractere in mw.ustring.gmatch(hanja, regex) do
hanjas = not mw.ustring.match(caractere, "") -- true si c’est un sinogramme
i = i + 1
end
i = 1
str = mw.ustring.gsub(str, "(*)()",
function (modif, caractere)
local code = mw.ustring.codepoint(caractere) - 0xac00
local initiale = hangeul.initiale
finales = hangeul.finale
if modif == "" and i >= 2 then
if hanjas
and hanjas
and finales == "ㄹ"
and (initiale == "ㄷ" or initiale == "ㅅ" or initiale == "ㅈ") then
modif = "'"
elseif (hanjas or hanjas)
and initiale == "ㅎ"
and (finales == "ㄱ" or finales == "ㅂ") then
modif = "-"
end
end
i = i + 1
return modif .. caractere
end)
return str
end
-- Supprimer le suffixe -다 du verbe (Modèle:ko-radical1)
function ko.radical1(frame)
local str = frame.args or ""
str = ko.compos(ko.decompos(str), true)
str = mw.ustring.gsub(str, "다$", "")
return str
end
-- Forme en -으 (utilisée devant -니까, -ㄹ, -면, etc.) (Modèle:ko-radical2)
function ko.radical2(frame)
local str = ko.decompos(frame.args or "") -- radical
local groupe = frame.args or ""
if groupe == "b" then -- irrégulier-ㅂ
str = mw.ustring.gsub(str, "ㅂ$", "우")
elseif groupe == "d" then -- irrégulier-ㄷ
str = mw.ustring.gsub(str, "ㄷ$", "ㄹ으")
elseif groupe == "s" then -- irrégulier-ㅅ
str = mw.ustring.gsub(str, "ㅅ$", "으")
elseif groupe == "h" then -- irrégulier-ㅎ
str = mw.ustring.gsub(str, "ㅎ$", "")
elseif mw.ustring.match(str, "$") then -- régulier consonantique
str = str .. "으"
end -- régulier vocalique/-으/-ㄹ, irrégulier-러/-르/-시/-여/-이다
return ko.compos(str, true)
end
-- Forme en -아/어 (utilisée devant -도, -서, etc.) (Modèle:ko-radical3)
function ko.radical3(frame)
local str = ko.decompos(frame.args or "") -- radical
local groupe = frame.args or ""
local alt = ((frame.args or "") ~= "")
if alt and not (groupe == "si"
or groupe == "ida"
or groupe == "yeo"
or (groupe == "" and mw.ustring.match(str, "$"))) then
return nil
end
if groupe == "b" then -- irrégulier-ㅂ
local wa = { = "워", = "와" }
str = mw.ustring.gsub(str, "ㅂ$", wa or "") ~= ""])
elseif groupe == "d" then -- irrégulier-ㄷ
str = mw.ustring.gsub(str, "ㄷ$", "ㄹㅇ" .. hangeul.yinyang)ㄷ$")])
elseif groupe == "s" then -- irrégulier-ㅅ
str = mw.ustring.gsub(str, "ㅅ$", "ㅇ" .. hangeul.yinyang)ㅅ$")])
elseif groupe == "h" then -- irrégulier-ㅎ
str = mw.ustring.gsub(str, "ㅑㅎ$", "ㅒ")
str = mw.ustring.gsub(str, "ㅕㅎ$", "ㅖ")
str = mw.ustring.gsub(str, "ㅎ$", "ㅐ")
elseif groupe == "reo" then -- irrégulier-러
str = str .. "러"
elseif groupe == "reu" then -- irrégulier-르
str = mw.ustring.gsub(str, "ㄹㅡ$", "ㄹㄹ" .. hangeul.yinyang)ㄹㅡ$")])
elseif groupe == "eo" then -- irrégulier-어
str = mw.ustring.gsub(str, "ㅓ$", "ㅐ")
elseif groupe == "u" then -- irrégulier-우
str = mw.ustring.gsub(str, "ㅜ$", "ㅓ")
elseif groupe == "si" then -- irrégulier-시
local voyelle = { = "ㅕ", = "ㅔ" }
str = mw.ustring.gsub(str, "ㅣ$", voyelle)
elseif groupe == "ida" then -- irrégulier-이다
if str == "" then
local voyelle = { = "여", = "예" }
str = voyelle
else
local voyelle = { = "어", = "에" }
str = str .. voyelle
end
elseif groupe == "yeo" then -- irrégulier-여
if alt then
str = str .. "여"
else
str = mw.ustring.gsub(str, "ㅏ$", "ㅐ")
end
elseif mw.ustring.match(str, "$") then -- régulier consonantique/-ㄹ
str = str .. "ㅇ" .. hangeul.yinyang?)$")]
elseif mw.ustring.match(str, "ㅡ$") then -- régulier-으
str = mw.ustring.gsub(str, "ㅡ$", hangeul.yinyang?)ㅡ$")])
else -- régulier vocalique
if mw.ustring.match(str, "$") then
-- faire rien
elseif alt then -- forme longue
str = str .. "ㅇ" .. hangeul.yinyang)$")]
else
str = mw.ustring.gsub(str, "()$", function (voyelle)
return hangeul.diphtongue_verbale or (voyelle .. "어")
end)
end
end
return ko.compos(str, true)
end
return ko