local jpn={}

jpn.kanatable = {
-- 普通假名
	["ア"] = "あ",
	["イ"] = "い",
	["ウ"] = "う",
	["エ"] = "え",
	["オ"] = "お",
	["カ"] = "か",
	["キ"] = "き",
	["ク"] = "く",
	["ケ"] = "け",
	["コ"] = "こ",
	["サ"] = "さ",
	["シ"] = "し",
	["ス"] = "す",
	["セ"] = "せ",
	["ソ"] = "そ",
	["タ"] = "た",
	["チ"] = "ち",
	["ツ"] = "つ",
	["テ"] = "て",
	["ト"] = "と",
	["ナ"] = "な",
	["ニ"] = "に",
	["ヌ"] = "ぬ",
	["ネ"] = "ね",
	["ノ"] = "の",
	["ハ"] = "は",
	["ヒ"] = "ひ",
	["フ"] = "ふ",
	["ヘ"] = "へ",
	["ホ"] = "ほ",
	["マ"] = "ま",
	["ミ"] = "み",
	["ム"] = "む",
	["メ"] = "め",
	["モ"] = "も",
	["ヤ"] = "や",
	["ユ"] = "ゆ",
	["ヨ"] = "よ",
	["ラ"] = "ら",
	["リ"] = "り",
	["ル"] = "る",
	["レ"] = "れ",
	["ロ"] = "ろ",
	["ワ"] = "わ",
	["ヲ"] = "を",
	["ン"] = "ん",
-- 浊音假名
	["ガ"] = "が",
	["ギ"] = "ぎ",
	["グ"] = "ぐ",
	["ゲ"] = "げ",
	["ゴ"] = "ご",
	["ザ"] = "ざ",
	["ジ"] = "じ",
	["ズ"] = "ず",
	["ゼ"] = "ぜ",
	["ゾ"] = "ぞ",
	["ダ"] = "だ",
	["ヂ"] = "ぢ",
	["ヅ"] = "づ",
	["デ"] = "で",
	["ド"] = "ど",
	["バ"] = "ば",
	["ビ"] = "び",
	["ブ"] = "ぶ",
	["ベ"] = "べ",
	["ボ"] = "ぼ",
	["パ"] = "ぱ",
	["ピ"] = "ぴ",
	["プ"] = "ぷ",
	["ペ"] = "ぺ",
	["ポ"] = "ぽ",
-- 小假名
	["ァ"] = "ぁ",
	["ィ"] = "ぃ",
	["ゥ"] = "ぅ",
	["ェ"] = "ぇ",
	["ォ"] = "ぉ",
	["ャ"] = "ゃ",
	["ュ"] = "ゅ",
	["ョ"] = "ょ",
	["ッ"] = "っ"
}

-- 片假名转平假名
-- 目前ヴ不能转换
function jpn._hira( h )
	for k, v in pairs( jpn.kanatable ) do
		h = mw.ustring.gsub( h, k, v )
	end
	return h
end

-- 平假名转片假名
function jpn._kata( h )
	for k, v in pairs( jpn.kanatable ) do
		h = mw.ustring.gsub( h, v, k )
	end
	return h
end

-- 转换:处理促音
function jpn._sokuon( s )
-- なまやらわ行真的有促音吗
	s = mw.ustring.gsub( s, 'っ([かきくけこ])', 'k%1')
	s = mw.ustring.gsub( s, 'っ([さしすせそ])', 's%1')
	s = mw.ustring.gsub( s, 'っ([たちつてと])', 't%1')
	s = mw.ustring.gsub( s, 'っ([なにぬねの])', 'n%1')
	s = mw.ustring.gsub( s, 'っ([はひふへほ])', 'h%1')
	s = mw.ustring.gsub( s, 'っ([まみむめも])', 'm%1')
	s = mw.ustring.gsub( s, 'っ([やゆよ])', 'y%1')
	s = mw.ustring.gsub( s, 'っ([らりるれろ])', 'r%1')
	s = mw.ustring.gsub( s, 'っわ', 'wわ')
	s = mw.ustring.gsub( s, 'っ([がぎぐげご])', 'g%1')
	s = mw.ustring.gsub( s, 'っ([ざじずぜぞ])', 'z%1')
	s = mw.ustring.gsub( s, 'っ([だぢづでど])', 'd%1')
	s = mw.ustring.gsub( s, 'っ([ばびぶべぼ])', 'p%1')
	s = mw.ustring.gsub( s, 'っ([ぱぴぷぺぽ])', 'b%1')
	
	return s
end

