Module:Pinyin

local p = {}

function attachTone(a, n)   n = tonumber(n) if a == "a" then if n == 1 then return "ā" end if n == 2 then return "á" end if n == 3 then return "ǎ" end if n == 4 then return "à" end return a	end if a == "A" then if n == 1 then return "Ā" end if n == 2 then return "Á" end if n == 3 then return "Ǎ" end if n == 4 then return "À" end return a	end if a == "e" then if n == 1 then return "ē" end if n == 2 then return "é" end if n == 3 then return "ě" end if n == 4 then return "è" end return a	end if a == "E" then if n == 1 then return "Ē" end if n == 2 then return "É" end if n == 3 then return "Ě" end if n == 4 then return "È" end return a	end if a == "i" then if n == 1 then return "ī" end if n == 2 then return "í" end if n == 3 then return "ǐ" end if n == 4 then return "ì" end return a	end if a == "O" then if n == 1 then return "Ō" end if n == 2 then return "Ó" end if n == 3 then return "Ŏ" end if n == 4 then return "Ò" end return a	end if a == "o" then if n == 1 then return "ō" end if n == 2 then return "ó" end if n == 3 then return "ǒ" end if n == 4 then return "ò" end return a	end if a == "u" then if n == 1 then return "ū" end if n == 2 then return "ú" end if n == 3 then return "ǔ" end if n == 4 then return "ù" end return a	end if (a == "v") or (a == "ü") then if n == 1 then return "ǖ" end if n == 2 then return "ǘ" end if n == 3 then return "ǚ" end if n == 4 then return "ǜ" end return "ü" end if a == "Ê" then if n == 1 then return "E&#770;&#772;" end if n == 2 then return "Ế" end if n == 3 then return "E&#770;&#780;" end if n == 4 then return "Ề" end return a	end if a == "ê" then if n == 1 then return "e&#770;&#772;" end if n == 2 then return "ế" end if n == 3 then return "e&#770;&#780;" end if n == 4 then return "ề" end return a	end if a == "N" then if n == 2 then return "Ń" end if n == 3 then return "Ň" end if n == 4 then return "Ǹ" end return a	end if a == "n" then if n == 2 then return "ń" end if n == 3 then return "ň" end if n == 4 then return "ǹ" end return a	end if a == "M" then if n == 2 then return "Ḿ" end if n == 4 then return "M&#x300;" end return a	end if a == "m" then if n == 2 then return "ḿ" end if n == 4 then return "m&#x300;" end return a	end return a end

function selectVowel(chara, n)	if not chara then return end

if chara:find('^.*A') then return chara:gsub("A", attachTone("A", n)) end if chara:find('^.*a') then return chara:gsub("a", attachTone("a", n)) end

if chara:find('^.*E') then return chara:gsub("E", attachTone("E", n)) end if chara:find('^.*e') then return chara:gsub("e", attachTone("e", n)) end if chara:find('^.*Ê') then return chara:gsub("Ê", attachTone("Ê", n)) end if chara:find('^.*ê') then return chara:gsub("ê", attachTone("ê", n)) end if chara:find('^.*iu') then return chara:gsub("iu", "i"..attachTone("u", n)) end if chara:find('^.*i') then return chara:gsub("i", attachTone("i", n)) end

if chara:find('^.*O') then return chara:gsub("O", attachTone("O", n)) end if chara:find('^.*o') then return chara:gsub("o", attachTone("o", n)) end if chara:find('^.*u') then return chara:gsub("u", attachTone("u", n)) end if chara:find('^.*v') then return chara:gsub("v", attachTone("v", n)) end if chara:find('^.*ü') then return chara:gsub("ü", attachTone("ü", n)) end

if chara:find('^.*N') then return chara:gsub("N", attachTone("N", n)) end if chara:find('^.*n') then return chara:gsub("n", attachTone("n", n)) end

if chara:find('^.*M') then return chara:gsub("M", attachTone("M", n)) end if chara:find('^.*m') then return chara:gsub("m", attachTone("m", n)) end end

function p.pinyin(frame) local input = frame.args[1] if not input then return end local ve = input:gsub("nue", "nve"):gsub("lue", "lve") local out = ve:gsub("([%aüÊê]+)(%d)", selectVowel) return (out:gsub("v", "ü")) end

return p