可在模組:POJ/doc建立此模組的說明文件

-- Pún bô͘-cho͘ kā it-poaⁿ Lô-má-jī kap sò͘-jī pian-e̍k chò Tâi-oân-ōe Pe̍h-ōe-jī.
-- Lē:  Peh8-oe7-ji7--> Pe̍h-ōe-jī
-- Chhiáⁿ sú-iōng {{Pang-bô͘:POJ}} lâi kek-oa̍h chia ê kong-lêng.

local p = {}

-- Kā siaⁿ-tiāu sò͘-jī choán-oāⁿ chò piàn-im hû-hō.
-- Ho͘ selectVowel() ho͘-kiò.
function attachTone(a, n)
    n = tonumber(n)
	
	if a == "O" then
	local upperO = {"O", "Ó", "Ò", "O", "Ô", "Ǒ", "Ō", "O̍"}
		if (n>=1 and n<=8) then return upperO[n] end
	return a
	end
 
 	if a == "o" then
    local lowerO = {"o", "ó", "ò", "o", "ô", "ǒ", "ō", "o&#781;"} 
		if (n>=1 and n<=8) then return lowerO[n] end
		return a
	end

	if a == "E" then
    local upperE = {"E", "É", "È", "E", "Ê", "Ě", "Ē", "E&#781;"}
		if (n>=1 and n<=8) then return upperE[n] end
		return a
	end
 
 	if a == "e" then
    local lowerE = {"e", "é", "è", "e", "ê", "ě", "ē", "e&#781;"}
		if (n>=1 and n<=8) then return lowerE[n] end
		return a
	end
	
    if a == "A" then
    local upperA = {"A", "Á", "À", "A", "Â", "Ǎ", "Ā", "A&#781;"}
    	if (n>=1 and n<=8) then return upperA[n] end
		return a
	end
	
	if a == "a" then
    local lowerA = {"a", "á", "à", "a", "â", "ǎ", "ā", "a&#781;"}
		if (n>=1 and n<=8) then return lowerA[n] end
		return a
	end

    if a == "U" then
    local upperU = {"U", "Ú", "Ù", "U", "Û", "Ǔ", "Ū", "U&#781;"}
		if (n>=1 and n<=8) then return upperU[n] end
		return a
	end

    if a == "u" then
    local lowerU = {"u", "ú", "ù", "u", "û", "ǔ", "ū", "u&#781;"}
		if (n>=1 and n<=8) then return lowerU[n] end
		return a
	end
 
    if a == "I" then
    local upperI = {"I", "Í", "Ì", "I", "Î", "Ǐ", "Ī", "I&#781;"}
		if (n>=1 and n<=8) then return upperI[n] end
		return a
	end
	
	if a == "i" then
    local lowerI = {"i", "í", "ì", "i", "î", "ǐ", "ī", "i&#781;"}
		if (n>=1 and n<=8) then return lowerI[n] end
		return a
	end
	
	if a == "N" then
    local upperN = {"N", "N&#769;", "N&#768;", "N", "N&#770;", "N&#780;", "N&#772;", "N&#781;"}
		if (n>=1 and n<=8) then return upperN[n] end
		return a
	end
	
    if a == "n" then
    local lowerN = {"n", "n&#769;", "n&#768;", "n", "n&#770;", "n&#780;", "n&#772;", "n&#781;"}
		if (n>=1 and n<=8) then return lowerN[n] end
		return a
	end

    if a == "M" then
	local upperM = {"M", "M&#769;", "M&#768;", "M", "M&#770;", "M&#780;", "M&#772;", "M&#781;"}
        if (n>=1 and n<=8) then return upperM[n] end
		return a
	end
	
	if a == "m" then
	local lowerM = {"m", "m&#769;", "m&#768;", "m", "m&#770;", "m&#780;", "m&#772;", "m&#781;"}
		if (n>=1 and n<=8) then return lowerM[n] end
		return a
	end
    
    if a == "Oo" then
    local upperOo = {"O&#856;", "Ó&#856;", "Ò&#856;", "O&#856;", "Ô&#856;", "Ǒ&#856;", "Ō&#856;", "O&#781;&#856;"} 
		if (n>=1 and n<=8) then return upperOo[n] end
        return a
	end
    
    if a == "oo" then
    local lowerOo = {"o&#856;", "ó&#856;", "ò&#856;", "o&#856;", "ô&#856;", "ǒ&#856;", "ō&#856;", "o&#781;&#856;"} 
		if (n>=1 and n<=8) then return lowerOo[n] end
		return a
	end
	return a
 
end

-- Koat-tēng tó chi̍t-ê goân-im ài thiap piàn-im hû-hō.
-- Thiap siaⁿ-tiāu ê chiàu-pâi: oa_, oe_, o, e, a, u, i, ng, m.
-- Í-hā ê chiàu-pâi nā kái-piàn, su-chhut ē bô-kâng.
function selectVowel(rplce, n)
 
	if not rplce then return end
    -- oa_
    oax = {
        'Oai',
        'oai',
        'Oan',
        'oan',
        'Oah', --5
        'oah',
        'Oak',
        'oak',
        'Oat',
        'oat', --10
        'Oap',
        'oap'
    }
    for i=1, #oax do
        if rplce:find(oax[i]) then return rplce:gsub('a', attachTone('a', n)) end
    end
    
    OAx = {
        'OAI',
        'OAN',
        'OAH',
        'OAK',
        'OAT', --5
        'OAP',
    }
    for i=1, #OAx do
        if rplce:find(OAx[i]) then return rplce:gsub('A', attachTone('A', n)) end
    end

    -- oe_
   oex = {
        'Oei',
        'oei',
        'Oen',
        'oen',
        'Oeh', --5
        'oeh',
        'Oek',
        'oek',
        'Oet',
        'oet', --10
        'Oep',
        'oep'
    }
    for i=1, #oex do
        if rplce:find(oex[i]) then return rplce:gsub('e', attachTone('e', n)) end
    end
    
    OEx = {
        'OEI',
        'OEN',
        'OEH',
        'OEK',
        'OET', --5
        'OEP',
    }
    for i=1, #OEx do
        if rplce:find(OEx[i]) then return rplce:gsub('E', attachTone('E', n)) end
    end

    -- o, e, a, u, i, ng, m
    local oeauingm = {
        'oo',
        'Oo',
        'OO',
        'o',
        'O', --5
        'e',
        'E',
        'a',
        'A',
        'u', --10
        'U',
        'i',
        'I',
        'ng',
        'Ng', --15
        'NG',
        'm',
        'M'
    }
    local chara = {
        'oo',
        'Oo',
        'Oo',
        'o',
        'O', --5
        'e',
        'E',
        'a',
        'A',
        'u', --10
        'U',
        'i',
        'I',
        'n',
        'N', --15
        'N',
        'm',
        'M'
    }
    for i=1, #oeauingm do
        if rplce:find(oeauingm[i]) then
            return rplce:gsub(chara[i], attachTone(chara[i], n))
        end
    end
    
end
 
function p.POJ(frame)
	local input = frame.args[1]
	if not input then return end
	local out = input:gsub("([%a]+)(%d)", selectVowel):gsub("nn", "&#8319;"):gsub("NN", "&#8319;"):gsub("oo", "o&#856;"):gsub("Oo", "O&#856;"):gsub("OO", "O&#856;")
	return (out)
end
 
return p