-- 转换:处理长音
function jpn._chouon( s )
	local t = {
		["あー"] = "ā",
		["かー"] = "kā",
		["さー"] = "sā",
		["たー"] = "tā",
		["なー"] = "nā",
		["はー"] = "hā",
		["まー"] = "mā",
		["やー"] = "yā",
		["らー"] = "rā",
		["わー"] = "wā",
		["がー"] = "gā",
		["ざー"] = "zā",
		["だー"] = "dā",
		["ばー"] = "bā",
		["ぱー"] = "pā",
		["きゃー"] = "kyā",
		["しゃー"] = "shā",
		["ちゃー"] = "chā",
		["にゃー"] = "nyā",
		["ひゃー"] = "hyā",
		["みゃー"] = "myā",
		["りゃー"] = "ryā",
		["ぎゃー"] = "gyā",
		["じゃー"] = "jā",
		["ぢゃー"] = "jā",
		["びゃー"] = "byā",
		["ぴゃー"] = "pyā",
		
		["いー"] = "ī",
		["きー"] = "kī",
		["しー"] = "shī",
		["ちー"] = "chī",
		["にー"] = "nī",
		["ひー"] = "hī",
		["みー"] = "mī",
		["りー"] = "rī",
		["ぎー"] = "gī",
		["じー"] = "jī",
		["ぢー"] = "jī",
		["びー"] = "bī",
		["ぴー"] = "pī",
		
		["うー"] = "ū",
		["くー"] = "kū",
		["すー"] = "sū",
		["つー"] = "tsū",
		["ぬー"] = "nū",
		["ふー"] = "fū",
		["むー"] = "mū",
		["ゆー"] = "yū",
		["るー"] = "rū",
		["ぐー"] = "gū",
		["ずー"] = "zū",
		["づー"] = "zū",
		["ぶー"] = "bū",
		["ぷー"] = "pū",
		["きゅー"] = "kyū",
		["しゅー"] = "shū",
		["ちゅー"] = "chū",
		["にゅー"] = "nyū",
		["ひゅー"] = "hyū",
		["みゅー"] = "myū",
		["りゅー"] = "ryū",
		["ぎゅー"] = "gyū",
		["じゅー"] = "jū",
		["ぢゅー"] = "jū",
		["びゅー"] = "byū",
		["ぴゅー"] = "pyū",
		
		["えー"] = "ē",
		["けー"] = "kē",
		["せー"] = "sē",
		["てー"] = "tē",
		["ねー"] = "nē",
		["へー"] = "hē",
		["めー"] = "mē",
		["れー"] = "rē",
		["げー"] = "gē",
		["ぜー"] = "zē",
		["でー"] = "dē",
		["べー"] = "bē",
		["ぺー"] = "pē",
		
		["おー"] = "ō",
		["こー"] = "kō",
		["そー"] = "sō",
		["とー"] = "tō",
		["のー"] = "nō",
		["ほー"] = "hō",
		["もー"] = "mō",
		["よー"] = "yō",
		["ろー"] = "rō",
		["ごー"] = "gō",
		["ぞー"] = "zō",
		["どー"] = "dō",
		["ぼー"] = "bō",
		["ぽー"] = "pō",
		["きょー"] = "kyō",
		["しょー"] = "shō",
		["ちょー"] = "chō",
		["にょー"] = "nyō",
		["ひょー"] = "hyō",
		["みょー"] = "myō",
		["りょー"] = "ryō",
		["ぎょー"] = "gyō",
		["じょー"] = "jō",
		["ぢょー"] = "jō",
		["びょー"] = "byō",
		["ぴょー"] = "pyō"
	}
	for k, v in pairs( t ) do
		s = mw.ustring.gsub( s, k, v )
	end
	return s
end	

-- 转换:拗音
function jpn._youon( s )
	local t = {
		["きゃ"] = "kya",
		["きゅ"] = "kyu",
		["きょ"] = "kyo",
		
		["しゃ"] = "sha",
		["しゅ"] = "shu",
		["しょ"] = "sho",
		
		["ちゃ"] = "cha",
		["ちゅ"] = "chu",
		["ちょ"] = "cho",
		
		["にゃ"] = "nya",
		["にゅ"] = "nyu",
		["にょ"] = "nyo",
		
		["ひゃ"] = "hya",
		["ひゅ"] = "hyu",
		["ひょ"] = "hyo",
		
		["みゃ"] = "mya",
		["みゅ"] = "myu",
		["みょ"] = "myo",
		
		["りゃ"] = "rya",
		["りゅ"] = "ryu",
		["りょ"] = "ryo",
		
		["ぎゃ"] = "gya",
		["ぎゅ"] = "gyu",
		["ぎょ"] = "gyo",
		
		["じゃ"] = "ja",
		["じゅ"] = "ju",
		["じょ"] = "jo",
		
		["ぢゃ"] = "ja",
		["ぢゅ"] = "ju",
		["ぢょ"] = "jo",
		
		["びゃ"] = "bya",
		["びゅ"] = "byu",
		["びょ"] = "byo",
		
		["ぴゃ"] = "pya",
		["ぴゅ"] = "pyu",
		["ぴょ"] = "pyo"
	}
	for k, v in pairs( t ) do
		s = mw.ustring.gsub( s, k, v )
	end
	return s
