-- This module is for conjugation of Old Japanese
local m_ja = require("Module:ja")
local find = mw.ustring.find
local length = mw.ustring.len
local gmatch = mw.ustring.gmatch
local find = mw.ustring.find
local sub = mw.ustring.sub
local gsub = mw.ustring.gsub
local getArgs = require('Module:Arguments').getArgs
local export = {}
local data = mw.loadData("Module:ojp-conj/data")
function perfect_hiragana_to_romaji(kana)
local romaji = ""
local i = 1
repeat
kana_char = sub(kana, i, i)
romaji = romaji .. data.hiragana_romaji_perfect[kana_char]
i = i + 1
until i > length(kana)
return romaji
end
function perfect_romaji_to_hiragana(romaji)
local text = romaji
-- text = gsub(text, 'kk', 'ッk')
-- text = gsub(text, 'ss', 'ッs')
-- text = gsub(text, 'tt', 'ッt')
-- text = gsub(text, 'pp', 'ッp')
-- text = gsub(text, 'bb', 'ッb')
-- text = gsub(text, 'dd', 'ッd')
-- text = gsub(text, 'gg', 'ッg')
-- text = gsub(text, 'jj', 'ッj')
-- text = gsub(text, 'tc', 'ッc')
-- text = gsub(text, 'tsyu', 'ツュ')
-- text = gsub(text, 'ts[uoiea]', {['tsu']='ツ',['tso']='ツォ',['tsi']='ツィ',['tse']='ツェ',['tsa']='ツァ'})
-- text = gsub(text, 'sh[uoiea]', {['shu']='シュ',['sho']='ショ',['shi']='シ',['she']='シェ',['sha']='シャ'})
-- text = gsub(text, 'ch[uoiea]', {['chu']='チュ',['cho']='チョ',['chi']='チ',['che']='チェ',['cha']='チャ'})
text = gsub(text, "n[uoiea']?", {['nu']='ぬ',['no']='の',['ni']='に',['ne']='ね',['na']='な',['n']='ん',["n'"]='ん'})
text = gsub(text, '[wvtrpsmlkjhgfdbzy][uoiea]', function (char) return data.romaji_to_hiragana_perfect[char] or char end)
-- text = gsub(text, '[wvtrpsmlkjhgfdbzy][yw]?[uoiea]', function (char) return data.romaji_to_hiragana_perfect[char] or char end)
text = gsub(text, 'u', 'う')
text = gsub(text, 'o', 'お')
text = gsub(text, 'i', 'い')
text = gsub(text, 'e', 'え')
text = gsub(text, 'a', 'あ')
mw.log(text)
return text
end
-- args:
-- 1. kankana 漢字仮名交じり文
-- 2. hiragana ひらがな
-- 3. type 種類
-- TODO perfect -> kana
-- function unperfectize(perfect)
-- unperfectized = perfect
-- unperfectized = gsub(unperfectized, "hu", "fu")
-- unperfectized = gsub(unperfectized, "wi", "i")
-- return unperfectized
-- end
function katsuyou(kankana, hiragana, _type)
-- e.g ataru
-- local romaji = m_ja.kana_to_romaji(hiragana)
local romaji = perfect_hiragana_to_romaji(hiragana)
local result = {}
table.insert(result, kankana)
local kankana_length = length(kankana)
local hiragana_length = length(hiragana)
local romaji_length = length(romaji)
-- e.g 2
local non_kanji_count = 0
for i in gmatch(kankana, "[ぁ-ゖ]") do
non_kanji_count = non_kanji_count + 1
end
-- e.g 1 = 3 - 2
local kanji_count = kankana_length - non_kanji_count
-- e.g 1 = 3 - 2
local kanji_kana_count = hiragana_length - non_kanji_count
-- e.g 当
local kanji_part = sub(kankana, 1, kanji_count)
-- e.g あ
local kanji_kana = sub(hiragana, 1, kanji_kana_count)
-- e.g atar = ataru.sub(1, 4)
local romaji_stem = sub(romaji, 1, romaji_length - data.terminal_count[_type])
-- e.g r
local last_char
if _type == "kami_ichi" and sub(romaji, -3, -3) == "i" then
last_char = "y"
else
last_char = sub(romaji_stem, -1)
end
-- local kankana_stem = kankana - conjd_terminal
-- local hiragana_stem = hiragana - conjd_terminal
for _, gobi in pairs(data.conjugation[_type]) do
-- e.g gobi = a, i, u, u, e, o
-- e.g atara = atar + a
local perfect_romaji = romaji_stem .. gobi
-- Note: No idea if perfect can be recoginzed
-- e.g あたら = k2h(アタラ = r2k(atara))
-- local result_hiragana = m_ja.kata_to_hira(m_ja.romaji_to_kata(unperfectize(perfect_romaji)))
local result_hiragana = perfect_romaji_to_hiragana(perfect_romaji)
local result_romaji = m_ja.kana_to_romaji(result_hiragana)
-- e.g たら = あたら.sub(2)
local non_kanji_part = sub(result_hiragana, kanji_kana_count + 1)
-- e.g 当たら = 当 + たら
local result_kanji = kanji_part .. non_kanji_part
table.insert(result, result_kanji)
table.insert(result, result_hiragana)
table.insert(result, result_romaji)
end
return result, last_char
end
export.verbconj = function(frame)
-- local args = frame:getParent().args{parentFirst=true}
local args = getArgs(frame, {parentFirst=true})
local kankana = args[1]
local hiragana = args[2]
local _type = data.types[args[3]]
--- row: akstnhmyrw ---
-- frame.args.
--- type : yodan, na_irreg, ra_irreg, shimo_ichi, shimo_ni, kami_ichi, kami_ni, ka_irreg, sa_irreg
local result_table, last_char = katsuyou(kankana, hiragana, _type)
conj_type = data.type_names[_type]
if not find(_type, "irreg") then
conj_type = data.conj_row[last_char] .. conj_type
end
result_table["活用類型"] = conj_type
return frame:expandTemplate{ title = "ojp-verbconj", args = result_table}
-- return "{{ojp-verbconj|" .. table.concat(result_table, "|") .. "|活用類型=" .. conj_type .. "}}"
-- return table.concat(result_table, "|") .. "|活用類型=" .. conj_type
end
return export