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. |
| This module is currently protected from editing. See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected. |
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