in src/Lucene.Net.Analysis.Kuromoji/Util/ToStringUtil.cs [273:1396]
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: { /* LUCENENET: intentionally empty */ }
}
}