模块:沙盒/Араси/Lang-mnc

-- 模块用于 满文⇆转写转换
-- bug、转换错误在User:Араси讨论页留言
--		(User talk:Араси:
--		https://zh.wikipedia.org/wiki/User_talk:Араси
--		https://incubator.wikimedia.org/wiki/User_talk:Араси)
-- 致谢:英文维基词典Module:mnc-translit (https://en.wiktionary.org/wiki/Module:mnc-translit)
--       及创建者  Wyang (https://en.wiktionary.org/wiki/User:Wyang)
local export = {}
-- a(text) 太清
-- 参考: http://abkai.net/core/zh/manchu/manchu-transliteration/
-- 注意: 为避免歧义: 全角单引号(’) 被误认为 半角单引号+空格(' ),原转写中全角引号均以半角引号替代
function export.a(text)
	local abkai={
		["ᠠ"]="a",
		["ᡝ"]="e",
		["ᡳ"]="i",
		["ᠣ"]="o",
		["ᡠ"]="u",
		["ᡡ"]="v",
		["ᠨ"]="n",
		["ᡴ"]="k",
		["ᡤ"]="g",
		["ᡥ"]="h",
		["ᠪ"]="b",
		["ᡦ"]="p",
		["ᠰ"]="s",
		["ᡧ"]="x",
		["ᡨ"]="t",
		["ᡩ"]="d",
		["ᠯ"]="l",
		["ᠮ"]="m",
		["ᠴ"]="q",
		["ᠵ"]="j",
		["ᠶ"]="y",
		["ᠺ"]="k'",
		["ᡬ"]="g'",
		["ᡭ"]="h'",
		["ᡵ"]="r",
		["ᡶ"]="f",
		["ᠸ"]="w",
		["ᡮ"]="c",
		["ᡟ"]="y'",
		["ᡯ"]="z",
		["ᡰ"]="r'",
		["ᡱ"]="q'‍'", -- 避免连续单引号''→斜体
		["ᡷ"]="j'‍'" ,-- 避免连续单引号''→斜体
		["ᠩ"]="ng",
		["᠇"]="‍'", --SYLLABLE BOUNDARY MARKER 避免连续单引号''→斜体
		["᠊"]="-", --Nirugu 字干符
		["‍"]="-", --ZWJ 零宽度连接符
		[" "]="-", --NNBSP 窄不换行空格
		["᠋"]="^", --FREE VARIATION SELECTOR ONE 自由变体选择符1
		["᠌"]="^^", --FREE VARIATION SELECTOR TWO 自由变体选择符2
		["᠍"]="^^^", --FREE VARIATION SELECTOR THREE 自由变体选择符3
		["᠎"]="^^^^", --VOWEL SEPARATOR 元音分隔符
		["᠈"]=",", --ᠴᡳᡴ᠋
		["᠉"]="." --ᠴᡳᡴ᠋
	}
	text=text.args[1]
	text=mw.ustring.gsub(text,"([ᡴᡤᡥ])᠋ᡡ","%1'v") -- k'v g'v h'v
	text=mw.ustring.gsub(text,"ᠨ᠋","n'") --借词/专有名词中有点的-n
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡳ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠇᠊‍])","%1i%2") -- 元音后-i的词中型
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡨ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠊‍])","%1t%2") -- 闭音节末尾的-t
	text=mw.ustring.gsub(text,"[ᠠᡝᡳᠣᡠᡡᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡟᡯᡰᡱᡷᠩ᠇᠊‍ ᠋᠌᠍᠎᠈᠉]",abkai)
	text=mw.ustring.gsub(text,"'‍'i","y'") -- 知 蚩 jy'=j''i, qy'=q''i
	text=mw.ustring.gsub(text,"([aeiouv])[ou]%^?","%1u") -- →Au
	text=mw.ustring.gsub(text,"</?br[/ ]->"," ") --换行→空格
	return text
end

-- v(text) 穆麟德
	-- ῾=U+1FFE
