blob: 95e27030f3db92ecb2554d6708a2a8ce2d088d8d [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Lucene.Net.Analysis.Ja.Util
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// Utility class for english translations of morphological data,
/// used only for debugging.
/// </summary>
public static class ToStringUtil
{
// a translation map for parts of speech, only used for reflectWith
private static readonly IDictionary<string, string> posTranslations = new Dictionary<string, string>(StringComparer.Ordinal)
{
{ "名詞", "noun"},
{ "名詞-一般", "noun-common" },
{ "名詞-固有名詞", "noun-proper" },
{ "名詞-固有名詞-一般", "noun-proper-misc" },
{ "名詞-固有名詞-人名", "noun-proper-person" },
{ "名詞-固有名詞-人名-一般", "noun-proper-person-misc" },
{ "名詞-固有名詞-人名-姓", "noun-proper-person-surname" },
{ "名詞-固有名詞-人名-名", "noun-proper-person-given_name" },
{ "名詞-固有名詞-組織", "noun-proper-organization" },
{ "名詞-固有名詞-地域", "noun-proper-place" },
{ "名詞-固有名詞-地域-一般", "noun-proper-place-misc" },
{ "名詞-固有名詞-地域-国", "noun-proper-place-country" },
{ "名詞-代名詞", "noun-pronoun" },
{ "名詞-代名詞-一般", "noun-pronoun-misc" },
{ "名詞-代名詞-縮約", "noun-pronoun-contraction" },
{ "名詞-副詞可能", "noun-adverbial" },
{ "名詞-サ変接続", "noun-verbal" },
{ "名詞-形容動詞語幹", "noun-adjective-base" },
{ "名詞-数", "noun-numeric" },
{ "名詞-非自立", "noun-affix" },
{ "名詞-非自立-一般", "noun-affix-misc" },
{ "名詞-非自立-副詞可能", "noun-affix-adverbial" },
{ "名詞-非自立-助動詞語幹", "noun-affix-aux" },
{ "名詞-非自立-形容動詞語幹", "noun-affix-adjective-base" },
{ "名詞-特殊", "noun-special" },
{ "名詞-特殊-助動詞語幹", "noun-special-aux" },
{ "名詞-接尾", "noun-suffix" },
{ "名詞-接尾-一般", "noun-suffix-misc" },
{ "名詞-接尾-人名", "noun-suffix-person" },
{ "名詞-接尾-地域", "noun-suffix-place" },
{ "名詞-接尾-サ変接続", "noun-suffix-verbal" },
{ "名詞-接尾-助動詞語幹", "noun-suffix-aux" },
{ "名詞-接尾-形容動詞語幹", "noun-suffix-adjective-base" },
{ "名詞-接尾-副詞可能", "noun-suffix-adverbial" },
{ "名詞-接尾-助数詞", "noun-suffix-classifier" },
{ "名詞-接尾-特殊", "noun-suffix-special" },
{ "名詞-接続詞的", "noun-suffix-conjunctive" },
{ "名詞-動詞非自立的", "noun-verbal_aux" },
{ "名詞-引用文字列", "noun-quotation" },
{ "名詞-ナイ形容詞語幹", "noun-nai_adjective" },
{ "接頭詞", "prefix" },
{ "接頭詞-名詞接続", "prefix-nominal" },
{ "接頭詞-動詞接続", "prefix-verbal" },
{ "接頭詞-形容詞接続", "prefix-adjectival" },
{ "接頭詞-数接続", "prefix-numerical" },
{ "動詞", "verb" },
{ "動詞-自立", "verb-main" },
{ "動詞-非自立", "verb-auxiliary" },
{ "動詞-接尾", "verb-suffix" },
{ "形容詞", "adjective" },
{ "形容詞-自立", "adjective-main" },
{ "形容詞-非自立", "adjective-auxiliary" },
{ "形容詞-接尾", "adjective-suffix" },
{ "副詞", "adverb" },
{ "副詞-一般", "adverb-misc" },
{ "副詞-助詞類接続", "adverb-particle_conjunction" },
{ "連体詞", "adnominal" },
{ "接続詞", "conjunction" },
{ "助詞", "particle" },
{ "助詞-格助詞", "particle-case" },
{ "助詞-格助詞-一般", "particle-case-misc" },
{ "助詞-格助詞-引用", "particle-case-quote" },
{ "助詞-格助詞-連語", "particle-case-compound" },
{ "助詞-接続助詞", "particle-conjunctive" },
{ "助詞-係助詞", "particle-dependency" },
{ "助詞-副助詞", "particle-adverbial" },
{ "助詞-間投助詞", "particle-interjective" },
{ "助詞-並立助詞", "particle-coordinate" },
{ "助詞-終助詞", "particle-final" },
{ "助詞-副助詞/並立助詞/終助詞", "particle-adverbial/conjunctive/final" },
{ "助詞-連体化", "particle-adnominalizer" },
{ "助詞-副詞化", "particle-adnominalizer" },
{ "助詞-特殊", "particle-special" },
{ "助動詞", "auxiliary-verb" },
{ "感動詞", "interjection" },
{ "記号", "symbol" },
{ "記号-一般", "symbol-misc" },
{ "記号-句点", "symbol-period" },
{ "記号-読点", "symbol-comma" },
{ "記号-空白", "symbol-space" },
{ "記号-括弧開", "symbol-open_bracket" },
{ "記号-括弧閉", "symbol-close_bracket" },
{ "記号-アルファベット", "symbol-alphabetic" },
{ "その他", "other" },
{ "その他-間投", "other-interjection" },
{ "フィラー", "filler" },
{ "非言語音", "non-verbal" },
{ "語断片", "fragment" },
{ "未知語", "unknown" }
};
/// <summary>
/// Get the english form of a POS tag
/// </summary>
public static string GetPOSTranslation(string s)
{
string result;
posTranslations.TryGetValue(s, out result);
return result;
}
// a translation map for inflection types, only used for reflectWith
private static readonly IDictionary<string, string> inflTypeTranslations = new Dictionary<string, string>(StringComparer.Ordinal)
{
{ "*", "*" },
{ "形容詞・アウオ段", "adj-group-a-o-u" },
{ "形容詞・イ段", "adj-group-i" },
{ "形容詞・イイ", "adj-group-ii" },
{ "不変化型", "non-inflectional" },
{ "特殊・タ", "special-da" },
{ "特殊・ダ", "special-ta" },
{ "文語・ゴトシ", "classical-gotoshi" },
{ "特殊・ジャ", "special-ja" },
{ "特殊・ナイ", "special-nai" },
{ "五段・ラ行特殊", "5-row-cons-r-special" },
{ "特殊・ヌ", "special-nu" },
{ "文語・キ", "classical-ki" },
{ "特殊・タイ", "special-tai" },
{ "文語・ベシ", "classical-beshi" },
{ "特殊・ヤ", "special-ya" },
{ "文語・マジ", "classical-maji" },
{ "下二・タ行", "2-row-lower-cons-t" },
{ "特殊・デス", "special-desu" },
{ "特殊・マス", "special-masu" },
{ "五段・ラ行アル", "5-row-aru" },
{ "文語・ナリ", "classical-nari" },
{ "文語・リ", "classical-ri" },
{ "文語・ケリ", "classical-keri" },
{ "文語・ル", "classical-ru" },
{ "五段・カ行イ音便", "5-row-cons-k-i-onbin" },
{ "五段・サ行", "5-row-cons-s" },
{ "一段", "1-row" },
{ "五段・ワ行促音便", "5-row-cons-w-cons-onbin" },
{ "五段・マ行", "5-row-cons-m" },
{ "五段・タ行", "5-row-cons-t" },
{ "五段・ラ行", "5-row-cons-r" },
{ "サ変・−スル", "irregular-suffix-suru" },
{ "五段・ガ行", "5-row-cons-g" },
{ "サ変・−ズル", "irregular-suffix-zuru" },
{ "五段・バ行", "5-row-cons-b" },
{ "五段・ワ行ウ音便", "5-row-cons-w-u-onbin" },
{ "下二・ダ行", "2-row-lower-cons-d" },
{ "五段・カ行促音便ユク", "5-row-cons-k-cons-onbin-yuku" },
{ "上二・ダ行", "2-row-upper-cons-d" },
{ "五段・カ行促音便", "5-row-cons-k-cons-onbin" },
{ "一段・得ル", "1-row-eru" },
{ "四段・タ行", "4-row-cons-t" },
{ "五段・ナ行", "5-row-cons-n" },
{ "下二・ハ行", "2-row-lower-cons-h" },
{ "四段・ハ行", "4-row-cons-h" },
{ "四段・バ行", "4-row-cons-b" },
{ "サ変・スル", "irregular-suru" },
{ "上二・ハ行", "2-row-upper-cons-h" },
{ "下二・マ行", "2-row-lower-cons-m" },
{ "四段・サ行", "4-row-cons-s" },
{ "下二・ガ行", "2-row-lower-cons-g" },
{ "カ変・来ル", "kuru-kanji" },
{ "一段・クレル", "1-row-kureru" },
{ "下二・得", "2-row-lower-u" },
{ "カ変・クル", "kuru-kana" },
{ "ラ変", "irregular-cons-r" },
{ "下二・カ行", "2-row-lower-cons-k" },
};
/// <summary>
/// Get the english form of inflection type
/// </summary>
public static string GetInflectionTypeTranslation(string s)
{
string result;
inflTypeTranslations.TryGetValue(s, out result);
return result;
}
// a translation map for inflection forms, only used for reflectWith
private static readonly IDictionary<string, string> inflFormTranslations = new Dictionary<string, string>(StringComparer.Ordinal)
{
{ "*", "*" },
{ "基本形", "base" },
{ "文語基本形", "classical-base" },
{ "未然ヌ接続", "imperfective-nu-connection" },
{ "未然ウ接続", "imperfective-u-connection" },
{ "連用タ接続", "conjunctive-ta-connection" },
{ "連用テ接続", "conjunctive-te-connection" },
{ "連用ゴザイ接続", "conjunctive-gozai-connection" },
{ "体言接続", "uninflected-connection" },
{ "仮定形", "subjunctive" },
{ "命令e", "imperative-e" },
{ "仮定縮約1", "conditional-contracted-1" },
{ "仮定縮約2", "conditional-contracted-2" },
{ "ガル接続", "garu-connection" },
{ "未然形", "imperfective" },
{ "連用形", "conjunctive" },
{ "音便基本形", "onbin-base" },
{ "連用デ接続", "conjunctive-de-connection" },
{ "未然特殊", "imperfective-special" },
{ "命令i", "imperative-i" },
{ "連用ニ接続", "conjunctive-ni-connection" },
{ "命令yo", "imperative-yo" },
{ "体言接続特殊", "adnominal-special" },
{ "命令ro", "imperative-ro" },
{ "体言接続特殊2", "uninflected-special-connection-2" },
{ "未然レル接続", "imperfective-reru-connection" },
{ "現代基本形", "modern-base" },
{ "基本形-促音便", "base-onbin" }, // not sure about this
};
/// <summary>
/// Get the english form of inflected form
/// </summary>
public static string GetInflectedFormTranslation(string s)
{
string result;
inflFormTranslations.TryGetValue(s, out result);
return result;
}
/// <summary>
/// Romanize katakana with modified hepburn
/// </summary>
public static string GetRomanization(string s)
{
StringBuilder result = new StringBuilder();
try
{
GetRomanization(result, s);
}
catch (IOException bogus)
{
throw new Exception(bogus.ToString(), bogus);
}
return result.ToString();
}
/// <summary>
/// Romanize katakana with modified hepburn
/// </summary>
// TODO: now that this is used by readingsfilter and not just for
// debugging, fix this to really be a scheme that works best with IMEs
public static void GetRomanization(StringBuilder builder, string s)
{
int len = s.Length;
for (int i = 0; i < len; i++)
{
// maximum lookahead: 3
char ch = s[i];
char ch2 = (i < len - 1) ? s[i + 1] : (char)0;
char ch3 = (i < len - 2) ? s[i + 2] : (char)0;
//main:
switch (ch)
{
case 'ッ':
switch (ch2)
{
case 'カ':
case 'キ':
case 'ク':
case 'ケ':
case 'コ':
builder.Append('k');
goto break_main;
case 'サ':
case 'シ':
case 'ス':
case 'セ':
case 'ソ':
builder.Append('s');
goto break_main;
case 'タ':
case 'チ':
case 'ツ':
case 'テ':
case 'ト':
builder.Append('t');
goto break_main;
case 'パ':
case 'ピ':
case 'プ':
case 'ペ':
case 'ポ':
builder.Append('p');
goto break_main;
}
break;
case 'ア':
builder.Append('a');
break;
case 'イ':
if (ch2 == 'ィ')
{
builder.Append("yi");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("ye");
i++;
}
else
{
builder.Append('i');
}
break;
case 'ウ':
switch (ch2)
{
case 'ァ':
builder.Append("wa");
i++;
break;
case 'ィ':
builder.Append("wi");
i++;
break;
case 'ゥ':
builder.Append("wu");
i++;
break;
case 'ェ':
builder.Append("we");
i++;
break;
case 'ォ':
builder.Append("wo");
i++;
break;
case 'ュ':
builder.Append("wyu");
i++;
break;
default:
builder.Append('u');
break;
}
break;
case 'エ':
builder.Append('e');
break;
case 'オ':
if (ch2 == 'ウ')
{
builder.Append('ō');
i++;
}
else
{
builder.Append('o');
}
break;
case 'カ':
builder.Append("ka");
break;
case 'キ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("kyō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("kyū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("kya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("kyo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("kyu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("kye");
i++;
}
else
{
builder.Append("ki");
}
break;
case 'ク':
switch (ch2)
{
case 'ァ':
builder.Append("kwa");
i++;
break;
case 'ィ':
builder.Append("kwi");
i++;
break;
case 'ェ':
builder.Append("kwe");
i++;
break;
case 'ォ':
builder.Append("kwo");
i++;
break;
case 'ヮ':
builder.Append("kwa");
i++;
break;
default:
builder.Append("ku");
break;
}
break;
case 'ケ':
builder.Append("ke");
break;
case 'コ':
if (ch2 == 'ウ')
{
builder.Append("kō");
i++;
}
else
{
builder.Append("ko");
}
break;
case 'サ':
builder.Append("sa");
break;
case 'シ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("shō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("shū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("sha");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("sho");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("shu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("she");
i++;
}
else
{
builder.Append("shi");
}
break;
case 'ス':
if (ch2 == 'ィ')
{
builder.Append("si");
i++;
}
else
{
builder.Append("su");
}
break;
case 'セ':
builder.Append("se");
break;
case 'ソ':
if (ch2 == 'ウ')
{
builder.Append("sō");
i++;
}
else
{
builder.Append("so");
}
break;
case 'タ':
builder.Append("ta");
break;
case 'チ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("chō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("chū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("cha");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("cho");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("chu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("che");
i++;
}
else
{
builder.Append("chi");
}
break;
case 'ツ':
if (ch2 == 'ァ')
{
builder.Append("tsa");
i++;
}
else if (ch2 == 'ィ')
{
builder.Append("tsi");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("tse");
i++;
}
else if (ch2 == 'ォ')
{
builder.Append("tso");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("tsyu");
i++;
}
else
{
builder.Append("tsu");
}
break;
case 'テ':
if (ch2 == 'ィ')
{
builder.Append("ti");
i++;
}
else if (ch2 == 'ゥ')
{
builder.Append("tu");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("tyu");
i++;
}
else
{
builder.Append("te");
}
break;
case 'ト':
if (ch2 == 'ウ')
{
builder.Append("tō");
i++;
}
else if (ch2 == 'ゥ')
{
builder.Append("tu");
i++;
}
else
{
builder.Append("to");
}
break;
case 'ナ':
builder.Append("na");
break;
case 'ニ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("nyō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("nyū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("nya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("nyo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("nyu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("nye");
i++;
}
else
{
builder.Append("ni");
}
break;
case 'ヌ':
builder.Append("nu");
break;
case 'ネ':
builder.Append("ne");
break;
case 'ノ':
if (ch2 == 'ウ')
{
builder.Append("nō");
i++;
}
else
{
builder.Append("no");
}
break;
case 'ハ':
builder.Append("ha");
break;
case 'ヒ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("hyō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("hyū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("hya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("hyo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("hyu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("hye");
i++;
}
else
{
builder.Append("hi");
}
break;
case 'フ':
if (ch2 == 'ャ')
{
builder.Append("fya");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("fyu");
i++;
}
else if (ch2 == 'ィ' && ch3 == 'ェ')
{
builder.Append("fye");
i += 2;
}
else if (ch2 == 'ョ')
{
builder.Append("fyo");
i++;
}
else if (ch2 == 'ァ')
{
builder.Append("fa");
i++;
}
else if (ch2 == 'ィ')
{
builder.Append("fi");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("fe");
i++;
}
else if (ch2 == 'ォ')
{
builder.Append("fo");
i++;
}
else
{
builder.Append("fu");
}
break;
case 'ヘ':
builder.Append("he");
break;
case 'ホ':
if (ch2 == 'ウ')
{
builder.Append("hō");
i++;
}
else if (ch2 == 'ゥ')
{
builder.Append("hu");
i++;
}
else
{
builder.Append("ho");
}
break;
case 'マ':
builder.Append("ma");
break;
case 'ミ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("myō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("myū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("mya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("myo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("myu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("mye");
i++;
}
else
{
builder.Append("mi");
}
break;
case 'ム':
builder.Append("mu");
break;
case 'メ':
builder.Append("me");
break;
case 'モ':
if (ch2 == 'ウ')
{
builder.Append("mō");
i++;
}
else
{
builder.Append("mo");
}
break;
case 'ヤ':
builder.Append("ya");
break;
case 'ユ':
builder.Append("yu");
break;
case 'ヨ':
if (ch2 == 'ウ')
{
builder.Append("yō");
i++;
}
else
{
builder.Append("yo");
}
break;
case 'ラ':
if (ch2 == '゜')
{
builder.Append("la");
i++;
}
else
{
builder.Append("ra");
}
break;
case 'リ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("ryō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("ryū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("rya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("ryo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("ryu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("rye");
i++;
}
else if (ch2 == '゜')
{
builder.Append("li");
i++;
}
else
{
builder.Append("ri");
}
break;
case 'ル':
if (ch2 == '゜')
{
builder.Append("lu");
i++;
}
else
{
builder.Append("ru");
}
break;
case 'レ':
if (ch2 == '゜')
{
builder.Append("le");
i++;
}
else
{
builder.Append("re");
}
break;
case 'ロ':
if (ch2 == 'ウ')
{
builder.Append("rō");
i++;
}
else if (ch2 == '゜')
{
builder.Append("lo");
i++;
}
else
{
builder.Append("ro");
}
break;
case 'ワ':
builder.Append("wa");
break;
case 'ヰ':
builder.Append("i");
break;
case 'ヱ':
builder.Append("e");
break;
case 'ヲ':
builder.Append("o");
break;
case 'ン':
switch (ch2)
{
case 'バ':
case 'ビ':
case 'ブ':
case 'ベ':
case 'ボ':
case 'パ':
case 'ピ':
case 'プ':
case 'ペ':
case 'ポ':
case 'マ':
case 'ミ':
case 'ム':
case 'メ':
case 'モ':
builder.Append('m');
goto break_main;
case 'ヤ':
case 'ユ':
case 'ヨ':
case 'ア':
case 'イ':
case 'ウ':
case 'エ':
case 'オ':
builder.Append("n'");
goto break_main;
default:
builder.Append("n");
goto break_main;
}
case 'ガ':
builder.Append("ga");
break;
case 'ギ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("gyō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("gyū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("gya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("gyo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("gyu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("gye");
i++;
}
else
{
builder.Append("gi");
}
break;
case 'グ':
switch (ch2)
{
case 'ァ':
builder.Append("gwa");
i++;
break;
case 'ィ':
builder.Append("gwi");
i++;
break;
case 'ェ':
builder.Append("gwe");
i++;
break;
case 'ォ':
builder.Append("gwo");
i++;
break;
case 'ヮ':
builder.Append("gwa");
i++;
break;
default:
builder.Append("gu");
break;
}
break;
case 'ゲ':
builder.Append("ge");
break;
case 'ゴ':
if (ch2 == 'ウ')
{
builder.Append("gō");
i++;
}
else
{
builder.Append("go");
}
break;
case 'ザ':
builder.Append("za");
break;
case 'ジ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("jō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("jū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("ja");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("jo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("ju");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("je");
i++;
}
else
{
builder.Append("ji");
}
break;
case 'ズ':
if (ch2 == 'ィ')
{
builder.Append("zi");
i++;
}
else
{
builder.Append("zu");
}
break;
case 'ゼ':
builder.Append("ze");
break;
case 'ゾ':
if (ch2 == 'ウ')
{
builder.Append("zō");
i++;
}
else
{
builder.Append("zo");
}
break;
case 'ダ':
builder.Append("da");
break;
case 'ヂ':
// TODO: investigate all this
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("jō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("jū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("ja");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("jo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("ju");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("je");
i++;
}
else
{
builder.Append("ji");
}
break;
case 'ヅ':
builder.Append("zu");
break;
case 'デ':
if (ch2 == 'ィ')
{
builder.Append("di");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("dyu");
i++;
}
else
{
builder.Append("de");
}
break;
case 'ド':
if (ch2 == 'ウ')
{
builder.Append("dō");
i++;
}
else if (ch2 == 'ゥ')
{
builder.Append("du");
i++;
}
else
{
builder.Append("do");
}
break;
case 'バ':
builder.Append("ba");
break;
case 'ビ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("byō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("byū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("bya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("byo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("byu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("bye");
i++;
}
else
{
builder.Append("bi");
}
break;
case 'ブ':
builder.Append("bu");
break;
case 'ベ':
builder.Append("be");
break;
case 'ボ':
if (ch2 == 'ウ')
{
builder.Append("bō");
i++;
}
else
{
builder.Append("bo");
}
break;
case 'パ':
builder.Append("pa");
break;
case 'ピ':
if (ch2 == 'ョ' && ch3 == 'ウ')
{
builder.Append("pyō");
i += 2;
}
else if (ch2 == 'ュ' && ch3 == 'ウ')
{
builder.Append("pyū");
i += 2;
}
else if (ch2 == 'ャ')
{
builder.Append("pya");
i++;
}
else if (ch2 == 'ョ')
{
builder.Append("pyo");
i++;
}
else if (ch2 == 'ュ')
{
builder.Append("pyu");
i++;
}
else if (ch2 == 'ェ')
{
builder.Append("pye");
i++;
}
else
{
builder.Append("pi");
}
break;
case 'プ':
builder.Append("pu");
break;
case 'ペ':
builder.Append("pe");
break;
case 'ポ':
if (ch2 == 'ウ')
{
builder.Append("pō");
i++;
}
else
{
builder.Append("po");
}
break;
case 'ヷ':
builder.Append("va");
break;
case 'ヸ':
builder.Append("vi");
break;
case 'ヹ':
builder.Append("ve");
break;
case 'ヺ':
builder.Append("vo");
break;
case 'ヴ':
if (ch2 == 'ィ' && ch3 == 'ェ')
{
builder.Append("vye");
i += 2;
}
else
{
builder.Append('v');
}
break;
case 'ァ':
builder.Append('a');
break;
case 'ィ':
builder.Append('i');
break;
case 'ゥ':
builder.Append('u');
break;
case 'ェ':
builder.Append('e');
break;
case 'ォ':
builder.Append('o');
break;
case 'ヮ':
builder.Append("wa");
break;
case 'ャ':
builder.Append("ya");
break;
case 'ュ':
builder.Append("yu");
break;
case 'ョ':
builder.Append("yo");
break;
case 'ー':
break;
default:
builder.Append(ch);
break;
}
break_main: { }
}
}
}
}