Module:Tja
跳到导航
跳到搜索
local module = {} local getArgs = require('Module:Arguments').getArgs local kanas = { {'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', 'わ', 'ワ'}, {'wo', 'を', 'ヲ'}, {'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', 'ぽ', 'ポ'}, {'vu', 'ゔ', 'ヴ'}, --外来语 {'wi', 'ゐ', 'ヰ'}, --方言、古语 {'we', 'ゑ', 'ヱ'}, {'-', 'ー', '—'} --长音 } local youon = { {'kya', 'きゃ', 'キャ'}, --拗音 {'gya', 'ぎゃ', 'ギャ'}, {'sha', 'しゃ', 'シャ'}, {'ja', 'じゃ', 'ジャ'}, {'cha', 'ちゃ', 'チャ'}, {'ja', 'ぢゃ', 'ヂャ'}, {'nya', 'にゃ', 'ニャ'}, {'hya', 'ひゃ', 'ヒャ'}, {'bya', 'びゃ', 'ビャ'}, {'pya', 'ぴゃ', 'ピャ'}, {'mya', 'みゃ', 'ミャ'}, {'rya', 'りゃ', 'リャ'}, {'kyu', 'きゅ', 'キュ'}, {'gyu', 'ぎゅ', 'ギュ'}, {'shu', 'しゅ', 'シュ'}, {'ju', 'じゅ', 'ジュ'}, {'chu', 'ちゅ', 'チュ'}, {'ju', 'ぢゅ', 'ヂュ'}, {'nyu', 'にゅ', 'ニュ'}, {'hyu', 'ひゅ', 'ヒュ'}, {'byu', 'びゅ', 'ビュ'}, {'pyu', 'ぴゅ', 'ピュ'}, {'myu', 'みゅ', 'ミュ'}, {'ryu', 'りゅ', 'リュ'}, {'kyo', 'きょ', 'キョ'}, {'gyo', 'ぎょ', 'ギョ'}, {'sho', 'しょ', 'ショ'}, {'jo', 'じょ', 'ジョ'}, {'cho', 'ちょ', 'チョ'}, {'jo', 'ぢょ', 'ヂョ'}, {'nyo', 'にょ', 'ニョ'}, {'hyo', 'ひょ', 'ヒョ'}, {'byo', 'びょ', 'ビョ'}, {'pyo', 'ぴょ', 'ピョ'}, {'myo', 'みょ', 'ミョ'}, {'ryo', 'りょ', 'リョ'}, {'yi', 'いぃ', 'イィ'}, --扩展假名,https://en.wikipedia.org/wiki/Hepburn_romanization#Extended_katakana {'ye', 'いぇ', 'イェ'}, {'wa', 'うぁ', 'ウァ'}, {'wi', 'うぃ', 'ウィ'}, {'wu', 'うぅ', 'ウゥ'}, {'we', 'うぇ', 'ウェ'}, {'wo', 'うぉ', 'ウォ'}, {'wyu', 'うゅ', 'ウュ'}, {'va', 'ゔぁ', 'ヴァ'}, {'vi', 'ゔぃ', 'ヴィ'}, {'ve', 'ゔぇ', 'ヴェ'}, {'vo', 'ゔぉ', 'ヴォ'}, {'vya', 'ゔゃ', 'ヴャ'}, {'vyu', 'ゔゅ', 'ヴュ'}, {'vye', 'ゔぃぇ', 'ウィェ'}, {'vyo', 'ゔょ', 'ヴョ'}, {'kye', 'きぇ', 'キェ'}, {'gye', 'ぎぇ', 'ギェ'}, {'kwa', 'くぁ', 'クァ'}, {'kwi', 'くぃ', 'クィ'}, {'kwe', 'くぇ', 'クェ'}, {'kwo', 'くぉ', 'クォ'}, {'kwa', 'くゎ', 'クヮ'}, {'gwa', 'ぐぁ', 'グァ'}, {'gwi', 'ぐぃ', 'グィ'}, {'gwe', 'ぐぇ', 'グェ'}, {'gwo', 'ぐぉ', 'グォ'}, {'gwa', 'ぐゎ', 'グヮ'}, {'she', 'しぇ', 'シェ'}, {'je', 'じぇ', 'ジェ'}, {'si', 'すぃ', 'スィ'}, {'zi', 'ずぃ', 'ズィ'}, {'che', 'ちぇ', 'チェ'}, {'tsa', 'つぁ', 'ツァ'}, {'tsi', 'つぃ', 'ツィ'}, {'tse', 'つぇ', 'ツェ'}, {'tso', 'つぉ', 'ツォ'}, {'tsyu', 'つゅ', 'ツュ'}, {'ti', 'てぃ', 'ティ'}, {'tu', 'とぅ', 'トゥ'}, {'tyu', 'てゅ', 'テュ'}, {'di', 'でぃ', 'ディ'}, {'du', 'どぅ', 'ドゥ'}, {'dyu', 'でゅ', 'デュ'}, {'nye', 'にぇ', 'ニェ'}, {'hye', 'ひぇ', 'ヒェ'}, {'bye', 'びぇ', 'ビェ'}, {'pye', 'ぴぇ', 'ピェ'}, {'fa', 'ふぁ', 'ファ'}, {'fi', 'ふぃ', 'フィ'}, {'fe', 'ふぇ', 'フェ'}, {'fo', 'ふぉ', 'フォ'}, {'fya', 'ふゃ', 'フャ'}, {'fyu', 'ふゅ', 'フュ'}, {'fye', 'ふぃぇ', 'フィェ'}, {'fyo', 'ふょ', 'フョ'}, {'hu', 'ほぅ', 'ホゥ'}, {'mye', 'みぇ', 'ミェ'}, {'rye', 'りぇ', 'リェ'}, {'va', 'わ゙', 'ヷ'}, {'vi', 'ゐ゙', 'ヸ'}, {'ve', 'ゑ゙', 'ヹ'}, {'vo', 'を゙', 'ヺ'}, } local hebon = { {'kyā', 'きゃあ', 'キャア'}, {'gyā', 'ぎゃあ', 'ギャア'}, {'shā', 'しゃあ', 'シャア'}, {'jā', 'じゃあ', 'ジャア'}, {'chā', 'ちゃあ', 'チャア'}, {'jā', 'ぢゃあ', 'ヂャア'}, {'nyā', 'にゃあ', 'ニャア'}, {'hyā', 'ひゃあ', 'ヒャア'}, {'byā', 'びゃあ', 'ビャア'}, {'pyā', 'ぴゃあ', 'ピャア'}, {'myā', 'みゃあ', 'ミャア'}, {'ryā', 'りゃあ', 'リャア'}, {'kyū', 'きゅう', 'キュウ'}, {'gyū', 'ぎゅう', 'ギュウ'}, {'shū', 'しゅう', 'シュウ'}, {'jū', 'じゅう', 'ジュウ'}, {'chū', 'ちゅう', 'チュウ'}, {'jū', 'ぢゅう', 'ヂュウ'}, {'nyū', 'にゅう', 'ニュウ'}, {'hyū', 'ひゅう', 'ヒュウ'}, {'byū', 'びゅう', 'ビュウ'}, {'pyū', 'ぴゅう', 'ピュウ'}, {'myū', 'みゅう', 'ミュウ'}, {'ryū', 'りゅう', 'リュウ'}, {'kyō', 'きょう', 'キョウ'}, {'gyō', 'ぎょう', 'ギョウ'}, {'shō', 'しょう', 'ショウ'}, {'jō', 'じょう', 'ジョウ'}, {'chō', 'ちょう', 'チョウ'}, {'jō', 'ぢょう', 'ヂョウ'}, {'nyō', 'にょう', 'ニョウ'}, {'hyō', 'ひょう', 'ヒョウ'}, {'byō', 'びょう', 'ビョウ'}, {'pyō', 'ぴょう', 'ピョウ'}, {'myō', 'みょう', 'ミョウ'}, {'ryō', 'りょう', 'リョウ'} } local sutegana = { {'la', 'ぁ', 'ァ'}, --小写假名 {'li', 'ぃ', 'ィ'}, {'lu', 'ぅ', 'ゥ'}, {'le', 'ぇ', 'ェ'}, {'lo', 'ぉ', 'ォ'}, {'ltsu', 'っ', 'ッ'}, {'lka', 'ゕ', 'ヵ'}, {'lke', 'ゖ', 'ヶ'}, {'lya', 'ゃ', 'ャ'}, {'lyu', 'ゅ', 'ュ'}, {'lyo', 'ょ', 'ョ'}, {'lwa', 'ゎ', 'ヮ'}, {'lku', 'ㇰ'}, --阿伊努语,朝鲜语和台湾话假名扩展,http://www.geocities.jp/aynuitak/kotoeri4_kanahenkan.htm {'lshi', 'ㇱ'}, {'lsu', 'ㇲ'}, {'lto', 'ㇳ'}, {'ln', 'ㇴ'}, {'lha', 'ㇵ'}, {'lhi', 'ㇶ'}, {'lfu', 'ㇷ'}, {'lhe', 'ㇸ'}, {'lho', 'ㇹ'}, {'lp', 'ㇷ゚'}, {'lm', 'ㇺ'}, {'lra', 'ㇻ'}, {'lri', 'ㇼ'}, {'lru', 'ㇽ'}, {'lre', 'ㇾ'}, {'lro', 'ㇿ'} } local inputSub = { --输入辅助,该table中的替换规则在inputKana中具有最高优先级 {'yi', 'い', 'イ'}, {'wu', 'う', 'ウ'}, {'wi', 'ゐ', 'ヰ'}, {'we', 'ゑ', 'ヱ'}, {'kwa', 'くぁ', 'クァ'}, {'gwa', 'ぐぁ', 'グァ'}, {'si', 'し', 'シ'}, {'ji', 'じ', 'ジ'}, {'zi', 'じ', 'ジ'}, {'zu', 'ず', 'ズ'}, {'ja', 'じゃ', 'ジャ'}, {'ju', 'じゅ', 'ジュ'}, {'jo', 'じょ', 'ジョ'}, {'ti', 'ち', 'チ'}, {'tu', 'つ', 'ツ'}, {'tyu', 'ちゅ', 'チュ'}, {'di', 'ぢ', 'ヂ'}, {'du', 'づ', 'ヅ'}, {'dyu', 'ぢゅ', 'ヂュ'}, {'hu', 'ふ', 'フ'}, {'va', 'ゔぁ', 'ヴァ'}, {'vi', 'ゔぃ', 'ヴィ'}, {'ve', 'ゔぇ', 'ヴェ'}, {'vo', 'ゔぉ', 'ヴォ'}, {'vye', 'ゔぇ', 'ヴェ'}, {'wa', 'わ', 'ワ'}, {'wo', 'を', 'ヲ'}, {'wha', 'うぁ', 'ウァ'}, --罗马字输入表扩展,https://support.microsoft.com/ja-jp/help/883232 {'whi', 'うぃ', 'ウィ'}, {'whu', 'う', 'ウ'}, {'whe', 'うぇ', 'ウェ'}, {'who', 'うぉ', 'ウォ'}, {'ca', 'か', 'カ'}, {'cu', 'く', 'ク'}, {'qu', 'く', 'ク'}, {'co', 'こ', 'コ'}, {'kyi', 'きぃ', 'キィ'}, {'qya', 'くゃ', 'クャ'}, {'qyu', 'くゅ', 'クュ'}, {'qyo', 'くょ', 'クョ'}, {'qwa', 'くぁ', 'クァ'}, {'qa', 'くぁ', 'クァ'}, {'qwi', 'くぃ', 'クィ'}, {'qyi', 'くぃ', 'クィ'}, {'qi', 'くぃ', 'クィ'}, {'qwu', 'くぅ', 'クゥ'}, {'kwu', 'くぅ', 'クゥ'}, {'qwe', 'くぇ', 'クェ'}, {'qye', 'くぇ', 'クェ'}, {'qe', 'くぇ', 'クェ'}, {'qwo', 'くぉ', 'クォ'}, {'qo', 'くぉ', 'クォ'}, {'gyi', 'ぎぃ', 'ギィ'}, {'gwu', 'ぐぅ', 'グゥ'}, {'ci', 'し', 'シ'}, {'ce', 'せ', 'セ'}, {'sya', 'しゃ', 'シャ'}, {'syi', 'しぃ', 'シィ'}, {'syu', 'しゅ', 'シュ'}, {'sye', 'しぇ', 'シェ'}, {'syo', 'しょ', 'ショ'}, {'swa', 'すぁ', 'スァ'}, {'swi', 'すぃ', 'スィ'}, {'swu', 'すぅ', 'スゥ'}, {'swe', 'すぇ', 'スェ'}, {'swo', 'すぉ', 'スォ'}, {'zya', 'じゃ', 'ジャ'}, {'jya', 'じゃ', 'ジャ'}, {'zyi', 'じぃ', 'ジィ'}, {'jyi', 'じぃ', 'ジィ'}, {'zyu', 'じゅ', 'ジュ'}, {'jyu', 'じゅ', 'ジュ'}, {'zye', 'じぇ', 'ジェ'}, {'jye', 'じぇ', 'ジェ'}, {'zyo', 'じょ', 'ジョ'}, {'jyo', 'じょ', 'ジョ'}, {'tya', 'ちゃ', 'チャ'}, {'cya', 'ちゃ', 'チャ'}, {'tyi', 'ちぃ', 'チィ'}, {'cyi', 'ちぃ', 'チィ'}, {'cyu', 'ちゅ', 'チュ'}, {'tye', 'ちぇ', 'チェ'}, {'cye', 'ちぇ', 'チェ'}, {'tyo', 'ちょ', 'チョ'}, {'cyo', 'ちょ', 'チョ'}, {'tha', 'てゃ', 'テャ'}, {'thi', 'てぃ', 'ティ'}, {'thu', 'てゅ', 'テュ'}, {'the', 'てぇ', 'テェ'}, {'tho', 'てょ', 'テョ'}, {'twa', 'とぁ', 'トァ'}, {'twi', 'とぃ', 'トィ'}, {'twu', 'とぅ', 'トゥ'}, {'twe', 'とぇ', 'トェ'}, {'two', 'とぉ', 'トォ'}, {'dya', 'ぢゃ', 'ヂャ'}, {'dyi', 'ぢぃ', 'ヂィ'}, {'dye', 'ぢぇ', 'ヂェ'}, {'dyo', 'ぢょ', 'ヂョ'}, {'dha', 'でゃ', 'デャ'}, {'dhi', 'でぃ', 'ディ'}, {'dhu', 'でゅ', 'デュ'}, {'dhe', 'でぇ', 'デェ'}, {'dho', 'でょ', 'デョ'}, {'dwa', 'どぁ', 'ドァ'}, {'dwi', 'どぃ', 'ドィ'}, {'dwu', 'どぅ', 'ドゥ'}, {'dwe', 'どぇ', 'ドェ'}, {'dwo', 'どぉ', 'ドォ'}, {'nyi', 'にぃ', 'ニィ'}, {'hyi', 'ひぃ', 'ヒィ'}, {'fwa', 'ふぁ', 'ファ'}, {'fwi', 'ふぃ', 'フィ'}, {'fyi', 'ふぃ', 'フィ'}, {'fwu', 'ふぅ', 'フゥ'}, {'fwe', 'ふぇ', 'フェ'}, {'fye', 'ふぇ', 'フェ'}, {'fwo', 'ふぉ', 'フォ'}, {'byi', 'びぃ', 'ビィ'}, {'vyi', 'ゔぃ', 'ヴィ'}, {'pyi', 'ぴぃ', 'ピィ'}, {'myi', 'みぃ', 'ミィ'}, {'ryi', 'りぃ', 'リィ'}, {'nn', 'ん', 'ン'}, {'xn', 'ん', 'ン'}, {'xa', 'ぁ', 'ァ'}, --小写假名输入扩展 {'xi', 'ぃ', 'ィ'}, {'lyi', 'ぃ', 'ィ'}, {'xyi', 'ぃ', 'ィ'}, {'xu', 'ぅ', 'ゥ'}, {'xe', 'ぇ', 'ェ'}, {'lye', 'ぇ', 'ェ'}, {'xye', 'ぇ', 'ェ'}, {'xo', 'ぉ', 'ォ'}, {'xka', 'ゕ', 'ヵ'}, {'xke', 'ゖ', 'ヶ'}, {'ltu', 'っ', 'ッ'}, {'xtu', 'っ', 'ッ'}, {'xtsu', 'っ', 'ッ'}, {'xya', 'ゃ', 'ャ'}, {'xyu', 'ゅ', 'ュ'}, {'xyo', 'ょ', 'ョ'}, {'xwa', 'ゎ', 'ヮ'}, {'xku', 'ㇰ'}, --阿伊努语,朝鲜语和台湾话假名输入扩展 {'xshi', 'ㇱ'}, {'lsi', 'ㇱ'}, {'xsi', 'ㇱ'}, {'xsu', 'ㇲ'}, {'xto', 'ㇳ'}, {'xn', 'ㇴ'}, {'lnu', 'ㇴ'}, {'xnu', 'ㇴ'}, {'xha', 'ㇵ'}, {'xhi', 'ㇶ'}, {'xfu', 'ㇷ'}, {'lhu', 'ㇷ'}, {'xhu', 'ㇷ'}, {'xhe', 'ㇸ'}, {'xho', 'ㇹ'}, {'xp', 'ㇷ゚'}, {'lpu', 'ㇷ゚'}, {'xpu', 'ㇷ゚'}, {'xm', 'ㇺ'}, {'lmu', 'ㇺ'}, {'xmu', 'ㇺ'}, {'xra', 'ㇻ'}, {'xri', 'ㇼ'}, {'xru', 'ㇽ'}, {'xre', 'ㇾ'}, {'xro', 'ㇿ'} } function _main(args) local roma = args[1] local space = '' if args['s'] == '1' then space = ' ' end roma = string.gsub(roma, "'", '/_delimit_/') for i=1, mw.ustring.len(roma) do local kana = mw.ustring.sub(roma, i, i) if mw.ustring.find(kana, '[っッんン]') then local next = mw.ustring.sub(roma, i + 1, i + 1) for k, v in ipairs(kanas) do for key, val in ipairs(v) do if kana == 'っ' or kana == 'ッ' then if next == val then local nextRomaFirst = string.sub(v[1], 1, 1) if string.find(nextRomaFirst, '[^an]') then roma = mw.ustring.gsub(roma, '[っッ]', nextRomaFirst, 1) end end end end end end end for i=1, mw.ustring.len(roma) do local kana = mw.ustring.sub(roma, i, i) local next = mw.ustring.sub(roma, i + 1, i + 1) if kana == 'ん' or kana == 'ン' then if mw.ustring.find(next, '[あいうえおアイウエオやゆよヤユヨ]') then local left = mw.ustring.sub(roma, 1, i - 1) local right = mw.ustring.sub(roma, i, -1) right = mw.ustring.gsub(right, '[んン]', "n'", 1) roma = left..right end end end function iter(str, table) for k, v in ipairs(table) do for ind, val in ipairs(v) do repeat if ind == 1 then break end str = mw.ustring.gsub(str, val, v[1]..space) until true end end return str end if args['s'] ~= '1' then roma = iter(roma, hebon) end roma = iter(roma, youon) roma = iter(roma, kanas) if args['s'] == '1' then roma = string.reverse(roma):gsub(space, '', 1):reverse() end roma = string.gsub(roma, 'cchi', 'tchi'):gsub('ccha', 'tcha'):gsub('cchu', 'tchu'):gsub('ccho', 'tcho') roma = mw.ustring.gsub(roma, '[っッ]', '') roma = mw.ustring.gsub(roma, 'a%-', 'ā'):gsub('i%-', 'ī'):gsub('u%-', 'ū'):gsub('e%-', 'ē'):gsub('o%-', 'ō') :gsub('aa', 'ā'):gsub('uu', 'ū'):gsub('ee', 'ē'):gsub('ou', 'ō'):gsub('oo', 'ō') roma = string.gsub(roma, '/_delimit_/', '') return roma end function _inputKana(args) for i, v in ipairs(args) do args[i] = mw.text.split(v, ' ') end function iter(frag, index, roma, tbe) for i, v in ipairs(tbe) do for i, value in ipairs(v) do if roma == value[1] then if frag[1] ~= 'k' then frag[index] = value[2] else frag[index] = value[3] or value[2] end return end end end end for i, frag in ipairs(args) do for index, roma in ipairs(frag) do iter(frag, index, roma, { inputSub, youon, kanas, sutegana }) end end local str = '' for i, v in ipairs(args) do for i, v in ipairs(v) do str = str..v end end str = mw.ustring.gsub(str, '—', 'ー'):gsub('k', '') return str end function module.main(frame) local args = getArgs(frame, {wrappers='Template:Tja'}) return _main(args) end function module.inputKana(frame) local args = getArgs(frame) return _inputKana(args) end return module