모듈:User:ChongDae/sandbox

-- ChongDae's sandbox
working: hanp

local func = {}
local ustring = mw.ustring
-- Helper Function
--
Helper Function to interpret boolean strings
function getBoolean( boolean_str )
local boolean_value;
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower();
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
or boolean_str ==   or boolean_str == '아니오' then
boolean_value = false;
else
boolean_value = true;
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str;
else
error( 'No boolean value found' );
end    
return boolean_value
end
-- data definition
local final_vowel = 1
local final_consonant = 2
local final_rieul = 3
local final_unknown = 4
local handata = {}
-- 한글 이외 글자의 읽는법 --
final_map = {
"ㄱ"= final_consonant,--기역/기윽
"ㄴ"= final_consonant,--니은
"ㄷ"= final_consonant,--디귿/디읃
"ㄹ"= final_rieul,    --리을
"ㅁ"= final_consonant,--미음
"ㅂ"= final_consonant,--비읍
"ㅅ"= final_consonant,--시옷/시읏
"ㅇ"= final_consonant,--이응
"ㅈ"= final_consonant,--지읒
"ㅊ"= final_consonant,--치읓
"ㅋ"= final_consonant,--키읔
"ㅌ"= final_consonant,--티읕
"ㅍ"= final_consonant,--피읖
"ㅎ"= final_consonant,--히읗
"ㄲ"= final_consonant,--쌍기역/된기윽
"ㄸ"= final_consonant,--쌍디귿/된디읃
"ㅃ"= final_consonant,--쌍비읍/된비읍
"ㅆ"= final_consonant,--쌍시옷/된시읏
"ㅉ"= final_consonant,--씽지읒/된지읒
"0" = final_consonant,-- 영, 십, 백, 천, 만, 억 (조 이상은 에러)
"1" = final_rieul,    -- 일
"2" = final_vowel,    -- 이
"3" = final_consonant,-- 삼
"4" = final_vowel,    -- 사
"5" = final_vowel,    -- 오
"6" = final_consonant,-- 육
"7" = final_rieul,    -- 칠
"8" = final_rieul,    -- 팔
"9" = final_vowel,    -- 구
A = final_vowel,        -- 에이
B = final_vowel,        -- 비
C = final_vowel,        -- 시
D = final_vowel,        -- 디
E = final_vowel,        -- 이
F = final_vowel,        -- 에프
G = final_vowel,        -- 지
H = final_vowel,        -- 에이치
I = final_vowel,        -- 아이
J = final_vowel,        -- 제이
K = final_vowel,        -- 케이
L = final_rieul,        -- 엘
M = final_consonant,    -- 엠
N = final_consonant,    -- 엔
O = final_vowel,        -- 오
P = final_consonant,    -- 피
Q = final_consonant,    -- 큐
R = final_vowel,        -- 아르 (알?)
S = final_vowel,        -- 에스
T = final_vowel,        -- 티
U = fianl_vowel,        -- 유
V = final_vowel,        -- 브이
W = final_vowel,        -- 더블유
X = final_vowel,        -- 엑스
Y = final_vowel,        -- 와이
Z = final_vowel,        -- 지, 제드, 제트
}
--
Return값
0: 받침이 없는 경우
1: 'ㄹ' 받침인 경우
2: 기타 받침인 경우
3: 처리할 수 없는 경우

local function finalclass(str)
local lastchar = ustring.match(str, '.*(%w)')