end

-- 转换:普通情况
function jpn._hoka( s )
	local t = {
		["あ"] = "a",
		["い"] = "i",
		["う"] = "u",
		["え"] = "e",
		["お"] = "o",
		
		["か"] = "ka",
		["き"] = "ki",
		["く"] = "ku",
		["け"] = "ke",
		["こ"] = "ko",
		
		["さ"] = "sa",
		["し"] = "shi",
		["す"] = "su",
		["せ"] = "se",
		["そ"] = "so",
		
		["た"] = "ta",
		["ち"] = "chi",
		["つ"] = "tsu",
		["て"] = "te",
		["と"] = "to",
		
		["な"] = "na",
		["に"] = "ni",
		["ぬ"] = "nu",
		["ね"] = "ne",
		["の"] = "no",
		
		["は"] = "ha",
		["ひ"] = "hi",
		["ふ"] = "fu",
		["へ"] = "he",
		["ほ"] = "ho",
		
		["ま"] = "ma",
		["み"] = "mi",
		["む"] = "mu",
		["め"] = "me",
		["も"] = "mo",
		
		["や"] = "ya",
		["ゆ"] = "yu",
		["よ"] = "yo",
		
		["ら"] = "ra",
		["り"] = "ri",
		["る"] = "ru",
		["れ"] = "re",
		["ろ"] = "ro",
		
		["わ"] = "wa",
		["を"] = "o",
		
		["ん"] = "n",
		
		["が"] = "ga",
		["ぎ"] = "gi",
		["ぐ"] = "gu",
		["げ"] = "ge",
		["ご"] = "go",
		
		["ざ"] = "za",
		["じ"] = "ji",
		["ず"] = "zu",
		["ぜ"] = "ze",
		["ぞ"] = "zo",
		
		["だ"] = "da",
		["ぢ"] = "ji",
		["づ"] = "zu",
		["で"] = "de",
		["ど"] = "do",
		
		["ば"] = "ba",
		["び"] = "bi",
		["ぶ"] = "bu",
		["べ"] = "be",
		["ぼ"] = "bo",
		
		["ぱ"] = "pa",
		["ぴ"] = "pi",
		["ぷ"] = "pu",
		["ぺ"] = "pe",
		["ぽ"] = "po"
		
	}
	for k, v in pairs( t ) do
		s = mw.ustring.gsub( s, k, v )
	end
	return s
end

function jpn.romaji( frame )
	local source = frame.args[1]
	
-- 长音改为横线
	local hy = mw.ustring.gsub( source, '([あかさたなはまやらわゃ])あ', '%1ー')
--	hy = mw.ustring.gsub( hy, '([いきしちにひみり])い', '%1ー')
	hy = mw.ustring.gsub( hy, '([うくすつぬふむゆるゅ])う', '%1ー')
--	hy = mw.ustring.gsub( hy, '([えけせてねへめれ])い', '%1ー')
	hy = mw.ustring.gsub( hy, '([おこそとのほもよろょ])う', '%1ー')
	
-- 片假名转为平假名
	hy = jpn._hira( hy )
	
-- 处理ん接や行
	hy = mw.ustring.gsub( hy, 'ん([やゆよ])', "ん'%1")
	
-- 以下正式转换
-- 处理促音
	hy = jpn._sokuon( hy )
-- 处理长音
	hy = jpn._chouon( hy )
-- 处理拗音
	hy = jpn._youon( hy )
-- 处理一般状况
	hy = jpn._hoka( hy )
	
-- 清空打断符号:打断符号为$
	hy = mw.ustring.gsub( hy, '%$', '' )
	
-- 大写:在所有^后面的第一个字母将会大写
	local i,p,q
	while mw.ustring.find( hy, '%^' ) ~= nil do
		i = mw.ustring.find( hy, '%^' )
		p = mw.ustring.char( mw.ustring.codepoint( hy, i+1 ) )
		q = mw.ustring.upper( p )
		hy = mw.ustring.gsub( hy, '%^'..p, q, 1 )
	end
	return hy
end

-- 副产品:片假名转平假名
-- 目前ヴ不能转换
function jpn.hira( frame )
	local s = frame.args[1]
	s = jpn._hira( s )
	return s
end

-- 副产品:平假名转片假名
function jpn.kata( frame )
	local s = frame.args[1]
	s = jpn._kata( s )
	return s
end
	
return jpn