function export.v(text)
	local special={
		["ᡮᡟ"]="ts", -- 雌
		["ᡱᡳ"]="c῾y", -- 蚩
		["ᡷᡳ"]="jy", -- 知
		["ᡴ᠋ᡡ"]="k῾ū", --阴性k
		["ᡤ᠋ᡡ"]="g῾ū", --阴性g
		["ᡥ᠋ᡡ"]="h῾ū" --阴性h
	}
	local von={
		["ᠠ"]="a",
		["ᡝ"]="e",
		["ᡳ"]="i",
		["ᠣ"]="o",
		["ᡠ"]="u",
		["ᡡ"]="ū",
		["ᠨ"]="n",
		["ᡴ"]="k",
		["ᡤ"]="g",
		["ᡥ"]="h",
		["ᠪ"]="b",
		["ᡦ"]="p",
		["ᠰ"]="s",
		["ᡧ"]="š",
		["ᡨ"]="t",
		["ᡩ"]="d",
		["ᠯ"]="l",
		["ᠮ"]="m",
		["ᠴ"]="c",
		["ᠵ"]="j",
		["ᠶ"]="y",
		["ᠺ"]="k῾",
		["ᡬ"]="g῾",
		["ᡭ"]="h῾",
		["ᡵ"]="r",
		["ᡶ"]="f",
		["ᠸ"]="w",
		["ᡮ"]="ts῾",
		["ᡟ"]="y",
		["ᡯ"]="dz",
		["ᡰ"]="ž",
		["ᡱ"]="c῾",
		["ᡷ"]="j῾", -- 穆麟德转写中不存在j῾,为便于区分记为j῾
		["ᠩ"]="ng",
		["᠇"]="", -- SYLLABLE BOUNDARY MARKER 穆麟德转写不体现
		["᠊"]="-", -- Nirugu 字干符
		["‍"]="-", -- ZWJ 零宽度连接符
		[" "]=" ", -- NNBSP 窄不换行空格→NBSP 不换行空格
		["᠈"]=",",
		["᠉"]="."
	}
	text=text.args[1]
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡳ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠇᠊‍])","%1i%2") -- 元音后-i的词中型
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡨ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠊‍])","%1t%2") -- 闭音节末尾的-t
	text=mw.ustring.gsub(text,"ᡯᡳ᠌?","dzi") -- 资 dzi+FVS2→dzi
	text=mw.ustring.gsub(text,"ᠨ᠋","n῾") --借词/专有名词中有点的-n, 穆麟德转写中不存在, 为便于区分保留
	text=mw.ustring.gsub(text,"[ᡮᡱᡷ][ᡟᡳ]",special) -- 雌 蚩 知
	text=mw.ustring.gsub(text,"[ᡴᡤᡥ]᠋ᡡ",special) -- k῾ū g῾ū h῾ū
	text=mw.ustring.gsub(text,"[ᠠᡝᡳᠣᡠᡡᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡟᡯᡰᡱᡷᠩ᠇᠊‍ ᠈᠉]",von)
	text=mw.ustring.gsub(text,"([aeiouū])u᠋?","%1o") -- Au→Ao
	text=mw.ustring.gsub(text,"</?br[/ ]->"," ") --换行→空格
	return text
end
-- p(text) 新满汉
function export.p(text)
	local pinyin={
		["ᠠ"]="a",
		["ᡝ"]="e",
		["ᡳ"]="i",
		["ᠣ"]="o",
		["ᡠ"]="u",
		["ᡡ"]="uu",
		["ᠨ"]="n",
		["ᡴ"]="k",
		["ᡤ"]="g",
		["ᡥ"]="h",
		["ᠪ"]="b",
		["ᡦ"]="p",
		["ᠰ"]="s",
		["ᡧ"]="sh",
		["ᡨ"]="t",
		["ᡩ"]="d",
		["ᠯ"]="l",
		["ᠮ"]="m",
		["ᠴ"]="ch",
		["ᠵ"]="zh",
		["ᠶ"]="y",
		["ᠺ"]="kk",
		["ᡬ"]="gg",
		["ᡭ"]="hh",
		["ᡵ"]="r",
		["ᡶ"]="f",
		["ᠸ"]="w",
		["ᡮ"]="c",
		["ᡟ"]="y",
		["ᡯ"]="z",
		["ᡰ"]="rr",
		["ᡱ"]="ch",
		["ᡷ"]="zh",
		["ᠩ"]="ng",
		["᠇"]="", -- SYLLABLE BOUNDARY MARKER 《新满汉大词典》转写中不体现隔音符
		["᠊"]="-",
		["‍"]="-", --零宽度连接符
		[" "]=" ", --窄不换行空格
		["᠈"]=",",
		["᠉"]="."
	}
	text=text.args[1]
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡳ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠇᠊‍])","%1i%2") -- 元音后-i的词中型
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡨ᠌?([ᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡯᡰᡱᡷᠩ᠊‍])","%1t%2") -- 闭音节末尾的-t
	text=mw.ustring.gsub(text,"ᡯᡳ᠌?","zy") -- 资
	text=mw.ustring.gsub(text,"ᡱᡳ","chy") -- 蚩
	text=mw.ustring.gsub(text,"ᡷᡳ","zhy") -- 知
	text=mw.ustring.gsub(text,"ᠰᡥ","s'h") -- 隔音符号
	text=mw.ustring.gsub(text,"([ᠠᡝᡳᠣᡠᡡ])ᡠ᠋?","%1o") -- Au→Ao
	text=mw.ustring.gsub(text,"[ᠠᡝᡳᠣᡠᡡᠨᡴᡤᡥᠪᡦᠰᡧᡨᡩᠯᠮᠴᠵᠶᠺᡬᡭᡵᡶᠸᡮᡟᡯᡰᡱᡷᠩ᠇᠊‍ ᠈᠉]",pinyin)
	text=mw.ustring.gsub(text,"</?br[/ ]->"," ") --换行→空格
	return text
