Module:Ko-pron
| This module is rated as pre-alpha. It is incomplete and may or may not be in active development. Do not use it in article namespace pages. A module remains in pre-alpha until its developer, or another editor who adopts it if it is abandoned for some time, considers the basic structure complete. |
Usage
{{#invoke:Ko-pron|function_name}}
local export = {}
local m_data = mw.loadData("Module:Ko-pron/data")
local m_ko_utilities = require("Module:ko")
local m_str_utils = require("Module:string utilities")
local codepoint = m_str_utils.codepoint
local concat = table.concat
local floor = math.floor
local gmatch = m_str_utils.gmatch
local gsub = m_str_utils.gsub
local insert = table.insert
local len = m_str_utils.len
local match = m_str_utils.match
local pattern_escape = m_str_utils.pattern_escape
local sub = m_str_utils.sub
local toNFC = mw.ustring.toNFC
local u = m_str_utils.char
local upper = m_str_utils.upper
local PAGENAME = mw.loadData("Module:headword/data").pagename
local PAGENAME2 = gsub(PAGENAME, "-", "")
local system_lookup = {
["ph"] = 1, ["rr"] = 2, ["rrr"] = 3,
["mr"] = 4, ["yr"] = 5, ["ipa"] = 6,
}
local question_mark = "<sup><small>[[Wiktionary:Korean entry guidelines/Romanization|?]]</small></sup>"
local system_list = {
{
abbreviation = "ph",
display = "Phonetic hangul: ",
separator = "/",
},
{
abbreviation = "rr",
display = "Revised Romanization" .. question_mark,
separator = "/",
},
{
abbreviation = "rrr",
display = "Revised Romanization (translit.)" .. question_mark,
separator = "/"
},
{
abbreviation = "mc",
display = "McCune–Reischauer" .. question_mark,
separator = "/"
},
{
abbreviation = "yr",
display = "Yale Romanization" .. question_mark,
separator = "/"
},
{
abbreviation = "ipa",
display = "(<i>[[w:South Korean standard language|SK Standard]]/[[w:Seoul dialect|Seoul]]</i>) [[Wiktionary:International Phonetic Alphabet|IPA]]<sup>([[Appendix:Korean pronunciation|key]])</sup>: ",
separator = " ~ "
}
}
--[[
vowel_variation:
rules for vowel transformation.
key:
the number of a syllable's vowel (vowel_id):
floor(((codepoint('가') - 0xAC00) % 588) / 28) = 0
floor(((codepoint('개') - 0xAC00) % 588) / 28) = 1
value:
an integer that is added to the decimal codepoint of the syllable
u(codepoint('개') + 112) = '게'
allowed_vowel_scheme:
a list of which systems vowel transformation is reflected in.
key:
vowel_id .. "-" .. system_index
system_index: see system_list above. IPA is #6
value:
1, representing true
]]
local final_syllable_conversion = { [""] = "Ø", ["X"] = "" }
local com_mc = { ["g"] = "k", ["d"] = "t", ["b"] = "p", ["j"] = "ch", ["sy"] = "s", ["s"] = "ss" }
local com_ph = { ["ᄀ"] = "ᄁ", ["ᄃ"] = "ᄄ", ["ᄇ"] = "ᄈ", ["ᄉ"] = "ᄊ", ["ᄌ"] = "ᄍ" }
local vowel_variation = {
[1] = 112, -- 개→게
[3] = 112, -- 걔→계
[10] = 140, -- 괘→궤
[7] = -56, -- 계→게
[11] = 112, -- 괴→궤
[16] = 0, -- 귀→귀
}
local allowed_vowel_scheme = {
["1-1"] = 1,
["1-6"] = 1,
["3-1"] = 1,
["3-6"] = 1,
["10-1"] = 1,
["10-6"] = 1,
["7-1"] = 1,
["7-6"] = 1,
["11-1"] = 1,
["11-6"] = 1,
["16-6"] = 1,
}
local ambiguous_intersyllabic_rr = { ["oe"] = 1, ["eo"] = 1, ["eu"] = 1, ["ae"] = 1, ["ui"] = 1 }
local ambiguous_intersyllabic_mr = { ["oe"] = 1, ["ae"] = 1 }
local ambiguous_intersyllabic_yr = { ["ay"] = 1, ["ey"] = 1, ["oy"] = 1, ["uy"] = 1, ["̄y"] = 1, ["ya"] = 1, ["ye"] = 1, ["yo"] = 1, ["yu"] = 1 }
local function decompose_syllable(word)
local decomposed_syllables = {}
for syllable in mw.text.gsplit(word, "") do
insert(decomposed_syllables, m_ko_utilities.decompose_jamo(syllable))
end
return decomposed_syllables
end
local function tidy_phonetic(original, romanised)
local j, k, w = 1, 1, {}
for i = 1, len(romanised) do
local romanised_syllable = sub(romanised, k, k)
local original_syllable = sub(original, j, j)
if romanised_syllable ~= original_syllable then
insert(w, '<b>'..romanised_syllable..'</b>')
local original_advance = match(original_syllable, "[^ː ]")
local romanised_advance = match(romanised_syllable, "[^ː ]")
if original_advance or not romanised_advance then
k = k + 1
end
if romanised_advance or not original_advance then
j = j + 1
end
else
insert(w, '<span>'..romanised_syllable..'</span>')
j, k = j + 1, k + 1
end
end
return concat(w)
end
local function tidy_ipa(ipa)
ipa = gsub(ipa, "ʌ̹%(ː%)", "ɘ(ː)") -- TODO: [[멀다]] really should be [ˈmʌ̹ɭda̠] ~ [ˈmɘːɭda̠] instead of [ˈmɘ(ː)ɭda̠]
ipa = gsub(ipa, "ɭɭi", "ʎʎi")
ipa = gsub(ipa, "ɭɭj", "ʎʎ")
ipa = gsub(ipa, "s([ʰ͈])ɥi" ,"ʃ%1ɥi")
ipa = gsub(ipa, "ss͈([ji])" ,"ɕɕ͈%1")
ipa = gsub(ipa, "s([ʰ͈])([ji])" ,"ɕ%1%2")
ipa = gsub(ipa, "nj", "ɲ")
ipa = gsub(ipa, "([ʑɕ])([ʰ͈]?)j", "%1%2")
ipa = gsub(ipa, "kʰ[ijɯ]", {
["kʰi"] = "cçi",
["kʰj"] = "cç",
["kʰɯ"] = "kxɯ" }
)
ipa = gsub(ipa, "[hɦ][ijɯouw]", {
["hi"] = "çi",
["hj"] = "ç",
["hɯ"] = "xɯ",
["ho"] = "ɸʷo",
["hu"] = "ɸʷu",
["hw"] = "ɸw",
["ɦi"] = "ʝi",
["ɦj"] = "ʝ",
["ɦɯ"] = "ɣɯ",
["ɦo"] = "βo",
["ɦu"] = "βu",
["ɦw"] = "βw" }
)
if match(ipa, "ɥi") then
local midpoint = floor(len(ipa) / 2)
ipa = sub(ipa, 1, midpoint) .. gsub(sub(ipa, midpoint+1, -1), "ɥi", "y")
end
return ipa
end
function export.romanise(text_param, system_index, args)
if type(text_param) == "table" then
args = text_param:getParent().args
system_index = args[2] or 2
text_param = args[1]
end
local p, optional_params = {}, { "nn", "l", "com", "cap", "ni" }
for _, pm in ipairs(optional_params) do
p[pm] = { }
if args[pm] then
for pp in mw.text.gsplit(args[pm], ",") do p[pm][tonumber(pp) or pp] = 1 end
end
end
local categories = {}
local vowel_ui_i, vowel_ui_e, no_batchim, batchim_reduce, s_variation, iotation =
args.ui, args.uie, args.nobc, args.bcred, args.svar, args.iot
system_index = system_lookup[system_index] or system_index
text_param = gsub(text_param, '["](.)', "%1")
for primitive_word in gmatch(text_param, "[%-ᄀ-ᄒ".."ᅡ-ᅵ".."ᆨ-ᇂ" .. "ㄱ-ㅣ가-힣' -]+") do
local the_original = primitive_word
primitive_word = gsub(primitive_word, "'''", "ß")
local formatting_position, formatting_count = {}, 0
primitive_word = gsub(primitive_word, "()([ß-])", function(m1, m2)
formatting_position[m1 + formatting_count] = m2 == "ß" and "'''" or m2
return ""
end)
local has_vowel = {}
for ch in gmatch(primitive_word, ".") do
local jungseong = floor(((codepoint(ch) - 0xAC00) % 588) / 28)
if not match(ch, "[예옛옘례롄]") and match(ch, "[가-힣]") then has_vowel[jungseong] = true end
end
local word_set = { primitive_word }
local function add_respelling(variable, modification, modification2)
modification2 = modification2 or function(x) return x end
if variable and match(system_index, "[16]") then
variable = tonumber(variable)
local pre_length = #word_set
for i = 1, pre_length do
local item = mw.text.split(word_set[i], "")
item[variable] = modification(item[variable])
item[variable + 1] = modification2(item[variable + 1])
word_set[pre_length + i] = concat(item)
end
end
end
add_respelling(vowel_ui_i, function(x) return "이" end)
add_respelling(vowel_ui_e, function(x) return "에" end)
add_respelling(no_batchim,
function(x) return u(codepoint(x) - (codepoint(x) - 0xAC00) % 28) end,
function(y) return u(codepoint(y) + 588) end)
add_respelling(s_variation, function(x) return u(codepoint(x) - 12) end)
add_respelling(iotation, function(x) return u(codepoint(x) + 56) end)
for vowel_id, vowel_variation_increment in pairs(vowel_variation) do
if has_vowel[vowel_id] and allowed_vowel_scheme[vowel_id .. "-" .. system_index] then
local pre_length = #word_set
for i = 1, pre_length do
local item = mw.text.split(word_set[i], "")
for num, it in ipairs(item) do
if floor(((codepoint(it) - 0xAC00) % 588) / 28) == vowel_id then
item[num] = u(codepoint(it) + vowel_variation_increment)
end
end
if vowel_id == 11 then
insert(word_set, i, concat(item))
else
insert(word_set, concat(item))
end
end
end
end
local word_set_romanisations = {}
for _, respelling in ipairs(word_set) do
local decomposed_syllables = decompose_syllable(respelling)
local romanisation = {}
local formatting_insert_count = 0
for index = 0, #decomposed_syllables, 1 do
local this_syllable_text = index ~= 0 and sub(respelling, index, index) or ""
if this_syllable_text == "-" then
-- skip it, it will be handled below
else
local syllable = decomposed_syllables[index] or { initial = "Ø", vowel = "Ø", final = "X" }
local next_index = index
local next_syllable_text
local saw_hyphen_after = false
while true do
next_index = next_index + 1
next_syllable_text = next_index > #decomposed_syllables and "" or sub(respelling, next_index, next_index)
if next_syllable_text ~= "-" then
break
end
saw_hyphen_after = true
end
local next_syllable = decomposed_syllables[next_index] or { initial = "Ø", vowel = "Ø", final = "Ø" }
syllable.final = final_syllable_conversion[syllable.final] or syllable.final
if system_index == 5 and syllable.vowel == "ᅮ" and match(syllable.initial, "[ᄆᄇᄈᄑ]") then
syllable.vowel = "ᅳ"
end
if match(system_index, "[1246]") then
if match(syllable.initial, "[ᄌᄍᄎ]") then
if syllable.vowel == "ᅣ" then
syllable.vowel = "ᅡ"
elseif syllable.vowel == "ᅤ" then
syllable.vowel = "ᅢ"
elseif syllable.vowel == "ᅧ" then
syllable.vowel = "ᅥ"
elseif syllable.vowel == "ᅨ" then
syllable.vowel = "ᅦ"
elseif syllable.vowel == "ᅭ" then
syllable.vowel = "ᅩ"
elseif syllable.vowel == "ᅲ" then
syllable.vowel = "ᅮ"
end
end
end
if match(system_index, "[16]") then
if syllable.vowel == "ᅴ" and this_syllable_text ~= "의" then
syllable.vowel = "ᅵ"
end
end
if match(system_index, "[1246]") then
if this_syllable_text == "넓" then
if match(next_syllable.initial, "[ᄌᄉ]") then
syllable.final = "ᆸ"
elseif next_syllable.initial == "ᄃ" then
if match(next_syllable.vowel, "[^ᅡᅵ]") then
syllable.final = "ᆸ"
end
end
end
end
local vowel = m_data.vowels[syllable.vowel][system_index]
if p.nn[next_index] and match(system_index, "[1246]") then
next_syllable.initial = "ᄂ"
end
if p.com[index] and match(system_index, "[16]") then
next_syllable.initial = com_ph[next_syllable.initial] or next_syllable.initial
end
if p.ni[next_index] and system_index ~= 3 then
next_syllable.initial = (system_index == 5 and syllable.final == "ᆯ") and "ᄅ" or "ᄂ"
end
if match(system_index, "[1246]") then
if tonumber(batchim_reduce or -1) == index then
syllable.final = m_data.boundary[syllable.final .. "-Ø"][1]
end
if index ~= 0 and this_syllable_text == "밟" and not
match(next_syllable.initial, "[ᄋᄒ]") then
syllable.final = "ᆸ"
end
if next_syllable_text == "없" then
if match(syllable.final, "[ᆩᆪᆰᆿ]") then
syllable.final = "ᆨ"
elseif match(syllable.final, "[ᆬᆭ]") then
syllable.final = "ᆫ"
elseif match(syllable.final, "[ᆺᆻᆽᆾᇀ]") then
syllable.final = "ᆮ"
elseif match(syllable.final, "[ᆲᆳᆴᆶ]") then
syllable.final = "ᆯ"
elseif syllable.final == "ᆱ" then
syllable.final = "ᆷ"
elseif match(syllable.final, "[ᆵᆹᇁ]") then
syllable.final = "ᆸ"
end
end
if tonumber(batchim_reduce or -1) ~= index then
if match(syllable.final .. next_syllable.initial, "ᇀᄋ") then
if next_syllable.vowel == "ᅵ" then
syllable.final = "ᆾ"
elseif next_syllable.vowel == "ᅧ" then
syllable.final = "ᆾ"
next_syllable.vowel = "ᅥ"
end
elseif match(syllable.final .. next_syllable.initial, "ᆴᄋ") then
if next_syllable.vowel == "ᅵ" then
syllable.final = "ᆯ"
next_syllable.initial = "ᄎ"
elseif next_syllable.vowel == "ᅧ" then
syllable.final = "ᆯ"
next_syllable.initial = "ᄎ"
next_syllable.vowel = "ᅥ"
end
elseif match(syllable.final .. next_syllable.initial, "ᆮᄋ") and tonumber(s_variation or -1) ~= index then
if next_syllable.vowel == "ᅵ" then
syllable.final = "ᆽ"
elseif next_syllable.vowel == "ᅧ" then
syllable.final = "ᆽ"
next_syllable.vowel = "ᅥ"
end
elseif match(syllable.final .. next_syllable.initial, "ᆮᄒ") then
if next_syllable.vowel == "ᅵ" then
syllable.final = "ᆾ"
next_syllable.initial = "ᄋ"
elseif next_syllable.vowel == "ᅧ" then
syllable.final = "ᆾ"
next_syllable.initial = "ᄋ"
next_syllable.vowel = "ᅥ"
end
elseif match(syllable.final .. next_syllable.initial .. next_syllable.vowel, "[ᆬᆽᆾ][ᄋᄒ]ᅧ") then
next_syllable.vowel = "ᅥ"
end
end
if syllable.final .. next_syllable.initial == "ᆺᄋ" and not
match(next_syllable_text, "[아았어었에으은을음읍의이인일임입있]") then
syllable.final = "ᆮ"
end
end
local bound = syllable.final .. "-" .. next_syllable.initial
if not m_data.boundary[bound] then
require("Module:debug").track("ko-pron/no boundary data")
mw.log("No boundary data for " .. bound .. ".")
return nil
end
local junction = m_data.boundary[bound][system_index]
if system_index == 2 then
local pos_format_start = index + formatting_insert_count + 1
local pos_format_end = pos_format_start
while formatting_position[pos_format_end] do
pos_format_end = pos_format_end + 1
formatting_insert_count = formatting_insert_count + 1
end
if pos_format_end > pos_format_start then
local a, b = match(junction, "^(ng%-?)(.?)$")
if not a or not b then a, b = match(junction, "^(.?%-?)(.*)$") end
junction = match(syllable.final .. next_syllable.initial, "^Ø?[ᄀ-ᄒ]$")
and concat(formatting_position, "", pos_format_start, pos_format_end - 1) .. (a or "") .. (b or "")
or (a or "") .. concat(formatting_position, "", pos_format_start, pos_format_end - 1) .. (b or "")
end
end
if p.l[index] or (p.l["y"] and index == 1) then
-- FIXME, verify this code still works with final/initial cons changes
if system_index == 1 then
if #junction == 0 then
junction = junction .. "ː"
else
junction = gsub(junction, "^(.)(.?)$", function(a, b)
return match(a, "[ᆨ-ᇂ]") and a .. "ː" .. b or "ː" .. a .. b end)
end
elseif system_index == 5 then
vowel = gsub(vowel, "([aeiou])", "%1̄")
elseif system_index == 6 then
vowel = vowel .. "ː"
if index == 1 then
insert(categories, "Korean terms with long vowels in the first syllable")
end
end
end
if (p.l["y"] or p.l[1]) and index == 0 and system_index == 6 and #decomposed_syllables > 1 then
vowel = vowel .. "ˈ"
end
if p.com[index] then
-- FIXME, verify this code still works with final/initial cons changes
junction = gsub(junction, "(.)$", function(next_letter)
return
(system_index == 5 and "q" or "") ..
(system_index == 4
and (com_mc[next_letter..(p.cap["y"] or "")] or com_mc[next_letter] or next_letter)
or next_letter) end)
end
if p.ni[next_index] and system_index == 5 then
-- FIXME, verify this code still works with final/initial cons changes
junction = gsub(junction, "([nl])$", "<sup>%1</sup>")
end
local final_cons, initial_cons = match(junction, "^(.*);(.*)$")
if not final_cons then
if system_index == 2 then
error("Need a semicolon in the boundary value for " .. bound)
end
-- FIXME, throw an error for all systems once we've added semicolons everywhere
final_cons = junction
initial_cons = ""
end
if system_index == 2 then
insert(romanisation, vowel .. final_cons .. (saw_hyphen_after and "-" or "") .. initial_cons)
else
insert(romanisation, vowel .. junction)
end
end
end
local temp_romanisation = concat(romanisation)
if system_index == 1 then
temp_romanisation = tidy_phonetic(primitive_word, toNFC(temp_romanisation))
elseif match(system_index, "[23]") then
for i = 1, 2 do
temp_romanisation = gsub(temp_romanisation, "(.)…(.)", function(a, b)
return a .. (ambiguous_intersyllabic_rr[a .. b] and "'" or "") .. b end)
temp_romanisation = gsub(temp_romanisation, "wo'e", "woe")
temp_romanisation = gsub(temp_romanisation, "yo'e", "yoe")
temp_romanisation = gsub(temp_romanisation, "we'o", "weo")
temp_romanisation = gsub(temp_romanisation, "we'u", "weu")
temp_romanisation = gsub(temp_romanisation, "ye'u", "yeu")
temp_romanisation = gsub(temp_romanisation, "yu'i", "yui")
end
elseif system_index == 4 then
for i = 1, 2 do
temp_romanisation = gsub(temp_romanisation, "(.)…(.)", function(a, b)
return a .. (ambiguous_intersyllabic_mr[a .. b] and "'" or "") .. b end)
temp_romanisation = gsub(temp_romanisation, "yo'e", "yoe")
temp_romanisation = gsub(temp_romanisation, "a'e", "aë")
temp_romanisation = gsub(temp_romanisation, "o'e", "oë")
temp_romanisation = gsub(temp_romanisation, "n'k", "nk")
temp_romanisation = gsub(temp_romanisation, "swi", "shwi")
end
elseif system_index == 5 then
for i = 1, 2 do
temp_romanisation = gsub(temp_romanisation, "(.)…(.)", function(a, b)
return a .. (ambiguous_intersyllabic_yr[a .. b] and "." or "") .. b end)
temp_romanisation = gsub(temp_romanisation, "[.]q", "q")
end
elseif system_index == 6 then
temp_romanisation = "[" .. temp_romanisation .. "]"
end
if match(system_index, "[16]") then
temp_romanisation = gsub(temp_romanisation, "ː", "(ː)")
end
if p.cap["y"] and match(system_index, "[234]") then
temp_romanisation = upper(sub(temp_romanisation, 1, 1)) .. sub(temp_romanisation, 2, -1)
end
insert(word_set_romanisations, temp_romanisation)
end
text_param = gsub(
text_param,
pattern_escape(the_original),
concat(word_set_romanisations, system_list[system_index].separator),
1
)
end
if system_index == 6 then
text_param = tidy_ipa(text_param)
end
if #categories > 0 then
text_param = text_param .. require("Module:utilities").format_categories(categories, m_ko_utilities.lang)
end
return text_param
end
function export.make(frame, scheme)
local params = {
[1] = { default = PAGENAME2, list = true },
["a"] = {},
["audio"] = { alias_of = "a" },
["nn"] = {},
["l"] = {},
["com"] = {},
["cap"] = {},
["ui"] = {},
["uie"] = {},
["nobc"] = {},
["ni"] = {},
["bcred"] = {},
["svar"] = {},
["iot"] = {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
if args["l"] ~= nil then require("Module:debug/track")("ko-IPA/l") end
if args["cap"] ~= nil then require("Module:debug/track")("ko-IPA/cap") end
if args["com"] ~= nil then require("Module:debug/track")("ko-IPA/com") end
if args["nn"] ~= nil then require("Module:debug/track")("ko-IPA/nn") end
if args["ui"] ~= nil then require("Module:debug/track")("ko-IPA/ui") end
if args["uie"] ~= nil then require("Module:debug/track")("ko-IPA/uie") end
if args["nobc"] ~= nil then require("Module:debug/track")("ko-IPA/nobc") end
if args["ni"] ~= nil then require("Module:debug/track")("ko-IPA/ni") end
if args["bcred"] ~= nil then require("Module:debug/track")("ko-IPA/bcred") end
if args["svar"] ~= nil then require("Module:debug/track")("ko-IPA/svar") end
if args["iot"] ~= nil then require("Module:debug/track")("ko-IPA/iot") end
local results = {}
for _, text_param in ipairs(args[1]) do
local current_word_dataset = {}
for system_index, system in pairs(system_list) do
local romanised = export.romanise(text_param, system_index, args)
insert(current_word_dataset, romanised)
end
insert(results, current_word_dataset)
end
local output_result = { [1] = {}, [2] = {}, [3] = {}, [4] = {}, [5] = {}, [6] = {} }
for _, result in ipairs(results) do
for result_index, value in ipairs(result) do
insert(output_result[result_index], value)
end
end
local html_ul = mw.html.create( "ul" )
:done()
local html_li_ipa = mw.html.create( "li" )
:wikitext( system_list[6].display )
:tag( "span" )
:addClass( "IPA" )
:wikitext( concat(output_result[6], system_list[6].separator) )
:done()
:done()
local html_li_ph = mw.html.create( "li" )
:addClass( "ko-pron__ph" )
:wikitext( system_list[1].display )
:tag( "span" )
:addClass( "Kore" )
:attr( "lang", "ko" )
:wikitext( "[" .. concat(output_result[1], system_list[1].separator) .. "]" )
:done()
:done()
if args.a then
html_li_ipa
:tag( "ul" )
:tag( "li" )
:wikitext( require("Module:audio").format_audio {
lang = m_ko_utilities.lang,
file = args.a == "y" and "Ko-" .. PAGENAME .. ".ogg" or args.a,
})
:done()
:done()
:done()
end
if args.l then
html_li_ph
:tag( "ul" )
:tag( "li" )
:addClass( "ko-pron__note-vowel-length" )
:wikitext( 'Though still prescribed in Standard Korean, most speakers in both Koreas no longer distinguish vowel length.' )
:done()
:done()
:done()
end
html_ul
:node( html_li_ipa )
:node( html_li_ph )
:done()
local html_table = mw.html.create( "table" )
:addClass( "ko-pron" )
:addClass( "mw-collapsible" )
:addClass( "mw-collapsed" )
:tag( "tr" )
:tag( "th" )
:attr( "colspan", 2 )
:wikitext( "Romanizations" )
:done()
:done()
:done()
for roman_index = 2, 5 do
html_table
:tag( "tr" )
:tag( "th" )
:wikitext( system_list[roman_index].display )
:done()
:tag( "td" )
:addClass( "IPA" )
:wikitext( concat(output_result[roman_index], system_list[roman_index].separator) )
:done()
:done()
:done()
end
return tostring(html_ul) .. tostring(html_table) .. require("Module:TemplateStyles")("Template:ko-IPA/style.css")
end
function export.make_hanja(frame, scheme)
local params = {
[1] = { list = true },
["l"] = {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
local results = {
[1] = {},
[6] = {},
}
for _, text_param in ipairs(args[1]) do
for _, system_index in pairs({1, 6}) do
local romanised = export.romanise(text_param, system_index, args)
insert(results[system_index], romanised)
end
end
local html_ul = mw.html.create( "ul" )
:done()
local html_li_ipa = mw.html.create( "li" )
:wikitext( system_list[6].display )
:tag( "span" )
:addClass( "IPA" )
:wikitext( concat(results[6], system_list[6].separator) )
:done()
:done()
local html_li_ph = mw.html.create( "li" )
:addClass( "ko-pron__ph" )
:wikitext( system_list[1].display )
:tag( "span" )
:addClass( "Kore" )
:attr( "lang", "ko" )
:wikitext( "[" .. concat(results[1], system_list[1].separator) .. "]" )
:done()
:done()
if args.l then
html_li_ph
:tag( "ul" )
:tag( "li" )
:addClass( "ko-pron__note-vowel-length" )
:wikitext( 'Though still prescribed in Standard Korean, most speakers in both Koreas no longer distinguish vowel length.' )
:done()
:done()
:done()
end
html_ul
:node( html_li_ipa )
:node( html_li_ph )
:done()
return tostring(html_ul) .. require("Module:TemplateStyles")("Template:ko-IPA/style.css")
end
return export
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.