if lastchar == nil then return final_unknown end
if lastchar >= '가' and lastchar <= '힣' then
codepoint = ustring.codepoint(lastchar)
final = (codepoint - 0xAC00) % 0x1C
if final == 0 then
return final_vowel
elseif final == 8 then
return final_rieul
else
return final_consonant
end
end
return final_maplastchar or final_unknown
end
local particle_map = {
-- 기본형, 배~, 감~, 귤~
{ "은(는)", "는", "은", "은"},
{ "이(가)", "가", "이", "이"},
{ "을(를)", "를", "을", "을"},
{ "와(과)", "와", "과", "과"},
{ "야(아)", "야", "아", "아"},
{ "(으)로", "로", "으로", "로"},
{ "(으)로서", "로서", "으로서", "로서"},
{ "(으)로써", "로써", "으로써", "로써"},
{ "(이)랑", "랑", "이랑", "이랑"},
{ "(이)나", "나", "이나", "이나"},
{ "(이)여", "여", "이여", "이여"},
{ "(이)시여", "시여", "이시여", "이시여"},
{ "(이)다", "다", "이다", "이다"},
}
finalform_basic = {}
finalform_vowel = {}
finalform_consonant = {}
finalform_rieul = {}
local function registerParticleMap(rules)
local finalform = { {}, {}, {}, {} }
mw.log(#rules)
for i = 1, #rules do
rule = rulesi
for j = 1, 4 do
finalform_basic rulej  = rule1
finalform_vowel rulej  = rule2
finalform_consonant rulej  = rule3
finalform_rieul rulej  = rule4
end
end

return #rules
end
registerParticleMap(particle_map)
func.particle_map = particle_map
func.registerParticleMap =  registerParticleMap
func.finalform_basic = finalform_basic
func.finalform_vowel = finalform_vowel
func.finalform_consonant =finalform_consonant
func.fonalform_rieul = finalform_rieul
--
사용법:
josaonly= 
str = 체언
josa = 조사
defaultjosa = 체언의 마지막 받침을 알 수 없는 경우에 defaultjosa 값을 쓴다.
override = True/False : True이면 체언의 어미에 상관없이 defaultjosa (없다면 josa) 값을 쓴다.
josaonly = True/False: True이면 체언 부분은 생략한다. (복잡한 틀 설계용)

function func.josa(frame)
local input_string = frame.args.str or frame.args1 or 
local input_josa = frame.args.josa or frame.args2 or 
local input_defaultjosa = frame.args.defaultjosa
local override = getBoolean(frame.args.override or false)
local josaonly = getBoolean(frame.args.josaonly or false)
local output_josa
if override then
output_josa = input_defaultjosa or input_josa
else
local char_class = finalclass(input_string)
if char_class == final_vowel then
output_josa = finalform_vowelinput_josa or input_josa
elseif char_class == final_consonant then
output_josa = finalform_consonantinput_josa or input_josa
elseif char_class == final_rieul then
output_josa = finalform_rieulinput_josa or input_josa
else -- final_unknown
output_josa = input_defaultjosa or finalform_basicinput_josa or input_josa
end
-- mw.log (input_string ..  .. char_class ..  .. output_josa)
end

if josaonly then
return output_josa
else
return input_string .. output_josa
end
end
-- 동음이의어 구분이 된 문서 링크를 간편하게 처리 
function func.pipetrick(frame)
local input_string = (frame.args1 or )
local input_title = frame.args2
local first_char = string.sub(input_string, 1, 1)

if first_char ==  then
return input_string
elseif first_char == ':' then
input_string = string.sub(input_string, 2)
end

local title_part = input_title or string.gsub(input_string, ' %(.*%)$', )
if title_part == input_string then
return ':' .. input_string .. 
else
return  .. title_part .. 
end
end
local langdata = mw.loadData('Module:Langname/data')
function func.langdata(frame)
codes = {}
for k, v in pairs(langdata.lang_name) do
table.insert(codes, k)
end

table.sort(codes)

for i, code in ipairs(codes) do
l1 = langdata.lang_namecode
l2 = mw.language.fetchLanguageName(code, 'ko')
if l1 ~= l2 then
mw.log(string.format('* %s: %s %s', code, l1, l2))
end
end
end

function func.langname(frame)
local code = frame.args.code or frame.args.code1
local lang = frame.args.lang or frame.args.code2

return mw.language.fetchLanguageName(code, lang)
end
return func
--==