end

-- n(text) 不同的转写数量
function export.n(text)
	n=3
	abk=export.a(text) --太清
	von=export.v(text) --穆麟德
	pin=export.p(text) --新满汉
	if abk~=von then
		n=3 --太清≠穆麟德
	else
		if abk~=pin then
			n=2 --太清=穆麟德≠新满汉
		else
			n=1 --太清=穆麟德=新满汉
		end
	end
	return n
end
-- all(text) 三种转写
function export.all(text)
	abk=export.a(text) --太清
	von=export.v(text) --穆麟德
	pin=export.p(text) --新满汉
	text=text.args[1]
	if abk~=von then
		text=text..'|a= '..abk..' |v='..von..' |p='..pin --太清≠穆麟德
	else
		if abk~=pin then
			text=text..'|va='..abk..'|p='..pin --太清=穆麟德≠新满汉
		else
			text=text..'|t='..abk --太清=穆麟德=新满汉
		end
	end
	return text
end

--转写→满文
-- 太清转写→满文
function export.Ma(text)
	local special={
		["n'"]="ᠨ᠋", --借词/专有名词有点的-n
		["r'"]="ᡰ",
		["ng"]="ᠩ",
		["qy'"]="ᡱᡳ", --蚩
		["jy'"]="ᡷᡳ", --知
		["k'v"]="ᡴ᠋ᡡ", --阴性k
		["g'v"]="ᡤ᠋ᡡ", --阴性g
		["h'v"]="ᡥ᠋ᡡ", --阴性h
		["q''"]="ᡱ",
		["j''"]="ᡷ"
	}
	local kghy={
		["k'"]="ᠺ",
		["g'"]="ᡬ",
		["h'"]="ᡭ",
		["y'"]="ᡟ"
	}
	local abkai={
		["a"]="ᠠ",
		["e"]="ᡝ",
		["i"]="ᡳ",
		["o"]="ᠣ",
		["u"]="ᡠ",
		["v"]="ᡡ",
		["n"]="ᠨ",
		["k"]="ᡴ",
		["g"]="ᡤ",
		["h"]="ᡥ",
		["b"]="ᠪ",
		["p"]="ᡦ",
		["s"]="ᠰ",
		["x"]="ᡧ",
		["t"]="ᡨ",
		["d"]="ᡩ",
		["l"]="ᠯ",
		["m"]="ᠮ",
		["q"]="ᠴ",
		["j"]="ᠵ",
		["y"]="ᠶ",
		["r"]="ᡵ",
		["f"]="ᡶ",
		["w"]="ᠸ",
		["c"]="ᡮ",
		["z"]="ᡯ",
		["'"]="᠇", --SYLLABLE BOUNDARY MARKER
		-- ["-"]="᠊", --Nirugu 字干符
		-- ["-"]="‍", --ZWJ 零宽度连接符
		["-"]=" ", --NNBSP 窄不换行空格
		[","]="᠈",
		["."]="᠉"
	}
	text=text.args[1]
	text=mw.ustring.gsub(text,"[‘’῾]","'") -- 引号全角→半角 U+1FFE→引号
	text=mw.ustring.gsub(text,",",",") -- 全角→半角
	text=mw.ustring.gsub(text,"。",".") -- 全角→半角
	text=mw.ustring.gsub(text,"'‍'","''")
	text=mw.ustring.gsub(text,"ZWJ","‍") --ZWJ 零宽度连接符
	text=mw.ustring.gsub(text,"([aeiouv])i([nkghbpsxtdlmqjyrfwcz'‍])","%1ᡳ᠌%2") -- 元音后-i词中型
	text=mw.ustring.gsub(text,"([aeiouv])t([nkghbpsxtdlmqjyrfwcz‍])","%1ᡨ᠌%2") -- 闭音节末尾的-t
	text=mw.ustring.gsub(text,"([aeiouv])[uo]","%1ᡠ᠋") -- 双元音
	text=export.fvs(text)
	text=mw.ustring.gsub(text," +%-i "," ᡳ ")
	text=mw.ustring.gsub(text,"[qjnkghr][y'g]['v]?",special)
	text=mw.ustring.gsub(text,"[kghy]'",kghy)
	text=mw.ustring.gsub(text,"[aeiouvnkghbpsxtdlmqjyrfwcz'%-,%.]",abkai)
	return text
