Module:Ko-translit/clean
Appearance
| 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. |
Module containing functions used for Module:Ko-translit.
local p = {}
local m_utils = require('Module:Ko-utils')
local find = mw.ustring.find
local gsub_iterate = m_utils.gsub_iterate
-- Initial input validations
function p.validate_input(text)
if not m_utils.contains_hangul(text) then
error("Input must contain Hangul")
elseif m_utils.contains_reference(text) then
error("Input cannot contain references")
-- Note: If Yale support is added, remove below line and make overall romanization "N/A"
elseif find(text, "[ᄓ-ᅠᅶ-ᆧᇃ-ᇿ〮〯ㅤ-ㆎꥠ-ힰ-]") then
error("Input contains Hangul not supported by RR and MR")
elseif find(text, "[ᄀ-ᄒ]") or find(text, "[ᅡ-ᅵᆨ-ᇂ]") then
error("Do not input conjoining Hangul jamo directly")
elseif find(text, "`%*") then
error("Use *` instead of `*")
elseif find(text, "@%*") then
error("Use *@ instead of @*")
elseif find(text, "%^[^가-힣]") then
error("^ must be immediately followed by Hangul syllabic block")
elseif find(text, "[^%*0-9A-Za-z]`") or find(text, "[^0-9A-Za-z]%*`") or find(text, "`[^가-깋다-딯바-빟자-짛]") then
error("Found invalid sequence containing `")
elseif find(text, "[^%*ㄹ가-힣]@") or find(text, "[^가-힣]%*@") or find(text, "%*@[^가-깋다-딯바-빟자-짛]") or find(text, "ㄹ@[^가-깋다-딯바-빟사-싷자-짛]") or find(text, "@[^가-깋다-딯라-맇바-빟사-싷야-얳여-옅옇-옣요-욯유-윶윸-윻이-잍잏자-짛하-힣]") or find(text, "[받붙]잇@[가-깋]") or find(text, "앞엣@것") or find(text, "한솥엣@밥") then
error("Found invalid sequence containing @")
elseif find(text, "[^가-힣]%$") or find(text, "%$[^아어에엔엘여요으은을음읍의이인일임입]") then
error("Found invalid sequence containing $")
elseif find(text, "%%$") then
error("Remove final %")
elseif find(text, "[ _][ _]") then
error("No two or more consecutive space characters")
elseif find(text, "^[%$%*@_`]") or find(text, "^%%[^_가-힣]") or find(text, "[ _]%*") or find(text, "%*[ %*%-_]") or find(text, "%-%*") or find(text, "[-]") or find(text, "%%_$") or find(text, "[%$%*@%^`]$") then
error("Invalid input")
end
end
-- Validation after processing personal names and removing links & markups (before decomposing Hangul)
-- some invalid sequences can only be detected after doing those
function p.validate_composed(text)
if find(text, "[ _][ _]") then
error("No two or more consecutive space characters")
elseif find(text, "^[%$%*@_`]") or find(text, "[ _]%*") or find(text, "%*[ %*%-_]") or find(text, "%-%*") or find(text, "[%$%*@%^_`]$") then
error("Invalid input")
end
end
-- Validation after Hangul syllable decomposition
-- some invalid sequences are difficult to detect with precomposed Hangul syllables
function p.validate_decomposed(text)
if find(text, "[ᆨ-ᆪᆬ-ᆮᆴ-ᆶᆸᆹᆻᆽ-ᇂ]%*??@?[ᄀᄃᄇᄉᄌ]") or find(text, "ᆰ%*??@?[ᄀ-ᄊᄌ-ᄑ]") or find(text, "ᆲ?@?[ᄀ-ᄊᄌ-ᄑ]") or find(text, "ᆺ%*@[ᄀᄇ]") or find(text, "ᆺ%*??@?[ᄁ-ᄆᄈ-ᄊᄌ-ᄑ]") or find(text, "[ᅡ-ᅵᆨ-ᆪᆬ-ᇂ]?@?ᄅ") or find(text, "[ᅡ-ᅵ]?@?ᄋ") or find(text, "[ᅡ-ᅵᆫ-ᆭᆯᆱ-ᆷᆼ]?@?ᄒ") then
error("Found invalid sequence containing @")
elseif find(text, "[ᅡ-ᅵᆨᆫᆭ-ᆯᆶ-ᆸᆼ]?%$") then
error("Found invalid sequence containing $")
end
end
-- Remove links and markup, which are unnecessary or interfere with assimilation
function p.remove_links_and_markup(text)
local replacements = {
-- Remove bold/italic wikitext syntax
-- It is not impossible to allow bold/italic when it does not interfere with assimilation, but determining when to allow or disallow that adds complication for little practical gain
{"'''", ""},
{"''", ""},
-- Remove HTML tags (except br)
{"<[Bb][Rr] */?>", " "},
{"</?[A-Za-z][^>]->", ""},
{" ", "<br>"},
-- Remove wikilinks
{"%[%[[^%|]+%|(..-)%]%]", "%1"},
{"%[%[", ""},
{"%]%]", ""}
}
text = gsub_iterate(text, replacements)
text = mw.text.killMarkers(text)
return text
end
-- Converting escaped special chars to HTML tags to preserve them
function p.escaped_to_html(text)
local replacements = {
{"\\%$", "$"},
{"\\%%", "%"},
{"\\%*", "*"},
{"\\@", "@"},
{"\\%^", "^"},
{"\\_", "_"},
{"\\`", "`"}
}
return gsub_iterate(text, replacements)
end
-- Converting HTML tags back to unescaped chars
function p.html_to_ascii(text)
local replacements = {
{"$", "$"},
{"%", "%%"},
{"*", "*"},
{"@", "@"},
{"^", "^"},
{"_", "_"},
{"`", "`"}
}
return gsub_iterate(text, replacements)
end
-- Unwrapping enclosed Hangul text
-- Actually not very necessary, but these are also classified as Hangul chars in Unicode
-- No distinction is made between parenthesized and circled chars
-- Needs to be executed before decomposing Hangul
function p.unwrap_enclosed_hangul(text)
local replacements = {
{"[㈀㉠]", "(기역)"},
{"[㈁㉡]", "(니은)"},
{"[㈂㉢]", "(디귿)"},
{"[㈃㉣]", "(리을)"},
{"[㈄㉤]", "(미음)"},
{"[㈅㉥]", "(비읍)"},
{"[㈆㉦]", "(시옷)"},
{"[㈇㉧]", "(이응)"},
{"[㈈㉨]", "(지읒)"},
{"[㈉㉩]", "(치읓)"},
{"[㈊㉪]", "(키읔)"},
{"[㈋㉫]", "(티읕)"},
{"[㈌㉬]", "(피읖)"},
{"[㈍㉭]", "(히읗)"},
{"[㈎㉮]", "(가)"},
{"[㈏㉯]", "(나)"},
{"[㈐㉰]", "(다)"},
{"[㈑㉱]", "(라)"},
{"[㈒㉲]", "(마)"},
{"[㈓㉳]", "(바)"},
{"[㈔㉴]", "(사)"},
{"[㈕㉵]", "(아)"},
{"[㈖㉶]", "(자)"},
{"[㈗㉷]", "(차)"},
{"[㈘㉸]", "(카)"},
{"[㈙㉹]", "(타)"},
{"[㈚㉺]", "(파)"},
{"[㈛㉻]", "(하)"},
{"㈜", "(주)"},
{"㈝", "(오전)"},
{"㈞", "(오후)"},
{"㉼", "(참고)"},
{"㉽", "(주의)"},
{"㉾", "(우)"}
}
return gsub_iterate(text, replacements)
end
-- Final validation and postprocessing (both MR and RR)
function p.final_processing(text)
-- result should not contain Hangul
if m_utils.contains_hangul(text) then
error("Result contains Hangul; debugging required")
end
text = p.html_to_ascii(text) -- convert HTML encodings back to ASCII
-- if result is nothing (e.g. when input is just ㅇ)
if text == "" then
text = "—"
end
return text
end
return p