public static void GetRomanization()

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 */ }
            }
        }