end
-- 穆麟德→满文
function export.Mv(text)
	local special={
		["n῾"]="ᠨ᠋",
		["k῾"]="ᠺ",
		["g῾"]="ᡬ",
		["h῾"]="ᡭ",
		["sy"]="ᠰᡟ",
		["jy"]="ᡷᡳ",
		["ng"]="ᠩ",
		["ts῾"]="ᡮ",
		["dzi"]="ᡯᡳ᠌",
		["c῾y"]="ᡱᡳ",
		["ts"]="ᡮᡟ",
		["dz"]="ᡯ",
		["c῾"]="ᡱ",
		["j῾"]="ᡷ"
	}
	local von={
		["a"]="ᠠ",
		["e"]="ᡝ",
		["i"]="ᡳ",
		["o"]="ᠣ",
		["u"]="ᡠ",
		["ū"]="ᡡ",
		["n"]="ᠨ",
		["k"]="ᡴ",
		["g"]="ᡤ",
		["h"]="ᡥ",
		["b"]="ᠪ",
		["p"]="ᡦ",
		["s"]="ᠰ",
		["š"]="ᡧ",
		["t"]="ᡨ",
		["d"]="ᡩ",
		["l"]="ᠯ",
		["m"]="ᠮ",
		["c"]="ᠴ",
		["j"]="ᠵ",
		["y"]="ᠶ",
		["r"]="ᡵ",
		["f"]="ᡶ",
		["w"]="ᠸ",
		["ž"]="ᡰ",
		["῾"]="᠇",
		["-"]=" ", -- NNBSP 窄不换行空格
		[","]="᠈",
		["."]="᠉"
	}
	text=text.args[1]
	text=mw.ustring.gsub(text,"[‘’']","῾") -- 引号→U+1FFE
	text=mw.ustring.gsub(text,"ZWJ","‍") --ZWJ 零宽度连接符
	text=mw.ustring.gsub(text,"([aeiouū])i([nkghbpsštdlmcjyrfwž῾‍])","%1ᡳ᠌%2") -- 元音后-i词中型
	text=mw.ustring.gsub(text,"([aeiouū])t([nkghbpsštdlmcjyrfwž‍])","%1ᡨ᠌%2") -- 闭音节末尾的-t
	text=mw.ustring.gsub(text,"([kgh])῾ū","%1᠋ᡡ") -- 阴性k 阴性g 阴性h
	text=mw.ustring.gsub(text,"[kghsjn][῾yg]",special)
	text=mw.ustring.gsub(text,"[tdc][sz῾][῾iy]",special)
	text=mw.ustring.gsub(text,"[tdcj][sz῾]",special)
	text=mw.ustring.gsub(text,"([aeiouū])[ou]","%1ᡠ᠋")
	text=mw.ustring.gsub(text,"[aeiouūnkghbpsštdlmcjyrfwž῾%-,%.]",von)
	return text
end

-- 转写间转换
-- 穆麟德→太清
function export.Av(text)
	text.args[1]=export.Mv(text)
	text=export.a(text)
	return text
end
-- 太清→穆麟德
function export.Va(text)
	text.args[1]=export.Ma(text)
	text=export.v(text)
	return text
end
-- 太清→新满汉
function export.Pa(text)
	text.args[1]=export.Ma(text)
	text=export.p(text)
	return text
end
-- 穆麟德→新满汉
function export.Pv(text)
	text.args[1]=export.Mv(text)
	text=export.p(text)
	return text
end
-- FREE VARIATION SELECTOR & VOWEL SEPARATOR
function export.fvs(text)
	text=mw.ustring.gsub(text,"%^%^%^%^","᠎")
	text=mw.ustring.gsub(text,"%^%^%^","᠍")
	text=mw.ustring.gsub(text,"%^%^","᠌")
	text=mw.ustring.gsub(text,"%^","᠋")
	return text
end
return export