跳转到内容

模組:Ojp-conj

維基詞典,自由的多語言詞典


-- 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