80c9f67ce8
Operate on characters rather than bytes in the dialog so that it actually works with Kanji. Rewrite the auto-matcher to handle more cases and add unit tests for it.
622 lines
27 KiB
C++
622 lines
27 KiB
C++
// Copyright (c) 2013, Thomas Goyne <plorkyeran@aegisub.org>
|
||
//
|
||
// Permission to use, copy, modify, and distribute this software for any
|
||
// purpose with or without fee is hereby granted, provided that the above
|
||
// copyright notice and this permission notice appear in all copies.
|
||
//
|
||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||
//
|
||
// Aegisub Project http://www.aegisub.org/
|
||
|
||
#include "../config.h"
|
||
|
||
#include "libaegisub/kana_table.h"
|
||
|
||
#include <boost/range/algorithm.hpp>
|
||
|
||
namespace {
|
||
agi::kana_pair kana_to_romaji[] = {
|
||
{"\xE3\x81\x81", "a"}, // ぁ
|
||
{"\xE3\x81\x82", "a"}, // あ
|
||
{"\xE3\x81\x83", "i"}, // ぃ
|
||
{"\xE3\x81\x84", "i"}, // い
|
||
{"\xE3\x81\x85", "u"}, // ぅ
|
||
{"\xE3\x81\x86", "u"}, // う
|
||
{"\xE3\x81\x87", "e"}, // ぇ
|
||
{"\xE3\x81\x88", "e"}, // え
|
||
{"\xE3\x81\x89", "o"}, // ぉ
|
||
{"\xE3\x81\x8A", "o"}, // お
|
||
{"\xE3\x81\x8B", "ka"}, // か
|
||
{"\xE3\x81\x8C", "ga"}, // が
|
||
{"\xE3\x81\x8D", "ki"}, // き
|
||
{"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
|
||
{"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
|
||
{"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
|
||
{"\xE3\x81\x8E", "gi"}, // ぎ
|
||
{"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
|
||
{"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
|
||
{"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
|
||
{"\xE3\x81\x8F", "ku"}, // く
|
||
{"\xE3\x81\x90", "gu"}, // ぐ
|
||
{"\xE3\x81\x91", "ke"}, // け
|
||
{"\xE3\x81\x92", "ge"}, // げ
|
||
{"\xE3\x81\x93", "ko"}, // こ
|
||
{"\xE3\x81\x94", "go"}, // ご
|
||
{"\xE3\x81\x95", "sa"}, // さ
|
||
{"\xE3\x81\x96", "za"}, // ざ
|
||
{"\xE3\x81\x97", "shi"}, // し
|
||
{"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
|
||
{"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
|
||
{"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
|
||
{"\xE3\x81\x98", "ji"}, // じ
|
||
{"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
|
||
{"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
|
||
{"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
|
||
{"\xE3\x81\x99", "su"}, // す
|
||
{"\xE3\x81\x9A", "zu"}, // ず
|
||
{"\xE3\x81\x9B", "se"}, // せ
|
||
{"\xE3\x81\x9C", "ze"}, // ぜ
|
||
{"\xE3\x81\x9D", "so"}, // そ
|
||
{"\xE3\x81\x9E", "zo"}, // ぞ
|
||
{"\xE3\x81\x9F", "ta"}, // た
|
||
{"\xE3\x81\xA0", "da"}, // だ
|
||
{"\xE3\x81\xA1", "chi"}, // ち
|
||
{"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
|
||
{"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
|
||
{"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
|
||
{"\xE3\x81\xA2", "ji"}, // ぢ
|
||
{"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
|
||
{"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
|
||
{"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
|
||
{"\xE3\x81\xA3", "c"}, // っ
|
||
{"\xE3\x81\xA3", "k"}, // っ
|
||
{"\xE3\x81\xA3", "p"}, // っ
|
||
{"\xE3\x81\xA3", "s"}, // っ
|
||
{"\xE3\x81\xA3", "t"}, // っ
|
||
{"\xE3\x81\xA4", "tsu"}, // つ
|
||
{"\xE3\x81\xA5", "zu"}, // づ
|
||
{"\xE3\x81\xA6", "te"}, // て
|
||
{"\xE3\x81\xA7", "de"}, // で
|
||
{"\xE3\x81\xA8", "to"}, // と
|
||
{"\xE3\x81\xA9", "do"}, // ど
|
||
{"\xE3\x81\xAA", "na"}, // な
|
||
{"\xE3\x81\xAB", "ni"}, // に
|
||
{"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
|
||
{"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
|
||
{"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
|
||
{"\xE3\x81\xAC", "nu"}, // ぬ
|
||
{"\xE3\x81\xAD", "ne"}, // ね
|
||
{"\xE3\x81\xAE", "no"}, // の
|
||
{"\xE3\x81\xAF", "ha"}, // は
|
||
{"\xE3\x81\xAF", "wa"}, // は
|
||
{"\xE3\x81\xB0", "ba"}, // ば
|
||
{"\xE3\x81\xB1", "pa"}, // ぱ
|
||
{"\xE3\x81\xB2", "hi"}, // ひ
|
||
{"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
|
||
{"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
|
||
{"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
|
||
{"\xE3\x81\xB3", "bi"}, // び
|
||
{"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
|
||
{"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
|
||
{"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
|
||
{"\xE3\x81\xB4", "pi"}, // ぴ
|
||
{"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
|
||
{"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
|
||
{"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
|
||
{"\xE3\x81\xB5", "fu"}, // ふ
|
||
{"\xE3\x81\xB6", "bu"}, // ぶ
|
||
{"\xE3\x81\xB7", "pu"}, // ぷ
|
||
{"\xE3\x81\xB8", "he"}, // へ
|
||
{"\xE3\x81\xB8", "e"}, // へ
|
||
{"\xE3\x81\xB9", "be"}, // べ
|
||
{"\xE3\x81\xBA", "pe"}, // ぺ
|
||
{"\xE3\x81\xBB", "ho"}, // ほ
|
||
{"\xE3\x81\xBC", "bo"}, // ぼ
|
||
{"\xE3\x81\xBD", "po"}, // ぽ
|
||
{"\xE3\x81\xBE", "ma"}, // ま
|
||
{"\xE3\x81\xBF", "mi"}, // み
|
||
{"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
|
||
{"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
|
||
{"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
|
||
{"\xE3\x82\x80", "mu"}, // む
|
||
{"\xE3\x82\x81", "me"}, // め
|
||
{"\xE3\x82\x82", "mo"}, // も
|
||
{"\xE3\x82\x84", "ya"}, // や
|
||
{"\xE3\x82\x86", "yu"}, // ゆ
|
||
{"\xE3\x82\x88", "yo"}, // よ
|
||
{"\xE3\x82\x89", "ra"}, // ら
|
||
{"\xE3\x82\x8A", "ri"}, // り
|
||
{"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
|
||
{"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
|
||
{"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
|
||
{"\xE3\x82\x8B", "ru"}, // る
|
||
{"\xE3\x82\x8C", "re"}, // れ
|
||
{"\xE3\x82\x8D", "ro"}, // ろ
|
||
{"\xE3\x82\x8F", "wa"}, // わ
|
||
{"\xE3\x82\x90", "wi"}, // ゐ
|
||
{"\xE3\x82\x91", "we"}, // ゑ
|
||
{"\xE3\x82\x92", "wo"}, // を
|
||
{"\xE3\x82\x93", "m"}, // ん
|
||
{"\xE3\x82\x93", "n"}, // ん
|
||
{"\xE3\x82\xA1", "a"}, // ァ
|
||
{"\xE3\x82\xA2", "a"}, // ア
|
||
{"\xE3\x82\xA3", "i"}, // ィ
|
||
{"\xE3\x82\xA4", "i"}, // イ
|
||
{"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
|
||
{"\xE3\x82\xA5", "u"}, // ゥ
|
||
{"\xE3\x82\xA6", "u"}, // ウ
|
||
{"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
|
||
{"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
|
||
{"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
|
||
{"\xE3\x82\xA7", "e"}, // ェ
|
||
{"\xE3\x82\xA8", "e"}, // エ
|
||
{"\xE3\x82\xA9", "o"}, // ォ
|
||
{"\xE3\x82\xAA", "o"}, // オ
|
||
{"\xE3\x82\xAB", "ka"}, // カ
|
||
{"\xE3\x82\xAC", "ga"}, // ガ
|
||
{"\xE3\x82\xAD", "ki"}, // キ
|
||
{"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
|
||
{"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
|
||
{"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
|
||
{"\xE3\x82\xAE", "gi"}, // ギ
|
||
{"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
|
||
{"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
|
||
{"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
|
||
{"\xE3\x82\xAF", "ku"}, // ク
|
||
{"\xE3\x82\xB0", "gu"}, // グ
|
||
{"\xE3\x82\xB1", "ke"}, // ケ
|
||
{"\xE3\x82\xB2", "ge"}, // ゲ
|
||
{"\xE3\x82\xB3", "ko"}, // コ
|
||
{"\xE3\x82\xB4", "go"}, // ゴ
|
||
{"\xE3\x82\xB5", "sa"}, // サ
|
||
{"\xE3\x82\xB6", "za"}, // ザ
|
||
{"\xE3\x82\xB7", "shi"}, // シ
|
||
{"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
|
||
{"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
|
||
{"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
|
||
{"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
|
||
{"\xE3\x82\xB8", "ji"}, // ジ
|
||
{"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
|
||
{"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
|
||
{"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
|
||
{"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
|
||
{"\xE3\x82\xB9", "su"}, // ス
|
||
{"\xE3\x82\xBA", "zu"}, // ズ
|
||
{"\xE3\x82\xBB", "se"}, // セ
|
||
{"\xE3\x82\xBC", "ze"}, // ゼ
|
||
{"\xE3\x82\xBD", "so"}, // ソ
|
||
{"\xE3\x82\xBE", "zo"}, // ゾ
|
||
{"\xE3\x82\xBF", "ta"}, // タ
|
||
{"\xE3\x83\x80", "da"}, // ダ
|
||
{"\xE3\x83\x81", "chi"}, // チ
|
||
{"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
|
||
{"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
|
||
{"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
|
||
{"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
|
||
{"\xE3\x83\x82", "ji"}, // ヂ
|
||
{"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
|
||
{"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
|
||
{"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
|
||
{"\xE3\x83\x83", "c"}, // ッ
|
||
{"\xE3\x83\x83", "k"}, // ッ
|
||
{"\xE3\x83\x83", "p"}, // ッ
|
||
{"\xE3\x83\x83", "s"}, // ッ
|
||
{"\xE3\x83\x83", "t"}, // ッ
|
||
{"\xE3\x83\x84", "tsu"}, // ツ
|
||
{"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
|
||
{"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
|
||
{"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
|
||
{"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
|
||
{"\xE3\x83\x85", "zu"}, // ヅ
|
||
{"\xE3\x83\x86", "te"}, // テ
|
||
{"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
|
||
{"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
|
||
{"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
|
||
{"\xE3\x83\x87", "de"}, // デ
|
||
{"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
|
||
{"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
|
||
{"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
|
||
{"\xE3\x83\x88", "to"}, // ト
|
||
{"\xE3\x83\x89", "do"}, // ド
|
||
{"\xE3\x83\x8A", "na"}, // ナ
|
||
{"\xE3\x83\x8B", "ni"}, // ニ
|
||
{"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
|
||
{"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
|
||
{"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
|
||
{"\xE3\x83\x8C", "nu"}, // ヌ
|
||
{"\xE3\x83\x8D", "ne"}, // ネ
|
||
{"\xE3\x83\x8E", "no"}, // ノ
|
||
{"\xE3\x83\x8F", "ha"}, // ハ
|
||
{"\xE3\x83\x90", "ba"}, // バ
|
||
{"\xE3\x83\x91", "pa"}, // パ
|
||
{"\xE3\x83\x92", "hi"}, // ヒ
|
||
{"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
|
||
{"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
|
||
{"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
|
||
{"\xE3\x83\x93", "bi"}, // ビ
|
||
{"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
|
||
{"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
|
||
{"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
|
||
{"\xE3\x83\x94", "pi"}, // ピ
|
||
{"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
|
||
{"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
|
||
{"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
|
||
{"\xE3\x83\x95", "fu"}, // フ
|
||
{"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
|
||
{"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
|
||
{"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
|
||
{"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
|
||
{"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
|
||
{"\xE3\x83\x96", "bu"}, // ブ
|
||
{"\xE3\x83\x97", "pu"}, // プ
|
||
{"\xE3\x83\x98", "he"}, // ヘ
|
||
{"\xE3\x83\x99", "be"}, // ベ
|
||
{"\xE3\x83\x9A", "pe"}, // ペ
|
||
{"\xE3\x83\x9B", "ho"}, // ホ
|
||
{"\xE3\x83\x9C", "bo"}, // ボ
|
||
{"\xE3\x83\x9D", "po"}, // ポ
|
||
{"\xE3\x83\x9E", "ma"}, // マ
|
||
{"\xE3\x83\x9F", "mi"}, // ミ
|
||
{"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
|
||
{"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
|
||
{"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
|
||
{"\xE3\x83\xA0", "mu"}, // ム
|
||
{"\xE3\x83\xA1", "me"}, // メ
|
||
{"\xE3\x83\xA2", "mo"}, // モ
|
||
{"\xE3\x83\xA4", "ya"}, // ヤ
|
||
{"\xE3\x83\xA6", "yu"}, // ユ
|
||
{"\xE3\x83\xA8", "yo"}, // ヨ
|
||
{"\xE3\x83\xA9", "ra"}, // ラ
|
||
{"\xE3\x83\xAA", "ri"}, // リ
|
||
{"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
|
||
{"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
|
||
{"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
|
||
{"\xE3\x83\xAB", "ru"}, // ル
|
||
{"\xE3\x83\xAC", "re"}, // レ
|
||
{"\xE3\x83\xAD", "ro"}, // ロ
|
||
{"\xE3\x83\xAF", "wa"}, // ワ
|
||
{"\xE3\x83\xB0", "wi"}, // ヰ
|
||
{"\xE3\x83\xB1", "we"}, // ヱ
|
||
{"\xE3\x83\xB2", "wo"}, // ヲ
|
||
{"\xE3\x83\xB3", "m"}, // ン
|
||
{"\xE3\x83\xB3", "n"}, // ン
|
||
{"\xE3\x83\xB4", "vu"}, // ヴ
|
||
{"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
|
||
{"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
|
||
{"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
|
||
{"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
|
||
{"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
|
||
{"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
|
||
{"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
|
||
{"\xE3\x83\xBC", "a"}, // ー
|
||
{"\xE3\x83\xBC", "e"}, // ー
|
||
{"\xE3\x83\xBC", "i"}, // ー
|
||
{"\xE3\x83\xBC", "o"}, // ー
|
||
{"\xE3\x83\xBC", "u"}, // ー
|
||
};
|
||
|
||
agi::kana_pair romaji_to_kana[] = {
|
||
{"\xE3\x81\x81", "a"}, // ぁ
|
||
{"\xE3\x81\x82", "a"}, // あ
|
||
{"\xE3\x82\xA1", "a"}, // ァ
|
||
{"\xE3\x82\xA2", "a"}, // ア
|
||
{"\xE3\x83\xBC", "a"}, // ー
|
||
{"\xE3\x81\xB0", "ba"}, // ば
|
||
{"\xE3\x83\x90", "ba"}, // バ
|
||
{"\xE3\x81\xB9", "be"}, // べ
|
||
{"\xE3\x83\x99", "be"}, // ベ
|
||
{"\xE3\x81\xB3", "bi"}, // び
|
||
{"\xE3\x83\x93", "bi"}, // ビ
|
||
{"\xE3\x81\xBC", "bo"}, // ぼ
|
||
{"\xE3\x83\x9C", "bo"}, // ボ
|
||
{"\xE3\x81\xB6", "bu"}, // ぶ
|
||
{"\xE3\x83\x96", "bu"}, // ブ
|
||
{"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
|
||
{"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
|
||
{"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
|
||
{"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
|
||
{"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
|
||
{"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
|
||
{"\xE3\x81\xA3", "c"}, // っ
|
||
{"\xE3\x83\x83", "c"}, // ッ
|
||
{"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
|
||
{"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
|
||
{"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
|
||
{"\xE3\x81\xA1", "chi"}, // ち
|
||
{"\xE3\x83\x81", "chi"}, // チ
|
||
{"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
|
||
{"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
|
||
{"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
|
||
{"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
|
||
{"\xE3\x81\xA0", "da"}, // だ
|
||
{"\xE3\x83\x80", "da"}, // ダ
|
||
{"\xE3\x81\xA7", "de"}, // で
|
||
{"\xE3\x83\x87", "de"}, // デ
|
||
{"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
|
||
{"\xE3\x81\xA9", "do"}, // ど
|
||
{"\xE3\x83\x89", "do"}, // ド
|
||
{"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
|
||
{"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
|
||
{"\xE3\x81\x87", "e"}, // ぇ
|
||
{"\xE3\x81\x88", "e"}, // え
|
||
{"\xE3\x82\xA7", "e"}, // ェ
|
||
{"\xE3\x82\xA8", "e"}, // エ
|
||
{"\xE3\x83\xBC", "e"}, // ー
|
||
{"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
|
||
{"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
|
||
{"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
|
||
{"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
|
||
{"\xE3\x81\xB5", "fu"}, // ふ
|
||
{"\xE3\x83\x95", "fu"}, // フ
|
||
{"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
|
||
{"\xE3\x81\x8C", "ga"}, // が
|
||
{"\xE3\x82\xAC", "ga"}, // ガ
|
||
{"\xE3\x81\x92", "ge"}, // げ
|
||
{"\xE3\x82\xB2", "ge"}, // ゲ
|
||
{"\xE3\x81\x8E", "gi"}, // ぎ
|
||
{"\xE3\x82\xAE", "gi"}, // ギ
|
||
{"\xE3\x81\x94", "go"}, // ご
|
||
{"\xE3\x82\xB4", "go"}, // ゴ
|
||
{"\xE3\x81\x90", "gu"}, // ぐ
|
||
{"\xE3\x82\xB0", "gu"}, // グ
|
||
{"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
|
||
{"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
|
||
{"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
|
||
{"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
|
||
{"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
|
||
{"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
|
||
{"\xE3\x81\xAF", "ha"}, // は
|
||
{"\xE3\x83\x8F", "ha"}, // ハ
|
||
{"\xE3\x81\xB8", "he"}, // へ
|
||
{"\xE3\x83\x98", "he"}, // ヘ
|
||
{"\xE3\x81\xB2", "hi"}, // ひ
|
||
{"\xE3\x83\x92", "hi"}, // ヒ
|
||
{"\xE3\x81\xBB", "ho"}, // ほ
|
||
{"\xE3\x83\x9B", "ho"}, // ホ
|
||
{"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
|
||
{"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
|
||
{"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
|
||
{"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
|
||
{"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
|
||
{"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
|
||
{"\xE3\x81\x83", "i"}, // ぃ
|
||
{"\xE3\x81\x84", "i"}, // い
|
||
{"\xE3\x82\xA3", "i"}, // ィ
|
||
{"\xE3\x82\xA4", "i"}, // イ
|
||
{"\xE3\x83\xBC", "i"}, // ー
|
||
{"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
|
||
{"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
|
||
{"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
|
||
{"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
|
||
{"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
|
||
{"\xE3\x81\x98", "ji"}, // じ
|
||
{"\xE3\x81\xA2", "ji"}, // ぢ
|
||
{"\xE3\x82\xB8", "ji"}, // ジ
|
||
{"\xE3\x83\x82", "ji"}, // ヂ
|
||
{"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
|
||
{"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
|
||
{"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
|
||
{"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
|
||
{"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
|
||
{"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
|
||
{"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
|
||
{"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
|
||
{"\xE3\x81\xA3", "k"}, // っ
|
||
{"\xE3\x83\x83", "k"}, // ッ
|
||
{"\xE3\x81\x8B", "ka"}, // か
|
||
{"\xE3\x82\xAB", "ka"}, // カ
|
||
{"\xE3\x81\x91", "ke"}, // け
|
||
{"\xE3\x82\xB1", "ke"}, // ケ
|
||
{"\xE3\x81\x8D", "ki"}, // き
|
||
{"\xE3\x82\xAD", "ki"}, // キ
|
||
{"\xE3\x81\x93", "ko"}, // こ
|
||
{"\xE3\x82\xB3", "ko"}, // コ
|
||
{"\xE3\x81\x8F", "ku"}, // く
|
||
{"\xE3\x82\xAF", "ku"}, // ク
|
||
{"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
|
||
{"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
|
||
{"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
|
||
{"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
|
||
{"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
|
||
{"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
|
||
{"\xE3\x82\x93", "m"}, // ん
|
||
{"\xE3\x83\xB3", "m"}, // ン
|
||
{"\xE3\x81\xBE", "ma"}, // ま
|
||
{"\xE3\x83\x9E", "ma"}, // マ
|
||
{"\xE3\x82\x81", "me"}, // め
|
||
{"\xE3\x83\xA1", "me"}, // メ
|
||
{"\xE3\x81\xBF", "mi"}, // み
|
||
{"\xE3\x83\x9F", "mi"}, // ミ
|
||
{"\xE3\x82\x82", "mo"}, // も
|
||
{"\xE3\x83\xA2", "mo"}, // モ
|
||
{"\xE3\x82\x80", "mu"}, // む
|
||
{"\xE3\x83\xA0", "mu"}, // ム
|
||
{"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
|
||
{"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
|
||
{"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
|
||
{"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
|
||
{"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
|
||
{"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
|
||
{"\xE3\x82\x93", "n"}, // ん
|
||
{"\xE3\x83\xB3", "n"}, // ン
|
||
{"\xE3\x81\xAA", "na"}, // な
|
||
{"\xE3\x83\x8A", "na"}, // ナ
|
||
{"\xE3\x81\xAD", "ne"}, // ね
|
||
{"\xE3\x83\x8D", "ne"}, // ネ
|
||
{"\xE3\x81\xAB", "ni"}, // に
|
||
{"\xE3\x83\x8B", "ni"}, // ニ
|
||
{"\xE3\x81\xAE", "no"}, // の
|
||
{"\xE3\x83\x8E", "no"}, // ノ
|
||
{"\xE3\x81\xAC", "nu"}, // ぬ
|
||
{"\xE3\x83\x8C", "nu"}, // ヌ
|
||
{"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
|
||
{"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
|
||
{"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
|
||
{"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
|
||
{"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
|
||
{"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
|
||
{"\xE3\x81\x89", "o"}, // ぉ
|
||
{"\xE3\x81\x8A", "o"}, // お
|
||
{"\xE3\x82\xA9", "o"}, // ォ
|
||
{"\xE3\x82\xAA", "o"}, // オ
|
||
{"\xE3\x83\xBC", "o"}, // ー
|
||
{"\xE3\x81\xA3", "p"}, // っ
|
||
{"\xE3\x83\x83", "p"}, // ッ
|
||
{"\xE3\x81\xB1", "pa"}, // ぱ
|
||
{"\xE3\x83\x91", "pa"}, // パ
|
||
{"\xE3\x81\xBA", "pe"}, // ぺ
|
||
{"\xE3\x83\x9A", "pe"}, // ペ
|
||
{"\xE3\x81\xB4", "pi"}, // ぴ
|
||
{"\xE3\x83\x94", "pi"}, // ピ
|
||
{"\xE3\x81\xBD", "po"}, // ぽ
|
||
{"\xE3\x83\x9D", "po"}, // ポ
|
||
{"\xE3\x81\xB7", "pu"}, // ぷ
|
||
{"\xE3\x83\x97", "pu"}, // プ
|
||
{"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
|
||
{"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
|
||
{"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
|
||
{"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
|
||
{"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
|
||
{"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
|
||
{"\xE3\x82\x89", "ra"}, // ら
|
||
{"\xE3\x83\xA9", "ra"}, // ラ
|
||
{"\xE3\x82\x8C", "re"}, // れ
|
||
{"\xE3\x83\xAC", "re"}, // レ
|
||
{"\xE3\x82\x8A", "ri"}, // り
|
||
{"\xE3\x83\xAA", "ri"}, // リ
|
||
{"\xE3\x82\x8D", "ro"}, // ろ
|
||
{"\xE3\x83\xAD", "ro"}, // ロ
|
||
{"\xE3\x82\x8B", "ru"}, // る
|
||
{"\xE3\x83\xAB", "ru"}, // ル
|
||
{"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
|
||
{"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
|
||
{"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
|
||
{"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
|
||
{"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
|
||
{"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
|
||
{"\xE3\x81\xA3", "s"}, // っ
|
||
{"\xE3\x83\x83", "s"}, // ッ
|
||
{"\xE3\x81\x95", "sa"}, // さ
|
||
{"\xE3\x82\xB5", "sa"}, // サ
|
||
{"\xE3\x81\x9B", "se"}, // せ
|
||
{"\xE3\x82\xBB", "se"}, // セ
|
||
{"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
|
||
{"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
|
||
{"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
|
||
{"\xE3\x81\x97", "shi"}, // し
|
||
{"\xE3\x82\xB7", "shi"}, // シ
|
||
{"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
|
||
{"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
|
||
{"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
|
||
{"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
|
||
{"\xE3\x81\x9D", "so"}, // そ
|
||
{"\xE3\x82\xBD", "so"}, // ソ
|
||
{"\xE3\x81\x99", "su"}, // す
|
||
{"\xE3\x82\xB9", "su"}, // ス
|
||
{"\xE3\x81\xA3", "t"}, // っ
|
||
{"\xE3\x83\x83", "t"}, // ッ
|
||
{"\xE3\x81\x9F", "ta"}, // た
|
||
{"\xE3\x82\xBF", "ta"}, // タ
|
||
{"\xE3\x81\xA6", "te"}, // て
|
||
{"\xE3\x83\x86", "te"}, // テ
|
||
{"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
|
||
{"\xE3\x81\xA8", "to"}, // と
|
||
{"\xE3\x83\x88", "to"}, // ト
|
||
{"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
|
||
{"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
|
||
{"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
|
||
{"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
|
||
{"\xE3\x81\xA4", "tsu"}, // つ
|
||
{"\xE3\x83\x84", "tsu"}, // ツ
|
||
{"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
|
||
{"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
|
||
{"\xE3\x81\x85", "u"}, // ぅ
|
||
{"\xE3\x81\x86", "u"}, // う
|
||
{"\xE3\x82\xA5", "u"}, // ゥ
|
||
{"\xE3\x82\xA6", "u"}, // ウ
|
||
{"\xE3\x83\xBC", "u"}, // ー
|
||
{"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
|
||
{"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
|
||
{"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
|
||
{"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
|
||
{"\xE3\x83\xB4", "vu"}, // ヴ
|
||
{"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
|
||
{"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
|
||
{"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
|
||
{"\xE3\x81\xAF", "wa"}, // は
|
||
{"\xE3\x82\x8F", "wa"}, // わ
|
||
{"\xE3\x83\xAF", "wa"}, // ワ
|
||
{"\xE3\x82\x91", "we"}, // ゑ
|
||
{"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
|
||
{"\xE3\x83\xB1", "we"}, // ヱ
|
||
{"\xE3\x82\x90", "wi"}, // ゐ
|
||
{"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
|
||
{"\xE3\x83\xB0", "wi"}, // ヰ
|
||
{"\xE3\x82\x92", "wo"}, // を
|
||
{"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
|
||
{"\xE3\x83\xB2", "wo"}, // ヲ
|
||
{"\xE3\x82\x84", "ya"}, // や
|
||
{"\xE3\x83\xA4", "ya"}, // ヤ
|
||
{"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
|
||
{"\xE3\x82\x88", "yo"}, // よ
|
||
{"\xE3\x83\xA8", "yo"}, // ヨ
|
||
{"\xE3\x82\x86", "yu"}, // ゆ
|
||
{"\xE3\x83\xA6", "yu"}, // ユ
|
||
{"\xE3\x81\x96", "za"}, // ざ
|
||
{"\xE3\x82\xB6", "za"}, // ザ
|
||
{"\xE3\x81\x9C", "ze"}, // ぜ
|
||
{"\xE3\x82\xBC", "ze"}, // ゼ
|
||
{"\xE3\x81\x9E", "zo"}, // ぞ
|
||
{"\xE3\x82\xBE", "zo"}, // ゾ
|
||
{"\xE3\x81\x9A", "zu"}, // ず
|
||
{"\xE3\x81\xA5", "zu"}, // づ
|
||
{"\xE3\x82\xBA", "zu"}, // ズ
|
||
{"\xE3\x83\x85", "zu"}, // ヅ
|
||
};
|
||
|
||
bool cmp_kana(agi::kana_pair const& kp, std::string const& kana) {
|
||
return strcmp(kp.kana, kana.c_str()) < 0;
|
||
}
|
||
|
||
struct cmp_romaji {
|
||
bool operator()(agi::kana_pair const& kp, std::string const& romaji) const {
|
||
return strcmp(kp.romaji, romaji.c_str()) < 0;
|
||
}
|
||
bool operator()(std::string const& romaji, agi::kana_pair const& kp) const {
|
||
return strcmp(kp.romaji, romaji.c_str()) > 0;
|
||
}
|
||
|
||
#ifdef _MSC_VER // debug iterator stuff needs this overload
|
||
bool operator()(agi::kana_pair const& a, agi::kana_pair const& b) const {
|
||
return strcmp(a.romaji, b.romaji) < 0;
|
||
}
|
||
#endif
|
||
};
|
||
|
||
}
|
||
|
||
namespace agi {
|
||
std::vector<const char *> kana_to_romaji(std::string const& kana) {
|
||
std::vector<const char *> ret;
|
||
for (auto pair = boost::lower_bound(::kana_to_romaji, kana, cmp_kana);
|
||
pair != std::end(::kana_to_romaji) && !strcmp(pair->kana, kana.c_str());
|
||
++pair)
|
||
ret.push_back(pair->romaji);
|
||
return ret;
|
||
}
|
||
|
||
boost::iterator_range<const kana_pair *> romaji_to_kana(std::string const& romaji) {
|
||
for (size_t len = std::min<size_t>(3, romaji.size()); len > 0; --len) {
|
||
auto pair = boost::equal_range(::romaji_to_kana, romaji.substr(0, len).c_str(), cmp_romaji());
|
||
if (pair.first != pair.second)
|
||
return boost::make_iterator_range(pair.first, pair.second);
|
||
}
|
||
return boost::make_iterator_range(::romaji_to_kana, ::romaji_to_kana);
|
||
}
|
||
}
|