Exemplo n.º 1
0
        //TODO: Add clearing up of romanized text, to eliminate spaces before and after //will be done on RomanizationService
        private static async Task <string> GetTransliteration(string text,
                                                              bool useHtml,
                                                              TargetSyllabary to  = TargetSyllabary.Romaji,
                                                              Mode mode           = Mode.Spaced,
                                                              RomajiSystem system = RomajiSystem.Hepburn)
        {
            if (!text.ContainsJapanese() || string.IsNullOrEmpty(text))
            {
                return(text);
            }

            string logString = text.Truncate(30);

            Log(Type.Processing, $"Getting transliteration for '{logString}'");
            Analytics.TrackEvent("Getting transliteration from RomanizationService", new Dictionary <string, string> {
                { "Input", logString },
                { "TargetSyllabary", to.ToString("G") }
            });

            // ReSharper disable InconsistentNaming
            string _to = to switch
            {
                TargetSyllabary.Romaji => "romaji",
                TargetSyllabary.Hiragana => "hiragana",
                TargetSyllabary.Katakana => "katakana",
                _ => ""
            };

            string _mode = mode switch
            {
                Mode.Normal => "normal",
                Mode.Spaced => "spaced",
                Mode.Okurigana => "okurigana",
                Mode.Furigana => "furigana",
                _ => ""
            };

            string _system = system switch
            {
                RomajiSystem.Nippon => "nippon",
                RomajiSystem.Passport => "passport",
                RomajiSystem.Hepburn => "hepburn",
                _ => ""
            };
            // ReSharper restore InconsistentNaming

            string queryParams    = $"?to={_to}&mode={_mode}&romajiSystem={_system}&useHTML={useHtml.ToString().ToLowerInvariant()}";
            string transliterated = await HttpRequests.PostRequest(Globals.RomanizeConvertUrl + queryParams, text);

            return(transliterated);
        }
Exemplo n.º 2
0
        public JapaneseElement(string element, string kataNotation, TextType type, RomajiSystem system = RomajiSystem.Hepburn)
        {
            Element = element;
            Type    = type;

            if (type == TextType.Others)
            {
                KataNotation = kataNotation;
                HiraNotation = kataNotation;
                RomaNotation = kataNotation;
                return;
            }

            KataNotation = kataNotation;
            HiraNotation = Utilities.ToRawHiragana(kataNotation);
            RomaNotation = Utilities.ToRawRomaji(kataNotation, system);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Get the raw result from the word Separator.
        /// </summary>
        /// <param name="str"></param>
        /// <param name="to"></param>
        /// <param name="mode"></param>
        /// <param name="system"></param>
        /// <param name="delimiterStart"></param>
        /// <param name="delimiterEnd"></param>
        /// <returns>List of word divisions</returns>
        public async Task <List <Division> > GetDivisions(
            string str,
            To to                 = To.Hiragana,
            Mode mode             = Mode.Normal,
            RomajiSystem system   = RomajiSystem.Hepburn,
            string delimiterStart = "(",
            string delimiterEnd   = ")")
        {
            var result = await Task.Run(() =>
            {
                var nodes   = _tagger.Parse(str);  // Parse
                var builder = new StringBuilder(); // StringBuilder for the final output string.
                var text    = nodes.Select(node => new Division(node, Utilities.GetTextType(node.Surface), system))
                              .ToList();
                return(text);
            });

            return(result);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Convert the given sentence into chosen form.
        /// </summary>
        /// <param name="str"></param>
        /// <param name="to"></param>
        /// <param name="mode"></param>
        /// <param name="system"></param>
        /// <param name="delimiterStart"></param>
        /// <param name="delimiterEnd"></param>
        /// <returns>Convert result string</returns>
        public async Task <string> Convert(
            string str,
            To to                 = To.Hiragana,
            Mode mode             = Mode.Normal,
            RomajiSystem system   = RomajiSystem.Hepburn,
            string delimiterStart = "(",
            string delimiterEnd   = ")")
        {
            var result = await Task.Run(() =>
            {
                var nodes   = _tagger.Parse(str);  // Parse
                var builder = new StringBuilder(); // StringBuilder for the final output string.
                var text    = nodes.Select(node => new Division(node, Utilities.GetTextType(node.Surface), system))
                              .ToList();
                switch (to)
                {
                case To.Romaji:
                    var isPreviousEndsInTsu = false;
                    switch (mode)
                    {
                    case Mode.Normal:
                        foreach (var division in text)
                        {
                            if (division.IsEndsInTsu)
                            {
                                isPreviousEndsInTsu = true;
                                division.RemoveAt(division.Count - 1);
                                builder.Append(division.RomaReading);
                                continue;
                            }

                            if (isPreviousEndsInTsu)
                            {
                                builder.Append(division.RomaReading.First());
                                isPreviousEndsInTsu = false;
                            }
                            builder.Append(division.RomaReading);
                        }
                        break;

                    case Mode.Spaced:
                        foreach (var division in text)
                        {
                            if (division.IsEndsInTsu)
                            {
                                isPreviousEndsInTsu = true;
                                division.RemoveAt(division.Count - 1);
                                builder.Append(division.RomaReading);
                                continue;
                            }

                            if (isPreviousEndsInTsu)
                            {
                                builder.Append(division.RomaReading.First());
                                isPreviousEndsInTsu = false;
                            }
                            builder.Append(division.RomaReading).Append(" ");
                        }
                        break;

                    case Mode.Okurigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append(ele.Element).Append(delimiterStart).Append(ele.RomaNotation)
                                .Append(delimiterEnd);
                            }
                            else
                            {
                                builder.Append(ele.Element);
                            }
                        }
                        break;

                    case Mode.Furigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append("<ruby>").Append(ele.Element).Append("<rp>")
                                .Append(delimiterStart).Append("</rp>").Append("<rt>")
                                .Append(ele.RomaNotation).Append("</rt>").Append("<rp>")
                                .Append(delimiterEnd).Append("</rp>").Append("</ruby>");
                            }
                            else
                            {
                                if (ele.Element.Last() == 'っ' || ele.Element.Last() == 'ッ')
                                {
                                    builder.Append(ele.Element.Last());
                                    isPreviousEndsInTsu = true;
                                    continue;
                                }

                                if (isPreviousEndsInTsu)
                                {
                                    builder.Append("<ruby>").Append(ele.Element).Append("<rp>")
                                    .Append(delimiterStart).Append("</rp>").Append("<rt>")
                                    .Append(ele.RomaNotation.First())
                                    .Append(ele.RomaNotation).Append("</rt>").Append("<rp>")
                                    .Append(delimiterEnd).Append("</rp>").Append("</ruby>");
                                    isPreviousEndsInTsu = false;
                                    continue;
                                }
                                builder.Append("<ruby>").Append(ele.Element).Append("<rp>")
                                .Append(delimiterStart).Append("</rp>").Append("<rt>")
                                .Append(ele.RomaNotation).Append("</rt>").Append("<rp>")
                                .Append(delimiterEnd).Append("</rp>").Append("</ruby>");
                            }
                        }
                        break;
                    }
                    break;

                case To.Katakana:
                    switch (mode)
                    {
                    case Mode.Normal:
                        foreach (var division in text)
                        {
                            builder.Append(division.KataReading);
                        }
                        break;

                    case Mode.Spaced:
                        foreach (var division in text)
                        {
                            builder.Append(division.KataReading).Append(" ");
                        }
                        break;

                    case Mode.Okurigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append(ele.Element).Append(delimiterStart).Append(ele.KataNotation)
                                .Append(delimiterEnd);
                            }
                            else
                            {
                                builder.Append(ele.Element);
                            }
                        }
                        break;

                    case Mode.Furigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append("<ruby>").Append(ele.Element).Append("<rp>")
                                .Append(delimiterStart).Append("</rp>").Append("<rt>")
                                .Append(ele.KataNotation).Append("</rt>").Append("<rp>")
                                .Append(delimiterEnd).Append("</rp>").Append("</ruby>");
                            }
                            else
                            {
                                builder.Append(ele.Element);
                            }
                        }
                        break;
                    }
                    break;

                case To.Hiragana:
                    switch (mode)
                    {
                    case Mode.Normal:
                        foreach (var division in text)
                        {
                            builder.Append(division.HiraReading);
                        }
                        break;

                    case Mode.Spaced:
                        foreach (var division in text)
                        {
                            builder.Append(division.HiraReading).Append(" ");
                        }
                        break;

                    case Mode.Okurigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append(ele.Element).Append(delimiterStart).Append(ele.HiraNotation)
                                .Append(delimiterEnd);
                            }
                            else
                            {
                                builder.Append(ele.Element);
                            }
                        }
                        break;

                    case Mode.Furigana:
                        foreach (var ele in text.SelectMany(division => division))
                        {
                            if (ele.Type == TextType.PureKanji)
                            {
                                builder.Append("<ruby>").Append(ele.Element).Append("<rp>")
                                .Append(delimiterStart).Append("</rp>").Append("<rt>")
                                .Append(ele.HiraNotation).Append("</rt>").Append("<rp>")
                                .Append(delimiterEnd).Append("</rp>").Append("</ruby>");
                            }
                            else
                            {
                                builder.Append(ele.Element);
                            }
                        }
                        break;
                    }
                    break;
                }

                return(builder.ToString());
            });

            return(result);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Convert the given string to raw romaji form.
        /// </summary>
        /// <param name="str"></param>
        /// <param name="system"></param>
        /// <returns>The romaji form string</returns>
        public static string ToRawRomaji(string str, RomajiSystem system = RomajiSystem.Hepburn)
        {
            var nippon = new Dictionary <string, string>
            {
                // Nums & marks
                { "1", "1" },
                { "2", "2" },
                { "3", "3" },
                { "4", "4" },
                { "5", "5" },
                { "6", "6" },
                { "7", "7" },
                { "8", "8" },
                { "9", "9" },
                { "0", "0" },
                { "!", "!" },
                { "“", "\"" },
                { "”", "\"" },
                { "#", "#" },
                { "$", "$" },
                { "%", "%" },
                { "&", "&" },
                { "’", "\"" },
                { "(", "(" },
                { ")", ")" },
                { "=", "=" },
                { "~", "~" },
                { "|", "|" },
                { "@", "@" },
                { "‘", "`" },
                { "+", "+" },
                { "*", "*" },
                { ";", ";" },
                { ":", ":" },
                { "<", "<" },
                { ">", ">" },
                { "、", "," },
                { "。", "." },
                { "/", "/" },
                { "?", "?" },
                { "_", "_" },
                { "・", "・" },
                { "「", "\"" },
                { "」", "\"" },
                { "{", "{" },
                { "}", "}" },
                { "¥", "\\" },
                { "^", "^" },

                // 直音-清音(ア~ノ)
                { "あ", "a" },
                { "い", "i" },
                { "う", "u" },
                { "え", "e" },
                { "お", "o" },
                { "ア", "a" },
                { "イ", "i" },
                { "ウ", "u" },
                { "エ", "e" },
                { "オ", "o" },

                { "か", "ka" },
                { "き", "ki" },
                { "く", "ku" },
                { "け", "ke" },
                { "こ", "ko" },
                { "カ", "ka" },
                { "キ", "ki" },
                { "ク", "ku" },
                { "ケ", "ke" },
                { "コ", "ko" },

                { "さ", "sa" },
                { "し", "si" },
                { "す", "su" },
                { "せ", "se" },
                { "そ", "so" },
                { "サ", "sa" },
                { "シ", "si" },
                { "ス", "su" },
                { "セ", "se" },
                { "ソ", "so" },

                { "た", "ta" },
                { "ち", "ti" },
                { "つ", "tu" },
                { "て", "te" },
                { "と", "to" },
                { "タ", "ta" },
                { "チ", "ti" },
                { "ツ", "tu" },
                { "テ", "te" },
                { "ト", "to" },

                { "な", "na" },
                { "に", "ni" },
                { "ぬ", "nu" },
                { "ね", "ne" },
                { "の", "no" },
                { "ナ", "na" },
                { "ニ", "ni" },
                { "ヌ", "nu" },
                { "ネ", "ne" },
                { "ノ", "no" },

                // 直音-清音(ハ~ヲ)
                { "は", "ha" },
                { "ひ", "hi" },
                { "ふ", "hu" },
                { "へ", "he" },
                { "ほ", "ho" },
                { "ハ", "ha" },
                { "ヒ", "hi" },
                { "フ", "hu" },
                { "ヘ", "he" },
                { "ホ", "ho" },

                { "ま", "ma" },
                { "み", "mi" },
                { "む", "mu" },
                { "め", "me" },
                { "も", "mo" },
                { "マ", "ma" },
                { "ミ", "mi" },
                { "ム", "mu" },
                { "メ", "me" },
                { "モ", "mo" },

                { "や", "ya" },
                { "ゆ", "yu" },
                { "よ", "yo" },
                { "ヤ", "ya" },
                { "ユ", "yu" },
                { "ヨ", "yo" },

                { "ら", "ra" },
                { "り", "ri" },
                { "る", "ru" },
                { "れ", "re" },
                { "ろ", "ro" },
                { "ラ", "ra" },
                { "リ", "ri" },
                { "ル", "ru" },
                { "レ", "re" },
                { "ロ", "ro" },

                { "わ", "wa" },
                { "ゐ", "wi" },
                { "ゑ", "we" },
                { "を", "wo" },
                { "ワ", "wa" },
                { "ヰ", "wi" },
                { "ヱ", "we" },
                { "ヲ", "wo" },

                // 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
                { "が", "ga" },
                { "ぎ", "gi" },
                { "ぐ", "gu" },
                { "げ", "ge" },
                { "ご", "go" },
                { "ガ", "ga" },
                { "ギ", "gi" },
                { "グ", "gu" },
                { "ゲ", "ge" },
                { "ゴ", "go" },

                { "ざ", "za" },
                { "じ", "zi" },
                { "ず", "zu" },
                { "ぜ", "ze" },
                { "ぞ", "zo" },
                { "ザ", "za" },
                { "ジ", "zi" },
                { "ズ", "zu" },
                { "ゼ", "ze" },
                { "ゾ", "zo" },

                { "だ", "da" },
                { "ぢ", "di" },
                { "づ", "du" },
                { "で", "de" },
                { "ど", "do" },
                { "ダ", "da" },
                { "ヂ", "di" },
                { "ヅ", "du" },
                { "デ", "de" },
                { "ド", "do" },

                { "ば", "ba" },
                { "び", "bi" },
                { "ぶ", "bu" },
                { "べ", "be" },
                { "ぼ", "bo" },
                { "バ", "ba" },
                { "ビ", "bi" },
                { "ブ", "bu" },
                { "ベ", "be" },
                { "ボ", "bo" },

                { "ぱ", "pa" },
                { "ぴ", "pi" },
                { "ぷ", "pu" },
                { "ぺ", "pe" },
                { "ぽ", "po" },
                { "パ", "pa" },
                { "ピ", "pi" },
                { "プ", "pu" },
                { "ペ", "pe" },
                { "ポ", "po" },

                // 拗音-清音(キャ~リョ)
                { "きゃ", "kya" },
                { "きゅ", "kyu" },
                { "きょ", "kyo" },
                { "しゃ", "sya" },
                { "しゅ", "syu" },
                { "しょ", "syo" },
                { "ちゃ", "tya" },
                { "ちゅ", "tyu" },
                { "ちょ", "tyo" },
                { "にゃ", "nya" },
                { "にゅ", "nyu" },
                { "にょ", "nyo" },
                { "ひゃ", "hya" },
                { "ひゅ", "hyu" },
                { "ひょ", "hyo" },
                { "みゃ", "mya" },
                { "みゅ", "myu" },
                { "みょ", "myo" },
                { "りゃ", "rya" },
                { "りゅ", "ryu" },
                { "りょ", "ryo" },
                { "キャ", "kya" },
                { "キュ", "kyu" },
                { "キョ", "kyo" },
                { "シャ", "sya" },
                { "シュ", "syu" },
                { "ショ", "syo" },
                { "チャ", "tya" },
                { "チュ", "tyu" },
                { "チョ", "tyo" },
                { "ニャ", "nya" },
                { "ニュ", "nyu" },
                { "ニョ", "nyo" },
                { "ヒャ", "hya" },
                { "ヒュ", "hyu" },
                { "ヒョ", "hyo" },
                { "ミャ", "mya" },
                { "ミュ", "myu" },
                { "ミョ", "myo" },
                { "リャ", "rya" },
                { "リュ", "ryu" },
                { "リョ", "ryo" },

                // 拗音-濁音(ギャ~ビョ)、半濁音(ピャ~ピョ)、合拗音(クヮ、グヮ)
                { "ぎゃ", "gya" },
                { "ぎゅ", "gyu" },
                { "ぎょ", "gyo" },
                { "じゃ", "zya" },
                { "じゅ", "zyu" },
                { "じょ", "zyo" },
                { "ぢゃ", "dya" },
                { "ぢゅ", "dyu" },
                { "ぢょ", "dyo" },
                { "びゃ", "bya" },
                { "びゅ", "byu" },
                { "びょ", "byo" },
                { "ぴゃ", "pya" },
                { "ぴゅ", "pyu" },
                { "ぴょ", "pyo" },
                { "くゎ", "kwa" },
                { "ぐゎ", "gwa" },
                { "ギャ", "gya" },
                { "ギュ", "gyu" },
                { "ギョ", "gyo" },
                { "ジャ", "zya" },
                { "ジュ", "zyu" },
                { "ジョ", "zyo" },
                { "ヂャ", "dya" },
                { "ヂュ", "dyu" },
                { "ヂョ", "dyo" },
                { "ビャ", "bya" },
                { "ビュ", "byu" },
                { "ビョ", "byo" },
                { "ピャ", "pya" },
                { "ピュ", "pyu" },
                { "ピョ", "pyo" },
                { "クヮ", "kwa" },
                { "グヮ", "gwa" },

                // 小書きの仮名、符号
                { "ぁ", "a" },
                { "ぃ", "i" },
                { "ぅ", "u" },
                { "ぇ", "e" },
                { "ぉ", "o" },
                { "ゃ", "ya" },
                { "ゅ", "yu" },
                { "ょ", "yo" },
                { "ゎ", "wa" },
                { "ァ", "a" },
                { "ィ", "i" },
                { "ゥ", "u" },
                { "ェ", "e" },
                { "ォ", "o" },
                { "ャ", "ya" },
                { "ュ", "yu" },
                { "ョ", "yo" },
                { "ヮ", "wa" },
                { "ヵ", "ka" },
                { "ヶ", "ke" },
                { "ん", "n" },
                { "ン", "n" },
                // ー: "",
                { " ", " " },

                // 外来音(イェ~グォ)
                { "いぇ", "ye" },
                // うぃ: "",
                // うぇ: "",
                // うぉ: "",
                { "きぇ", "kye" },
                // くぁ: "",
                { "くぃ", "kwi" },
                { "くぇ", "kwe" },
                { "くぉ", "kwo" },
                // ぐぁ: "",
                { "ぐぃ", "gwi" },
                { "ぐぇ", "gwe" },
                { "ぐぉ", "gwo" },
                { "イェ", "ye" },
                // ウィ: "",
                // ウェ: "",
                // ウォ: "",
                // ヴ: "",
                // ヴァ: "",
                // ヴィ: "",
                // ヴェ: "",
                // ヴォ: "",
                // ヴュ: "",
                // ヴョ: "",
                { "キェ", "kya" },
                // クァ: "",
                { "クィ", "kwi" },
                { "クェ", "kwe" },
                { "クォ", "kwo" },
                // グァ: "",
                { "グィ", "gwi" },
                { "グェ", "gwe" },
                { "グォ", "gwo" },

                // 外来音(シェ~フョ)
                { "しぇ", "sye" },
                { "じぇ", "zye" },
                { "すぃ", "swi" },
                { "ずぃ", "zwi" },
                { "ちぇ", "tye" },
                { "つぁ", "twa" },
                { "つぃ", "twi" },
                { "つぇ", "twe" },
                { "つぉ", "two" },
                // てぃ: "ti",
                // てゅ: "tyu",
                // でぃ: "di",
                // でゅ: "dyu",
                // とぅ: "tu",
                // どぅ: "du",
                { "にぇ", "nye" },
                { "ひぇ", "hye" },
                { "ふぁ", "hwa" },
                { "ふぃ", "hwi" },
                { "ふぇ", "hwe" },
                { "ふぉ", "hwo" },
                { "ふゅ", "hwyu" },
                { "ふょ", "hwyo" },
                { "シェ", "sye" },
                { "ジェ", "zye" },
                { "スィ", "swi" },
                { "ズィ", "zwi" },
                { "チェ", "tye" },
                { "ツァ", "twa" },
                { "ツィ", "twi" },
                { "ツェ", "twe" },
                { "ツォ", "two" },
                // ティ: "ti",
                // テュ: "tyu",
                // ディ: "di",
                // デュ: "dyu",
                // トゥ: "tu",
                // ドゥ: "du",
                { "ニェ", "nye" },
                { "ヒェ", "hye" },
                { "ファ", "hwa" },
                { "フィ", "hwi" },
                { "フェ", "hwe" },
                { "フォ", "hwo" },
                { "フュ", "hwyu" },
                { "フョ", "hwyo" }
            };
            var passport = new Dictionary <string, string>
            {
                // Nums & marks
                { "1", "1" },
                { "2", "2" },
                { "3", "3" },
                { "4", "4" },
                { "5", "5" },
                { "6", "6" },
                { "7", "7" },
                { "8", "8" },
                { "9", "9" },
                { "0", "0" },
                { "!", "!" },
                { "“", "\"" },
                { "”", "\"" },
                { "#", "#" },
                { "$", "$" },
                { "%", "%" },
                { "&", "&" },
                { "’", "\"" },
                { "(", "(" },
                { ")", ")" },
                { "=", "=" },
                { "~", "~" },
                { "|", "|" },
                { "@", "@" },
                { "‘", "`" },
                { "+", "+" },
                { "*", "*" },
                { ";", ";" },
                { ":", ":" },
                { "<", "<" },
                { ">", ">" },
                { "、", "," },
                { "。", "." },
                { "/", "/" },
                { "?", "?" },
                { "_", "_" },
                { "・", "・" },
                { "「", "\"" },
                { "」", "\"" },
                { "{", "{" },
                { "}", "}" },
                { "¥", "\\" },
                { "^", "^" },

                // 直音-清音(ア~ノ)
                { "あ", "a" },
                { "い", "i" },
                { "う", "u" },
                { "え", "e" },
                { "お", "o" },
                { "ア", "a" },
                { "イ", "i" },
                { "ウ", "u" },
                { "エ", "e" },
                { "オ", "o" },

                { "か", "ka" },
                { "き", "ki" },
                { "く", "ku" },
                { "け", "ke" },
                { "こ", "ko" },
                { "カ", "ka" },
                { "キ", "ki" },
                { "ク", "ku" },
                { "ケ", "ke" },
                { "コ", "ko" },

                { "さ", "sa" },
                { "し", "shi" },
                { "す", "su" },
                { "せ", "se" },
                { "そ", "so" },
                { "サ", "sa" },
                { "シ", "shi" },
                { "ス", "su" },
                { "セ", "se" },
                { "ソ", "so" },

                { "た", "ta" },
                { "ち", "chi" },
                { "つ", "tsu" },
                { "て", "te" },
                { "と", "to" },
                { "タ", "ta" },
                { "チ", "chi" },
                { "ツ", "tsu" },
                { "テ", "te" },
                { "ト", "to" },

                { "な", "na" },
                { "に", "ni" },
                { "ぬ", "nu" },
                { "ね", "ne" },
                { "の", "no" },
                { "ナ", "na" },
                { "ニ", "ni" },
                { "ヌ", "nu" },
                { "ネ", "ne" },
                { "ノ", "no" },

                // 直音-清音(ハ~ヲ)
                { "は", "ha" },
                { "ひ", "hi" },
                { "ふ", "fu" },
                { "へ", "he" },
                { "ほ", "ho" },
                { "ハ", "ha" },
                { "ヒ", "hi" },
                { "フ", "fu" },
                { "ヘ", "he" },
                { "ホ", "ho" },

                { "ま", "ma" },
                { "み", "mi" },
                { "む", "mu" },
                { "め", "me" },
                { "も", "mo" },
                { "マ", "ma" },
                { "ミ", "mi" },
                { "ム", "mu" },
                { "メ", "me" },
                { "モ", "mo" },

                { "や", "ya" },
                { "ゆ", "yu" },
                { "よ", "yo" },
                { "ヤ", "ya" },
                { "ユ", "yu" },
                { "ヨ", "yo" },

                { "ら", "ra" },
                { "り", "ri" },
                { "る", "ru" },
                { "れ", "re" },
                { "ろ", "ro" },
                { "ラ", "ra" },
                { "リ", "ri" },
                { "ル", "ru" },
                { "レ", "re" },
                { "ロ", "ro" },

                { "わ", "wa" },
                { "ゐ", "i" },
                { "ゑ", "e" },
                { "を", "o" },
                { "ワ", "wa" },
                { "ヰ", "i" },
                { "ヱ", "e" },
                { "ヲ", "o" },

                // 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
                { "が", "ga" },
                { "ぎ", "gi" },
                { "ぐ", "gu" },
                { "げ", "ge" },
                { "ご", "go" },
                { "ガ", "ga" },
                { "ギ", "gi" },
                { "グ", "gu" },
                { "ゲ", "ge" },
                { "ゴ", "go" },

                { "ざ", "za" },
                { "じ", "ji" },
                { "ず", "zu" },
                { "ぜ", "ze" },
                { "ぞ", "zo" },
                { "ザ", "za" },
                { "ジ", "ji" },
                { "ズ", "zu" },
                { "ゼ", "ze" },
                { "ゾ", "zo" },

                { "だ", "da" },
                { "ぢ", "ji" },
                { "づ", "zu" },
                { "で", "de" },
                { "ど", "do" },
                { "ダ", "da" },
                { "ヂ", "ji" },
                { "ヅ", "zu" },
                { "デ", "de" },
                { "ド", "do" },

                { "ば", "ba" },
                { "び", "bi" },
                { "ぶ", "bu" },
                { "べ", "be" },
                { "ぼ", "bo" },
                { "バ", "ba" },
                { "ビ", "bi" },
                { "ブ", "bu" },
                { "ベ", "be" },
                { "ボ", "bo" },

                { "ぱ", "pa" },
                { "ぴ", "pi" },
                { "ぷ", "pu" },
                { "ぺ", "pe" },
                { "ぽ", "po" },
                { "パ", "pa" },
                { "ピ", "pi" },
                { "プ", "pu" },
                { "ペ", "pe" },
                { "ポ", "po" },

                // 拗音-清音(キャ~リョ)
                { "きゃ", "kya" },
                { "きゅ", "kyu" },
                { "きょ", "kyo" },
                { "しゃ", "sha" },
                { "しゅ", "shu" },
                { "しょ", "sho" },
                { "ちゃ", "cha" },
                { "ちゅ", "chu" },
                { "ちょ", "cho" },
                { "にゃ", "nya" },
                { "にゅ", "nyu" },
                { "にょ", "nyo" },
                { "ひゃ", "hya" },
                { "ひゅ", "hyu" },
                { "ひょ", "hyo" },
                { "みゃ", "mya" },
                { "みゅ", "myu" },
                { "みょ", "myo" },
                { "りゃ", "rya" },
                { "りゅ", "ryu" },
                { "りょ", "ryo" },
                { "キャ", "kya" },
                { "キュ", "kyu" },
                { "キョ", "kyo" },
                { "シャ", "sha" },
                { "シュ", "shu" },
                { "ショ", "sho" },
                { "チャ", "cha" },
                { "チュ", "chu" },
                { "チョ", "cho" },
                { "ニャ", "nya" },
                { "ニュ", "nyu" },
                { "ニョ", "nyo" },
                { "ヒャ", "hya" },
                { "ヒュ", "hyu" },
                { "ヒョ", "hyo" },
                { "ミャ", "mya" },
                { "ミュ", "myu" },
                { "ミョ", "myo" },
                { "リャ", "rya" },
                { "リュ", "ryu" },
                { "リョ", "ryo" },

                // 拗音-濁音(ギャ~ビョ)、半濁音(ピャ~ピョ)、合拗音(クヮ、グヮ)
                { "ぎゃ", "gya" },
                { "ぎゅ", "gyu" },
                { "ぎょ", "gyo" },
                { "じゃ", "ja" },
                { "じゅ", "ju" },
                { "じょ", "jo" },
                { "ぢゃ", "ja" },
                { "ぢゅ", "ju" },
                { "ぢょ", "jo" },
                { "びゃ", "bya" },
                { "びゅ", "byu" },
                { "びょ", "byo" },
                { "ぴゃ", "pya" },
                { "ぴゅ", "pyu" },
                { "ぴょ", "pyo" },
                // くゎ: "",
                // ぐゎ: "",
                { "ギャ", "gya" },
                { "ギュ", "gyu" },
                { "ギョ", "gyo" },
                { "ジャ", "ja" },
                { "ジュ", "ju" },
                { "ジョ", "jo" },
                { "ヂャ", "ja" },
                { "ヂュ", "ju" },
                { "ヂョ", "jo" },
                { "ビャ", "bya" },
                { "ビュ", "byu" },
                { "ビョ", "byo" },
                { "ピャ", "pya" },
                { "ピュ", "pyu" },
                { "ピョ", "pyo" },
                // クヮ: "",
                // グヮ: "",

                // 小書きの仮名、符号
                { "ぁ", "a" },
                { "ぃ", "i" },
                { "ぅ", "u" },
                { "ぇ", "e" },
                { "ぉ", "o" },
                { "ゃ", "ya" },
                { "ゅ", "yu" },
                { "ょ", "yo" },
                { "ゎ", "wa" },
                { "ァ", "a" },
                { "ィ", "i" },
                { "ゥ", "u" },
                { "ェ", "e" },
                { "ォ", "o" },
                { "ャ", "ya" },
                { "ュ", "yu" },
                { "ョ", "yo" },
                { "ヮ", "wa" },
                { "ヵ", "ka" },
                { "ヶ", "ke" },
                { "ん", "n" },
                { "ン", "n" },
                // ー: "",
                { " ", " " },

                // 外来音(イェ~グォ)
                // いぇ: "",
                // うぃ: "",
                // うぇ: "",
                // うぉ: "",
                // きぇ: "",
                // くぁ: "",
                // くぃ: "",
                // くぇ: "",
                // くぉ: "",
                // ぐぁ: "",
                // ぐぃ: "",
                // ぐぇ: "",
                // ぐぉ: "",
                // イェ: "",
                // ウィ: "",
                // ウェ: "",
                // ウォ: "",
                { "ヴ", "b" }
                // ヴァ: "",
                // ヴィ: "",
                // ヴェ: "",
                // ヴォ: "",
                // ヴュ: "",
                // ヴョ: "",
                // キェ: "",
                // クァ: "",
                // クィ: "",
                // クェ: "",
                // クォ: "",
                // グァ: "",
                // グィ: "",
                // グェ: "",
                // グォ: "",

                // 外来音(シェ~フョ)
                // しぇ: "",
                // じぇ: "",
                // すぃ: "",
                // ずぃ: "",
                // ちぇ: "",
                // つぁ: "",
                // つぃ: "",
                // つぇ: "",
                // つぉ: "",
                // てぃ: "",
                // てゅ: "",
                // でぃ: "",
                // でゅ: "",
                // とぅ: "",
                // どぅ: "",
                // にぇ: "",
                // ひぇ: "",
                // ふぁ: "",
                // ふぃ: "",
                // ふぇ: "",
                // ふぉ: "",
                // ふゅ: "",
                // ふょ: "",
                // シェ: "",
                // ジェ: "",
                // スィ: "",
                // ズィ: "",
                // チェ: "",
                // ツァ: "",
                // ツィ: "",
                // ツェ: "",
                // ツォ: "",
                // ティ: "",
                // テュ: "",
                // ディ: "",
                // デュ: "",
                // トゥ: "",
                // ドゥ: "",
                // ニェ: "",
                // ヒェ: "",
                // ファ: "",
                // フィ: "",
                // フェ: "",
                // フォ: "",
                // フュ: "",
                // フョ: ""
            };
            var hepburn = new Dictionary <string, string>
            {
                // Nums & marks
                { "1", "1" },
                { "2", "2" },
                { "3", "3" },
                { "4", "4" },
                { "5", "5" },
                { "6", "6" },
                { "7", "7" },
                { "8", "8" },
                { "9", "9" },
                { "0", "0" },
                { "!", "!" },
                { "“", "\"" },
                { "”", "\"" },
                { "#", "#" },
                { "$", "$" },
                { "%", "%" },
                { "&", "&" },
                { "’", "\"" },
                { "(", "(" },
                { ")", ")" },
                { "=", "=" },
                { "~", "~" },
                { "|", "|" },
                { "@", "@" },
                { "‘", "`" },
                { "+", "+" },
                { "*", "*" },
                { ";", ";" },
                { ":", ":" },
                { "<", "<" },
                { ">", ">" },
                { "、", "," },
                { "。", "." },
                { "/", "/" },
                { "?", "?" },
                { "_", "_" },
                { "・", "・" },
                { "「", "\"" },
                { "」", "\"" },
                { "{", "{" },
                { "}", "}" },
                { "¥", "\\" },
                { "^", "^" },

                // 直音-清音(ア~ノ)
                { "あ", "a" },
                { "い", "i" },
                { "う", "u" },
                { "え", "e" },
                { "お", "o" },
                { "ア", "a" },
                { "イ", "i" },
                { "ウ", "u" },
                { "エ", "e" },
                { "オ", "o" },

                { "か", "ka" },
                { "き", "ki" },
                { "く", "ku" },
                { "け", "ke" },
                { "こ", "ko" },
                { "カ", "ka" },
                { "キ", "ki" },
                { "ク", "ku" },
                { "ケ", "ke" },
                { "コ", "ko" },

                { "さ", "sa" },
                { "し", "shi" },
                { "す", "su" },
                { "せ", "se" },
                { "そ", "so" },
                { "サ", "sa" },
                { "シ", "shi" },
                { "ス", "su" },
                { "セ", "se" },
                { "ソ", "so" },

                { "た", "ta" },
                { "ち", "chi" },
                { "つ", "tsu" },
                { "て", "te" },
                { "と", "to" },
                { "タ", "ta" },
                { "チ", "chi" },
                { "ツ", "tsu" },
                { "テ", "te" },
                { "ト", "to" },

                { "な", "na" },
                { "に", "ni" },
                { "ぬ", "nu" },
                { "ね", "ne" },
                { "の", "no" },
                { "ナ", "na" },
                { "ニ", "ni" },
                { "ヌ", "nu" },
                { "ネ", "ne" },
                { "ノ", "no" },

                // 直音-清音(ハ~ヲ)
                { "は", "ha" },
                { "ひ", "hi" },
                { "ふ", "fu" },
                { "へ", "he" },
                { "ほ", "ho" },
                { "ハ", "ha" },
                { "ヒ", "hi" },
                { "フ", "fu" },
                { "ヘ", "he" },
                { "ホ", "ho" },

                { "ま", "ma" },
                { "み", "mi" },
                { "む", "mu" },
                { "め", "me" },
                { "も", "mo" },
                { "マ", "ma" },
                { "ミ", "mi" },
                { "ム", "mu" },
                { "メ", "me" },
                { "モ", "mo" },

                { "や", "ya" },
                { "ゆ", "yu" },
                { "よ", "yo" },
                { "ヤ", "ya" },
                { "ユ", "yu" },
                { "ヨ", "yo" },

                { "ら", "ra" },
                { "り", "ri" },
                { "る", "ru" },
                { "れ", "re" },
                { "ろ", "ro" },
                { "ラ", "ra" },
                { "リ", "ri" },
                { "ル", "ru" },
                { "レ", "re" },
                { "ロ", "ro" },

                { "わ", "wa" },
                { "ゐ", "i" },
                { "ゑ", "e" },
                { "を", "o" },
                { "ワ", "wa" },
                { "ヰ", "i" },
                { "ヱ", "e" },
                { "ヲ", "o" },

                // 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
                { "が", "ga" },
                { "ぎ", "gi" },
                { "ぐ", "gu" },
                { "げ", "ge" },
                { "ご", "go" },
                { "ガ", "ga" },
                { "ギ", "gi" },
                { "グ", "gu" },
                { "ゲ", "ge" },
                { "ゴ", "go" },

                { "ざ", "za" },
                { "じ", "ji" },
                { "ず", "zu" },
                { "ぜ", "ze" },
                { "ぞ", "zo" },
                { "ザ", "za" },
                { "ジ", "ji" },
                { "ズ", "zu" },
                { "ゼ", "ze" },
                { "ゾ", "zo" },

                { "だ", "da" },
                { "ぢ", "ji" },
                { "づ", "zu" },
                { "で", "de" },
                { "ど", "do" },
                { "ダ", "da" },
                { "ヂ", "ji" },
                { "ヅ", "zu" },
                { "デ", "de" },
                { "ド", "do" },

                { "ば", "ba" },
                { "び", "bi" },
                { "ぶ", "bu" },
                { "べ", "be" },
                { "ぼ", "bo" },
                { "バ", "ba" },
                { "ビ", "bi" },
                { "ブ", "bu" },
                { "ベ", "be" },
                { "ボ", "bo" },

                { "ぱ", "pa" },
                { "ぴ", "pi" },
                { "ぷ", "pu" },
                { "ぺ", "pe" },
                { "ぽ", "po" },
                { "パ", "pa" },
                { "ピ", "pi" },
                { "プ", "pu" },
                { "ペ", "pe" },
                { "ポ", "po" },

                // 拗音-清音(キャ~リョ)
                { "きゃ", "kya" },
                { "きゅ", "kyu" },
                { "きょ", "kyo" },
                { "しゃ", "sha" },
                { "しゅ", "shu" },
                { "しょ", "sho" },
                { "ちゃ", "cha" },
                { "ちゅ", "chu" },
                { "ちょ", "cho" },
                { "にゃ", "nya" },
                { "にゅ", "nyu" },
                { "にょ", "nyo" },
                { "ひゃ", "hya" },
                { "ひゅ", "hyu" },
                { "ひょ", "hyo" },
                { "みゃ", "mya" },
                { "みゅ", "myu" },
                { "みょ", "myo" },
                { "りゃ", "rya" },
                { "りゅ", "ryu" },
                { "りょ", "ryo" },
                { "キャ", "kya" },
                { "キュ", "kyu" },
                { "キョ", "kyo" },
                { "シャ", "sha" },
                { "シュ", "shu" },
                { "ショ", "sho" },
                { "チャ", "cha" },
                { "チュ", "chu" },
                { "チョ", "cho" },
                { "ニャ", "nya" },
                { "ニュ", "nyu" },
                { "ニョ", "nyo" },
                { "ヒャ", "hya" },
                { "ヒュ", "hyu" },
                { "ヒョ", "hyo" },
                { "ミャ", "mya" },
                { "ミュ", "myu" },
                { "ミョ", "myo" },
                { "リャ", "rya" },
                { "リュ", "ryu" },
                { "リョ", "ryo" },

                // 拗音-濁音(ギャ~ビョ)、半濁音(ピャ~ピョ)、合拗音(クヮ、グヮ)
                { "ぎゃ", "gya" },
                { "ぎゅ", "gyu" },
                { "ぎょ", "gyo" },
                { "じゃ", "ja" },
                { "じゅ", "ju" },
                { "じょ", "jo" },
                { "ぢゃ", "ja" },
                { "ぢゅ", "ju" },
                { "ぢょ", "jo" },
                { "びゃ", "bya" },
                { "びゅ", "byu" },
                { "びょ", "byo" },
                { "ぴゃ", "pya" },
                { "ぴゅ", "pyu" },
                { "ぴょ", "pyo" },
                // くゎ: "",
                // ぐゎ: "",
                { "ギャ", "gya" },
                { "ギュ", "gyu" },
                { "ギョ", "gyo" },
                { "ジャ", "ja" },
                { "ジュ", "ju" },
                { "ジョ", "jo" },
                { "ヂャ", "ja" },
                { "ヂュ", "ju" },
                { "ヂョ", "jo" },
                { "ビャ", "bya" },
                { "ビュ", "byu" },
                { "ビョ", "byo" },
                { "ピャ", "pya" },
                { "ピュ", "pyu" },
                { "ピョ", "pyo" },
                // クヮ: "",
                // グヮ: "",

                // 小書きの仮名、符号
                { "ぁ", "a" },
                { "ぃ", "i" },
                { "ぅ", "u" },
                { "ぇ", "e" },
                { "ぉ", "o" },
                { "ゃ", "ya" },
                { "ゅ", "yu" },
                { "ょ", "yo" },
                { "ゎ", "wa" },
                { "ァ", "a" },
                { "ィ", "i" },
                { "ゥ", "u" },
                { "ェ", "e" },
                { "ォ", "o" },
                { "ャ", "ya" },
                { "ュ", "yu" },
                { "ョ", "yo" },
                { "ヮ", "wa" },
                { "ヵ", "ka" },
                { "ヶ", "ke" },
                { "ん", "n" },
                { "ン", "n" },
                // ー: "",
                { " ", " " },

                // 外来音(イェ~グォ)
                { "いぇ", "ye" },
                { "うぃ", "wi" },
                { "うぇ", "we" },
                { "うぉ", "wo" },
                { "きぇ", "kye" },
                { "くぁ", "kwa" },
                { "くぃ", "kwi" },
                { "くぇ", "kwe" },
                { "くぉ", "kwo" },
                { "ぐぁ", "gwa" },
                { "ぐぃ", "gwi" },
                { "ぐぇ", "gwe" },
                { "ぐぉ", "gwo" },
                { "イェ", "ye" },
                { "ウィ", "wi" },
                { "ウェ", "we" },
                { "ウォ", "wo" },
                { "ヴ", "vu" },
                { "ヴァ", "va" },
                { "ヴィ", "vi" },
                { "ヴェ", "ve" },
                { "ヴォ", "vo" },
                { "ヴュ", "vyu" },
                { "ヴョ", "vyo" },
                { "キェ", "kya" },
                { "クァ", "kwa" },
                { "クィ", "kwi" },
                { "クェ", "kwe" },
                { "クォ", "kwo" },
                { "グァ", "gwa" },
                { "グィ", "gwi" },
                { "グェ", "gwe" },
                { "グォ", "gwo" },

                // 外来音(シェ~フョ)
                { "しぇ", "she" },
                { "じぇ", "je" },
                // すぃ: "",
                // ずぃ: "",
                { "ちぇ", "che" },
                { "つぁ", "tsa" },
                { "つぃ", "tsi" },
                { "つぇ", "tse" },
                { "つぉ", "tso" },
                { "てぃ", "ti" },
                { "てゅ", "tyu" },
                { "でぃ", "di" },
                { "でゅ", "dyu" },
                { "とぅ", "tu" },
                { "どぅ", "du" },
                { "にぇ", "nye" },
                { "ひぇ", "hye" },
                { "ふぁ", "fa" },
                { "ふぃ", "fi" },
                { "ふぇ", "fe" },
                { "ふぉ", "fo" },
                { "ふゅ", "fyu" },
                { "ふょ", "fyo" },
                { "シェ", "she" },
                { "ジェ", "je" },
                // スィ: "",
                // ズィ: "",
                { "チェ", "che" },
                { "ツァ", "tsa" },
                { "ツィ", "tsi" },
                { "ツェ", "tse" },
                { "ツォ", "tso" },
                { "ティ", "ti" },
                { "テュ", "tyu" },
                { "ディ", "di" },
                { "デュ", "dyu" },
                { "トゥ", "tu" },
                { "ドゥ", "du" },
                { "ニェ", "nye" },
                { "ヒェ", "hye" },
                { "ファ", "fa" },
                { "フィ", "fi" },
                { "フェ", "fe" },
                { "フォ", "fo" },
                { "フュ", "fyu" },
                { "フョ", "fyo" }
            };

            var romajiSystem = new Dictionary <RomajiSystem, Dictionary <string, string> >()
            {
                { RomajiSystem.Hepburn, hepburn },
                { RomajiSystem.Nippon, nippon },
                { RomajiSystem.Passport, passport }
            };

            var regTsu  = new Regex(@"(っ|ッ)([bcdfghijklmnopqrstuvwyz])", RegexOptions.Multiline); // Double the sokuon
            var regXtsu = new Regex(@"っ|ッ", RegexOptions.Multiline);

            var pnt     = 0;
            var builder = new StringBuilder();

            switch (system)
            {
            // [PASSPORT] 長音省略 「―」の場合
            case RomajiSystem.Passport:
                str = str.Replace("ー", "");
                break;

            // [NIPPON|HEPBURN] 撥音の特殊表記 a、i、u、e、o、y
            case RomajiSystem.Nippon:
            case RomajiSystem.Hepburn:
            {
                var regHatu = new Regex(@"(ん|ン)(?=あ|い|う|え|お|ア|イ|ウ|エ|オ|ぁ|ぃ|ぅ|ぇ|ぉ|ァ|ィ|ゥ|ェ|ォ|や|ゆ|よ|ヤ|ユ|ヨ|ゃ|ゅ|ょ|ャ|ュ|ョ)", RegexOptions.Multiline);
                var matches = regHatu.Matches(str);
                var indices = new List <int>();
                foreach (Match item in matches)
                {
                    indices.Add(item.Index);
                }
                if (indices.Count != 0)
                {
                    var mStr = "";
                    for (var i = 0; i < indices.Count; i++)
                    {
                        if (i == 0)
                        {
                            mStr += $"{str.Substring(0, indices[i])}'";
                        }
                        else
                        {
                            mStr += $"{str.Substring(indices[i - 1], indices[i] - indices[i - 1])}'";
                        }
                    }
                    mStr += str.Substring(indices[indices.Count - 1]);
                    str   = mStr;
                }

                break;
            }
            }

            // [ALL] kana to roman chars
            var max = str.Length;

            while (pnt < max)
            {
                string r;
                if (pnt != max - 1 && romajiSystem[system].ContainsKey(str.Substring(pnt, 2)))
                {
                    r = romajiSystem[system][str.Substring(pnt, 2)];
                    builder.Append(r);
                    pnt += 2;
                }
                else if (romajiSystem[system].ContainsKey(str.Substring(pnt, 1)))
                {
                    r = romajiSystem[system][str.Substring(pnt, 1)];
                    builder.Append(r);
                    pnt += 1;
                }
                else
                {
                    var ch = str.Substring(pnt, 1);
                    builder.Append(ch);
                    pnt += 1;
                }
            }

            var result = regTsu.Replace(builder.ToString(), "$2$2"); // Double the sokuon

            // [PASSPORT|HEPBURN] 子音を重ねて特殊表記
            if (system == RomajiSystem.Passport || system == RomajiSystem.Hepburn)
            {
                result = result.Replace("cc", "tc");
            }

            result = regXtsu.Replace(result, "tsu");

            // [PASSPORT|HEPBURN] 撥音の特殊表記 b、m、p
            if (system == RomajiSystem.Passport || system == RomajiSystem.Hepburn)
            {
                result = result.Replace("nm", "mm");
                result = result.Replace("nb", "mb");
                result = result.Replace("np", "mp");
            }

            // [NIPPON] 長音変換
            if (system == RomajiSystem.Nippon)
            {
                result = result.Replace("aー", "â");
                result = result.Replace("iー", "î");
                result = result.Replace("uー", "û");
                result = result.Replace("eー", "ê");
                result = result.Replace("oー", "ô");
            }

            // [HEPBURN] 長音変換
            if (system == RomajiSystem.Hepburn)
            {
                result = result.Replace("aー", "ā");
                result = result.Replace("iー", "ī");
                result = result.Replace("uー", "ū");
                result = result.Replace("eー", "ē");
                result = result.Replace("oー", "ō");
            }

            return(result);
        }
Exemplo n.º 6
0
        public Division(MeCabIpaDicNode node, TextType type, RomajiSystem system = RomajiSystem.Hepburn)
        {
            IsEndsInTsu = node.Surface.Last() == 'っ' || node.Surface.Last() == 'ッ';

            switch (type)
            {
            case TextType.PureKana:
                if (node.Surface.Length == node.Pronounciation.Length)
                {
                    for (var i = 0; i < node.Surface.Length; i++)
                    {
                        Add(new JapaneseElement(node.Surface[i].ToString(), Utilities.ToRawKatakana(node.Surface[i].ToString()), node.Pronounciation[i].ToString(), TextType.PureKana, system));
                    }
                }
                else
                {
                    for (var i = 0; i < node.Surface.Length; i++)
                    {
                        var surface = Utilities.ToRawKatakana(node.Surface[i].ToString());
                        Add(new JapaneseElement(node.Surface[i].ToString(), surface, surface, TextType.PureKana, system));
                    }
                }
                break;

            case TextType.PureKanji:
                Add(new JapaneseElement(node.Surface, node.Reading, node.Pronounciation, TextType.PureKanji, system));
                break;

            case TextType.KanjiKanaMixed:
                var surfaceBuilder       = new StringBuilder(node.Surface);
                var readingBuilder       = new StringBuilder(node.Reading);
                var pronunciationBuilder = new StringBuilder(node.Pronounciation);
                var kanasInTheEnd        = new StringBuilder();
                while (Utilities.IsKana(surfaceBuilder[0]))     // Pop the kanas in the front.
                {
                    Add(new JapaneseElement(surfaceBuilder[0].ToString(), Utilities.ToRawKatakana(surfaceBuilder[0].ToString()), pronunciationBuilder[0].ToString(), TextType.PureKana, system));
                    surfaceBuilder.Remove(0, 1);
                    readingBuilder.Remove(0, 1);
                    pronunciationBuilder.Remove(0, 1);
                }

                while (Utilities.IsKana(surfaceBuilder[surfaceBuilder.Length - 1]))     // Pop the kanas in the end.
                {
                    kanasInTheEnd.Append(surfaceBuilder[surfaceBuilder.Length - 1].ToString());
                    surfaceBuilder.Remove(surfaceBuilder.Length - 1, 1);
                    readingBuilder.Remove(readingBuilder.Length - 1, 1);
                    pronunciationBuilder.Remove(pronunciationBuilder.Length - 1, 1);
                }

                if (Utilities.HasKana(surfaceBuilder.ToString()))     // For the middle part:
                {
                    var previousIndex = -1;
                    var kanaIndex     = 0;

                    var kanas = from ele in surfaceBuilder.ToString()
                                where Utilities.IsKana(ele)
                                select ele;

                    var kanaList = kanas.ToList();

                    foreach (var ch in surfaceBuilder.ToString())
                    {
                        if (Utilities.IsKanji(ch))
                        {
                            if (kanaIndex >= kanaList.Count)
                            {
                                Add(new JapaneseElement(ch.ToString(), readingBuilder.ToString(previousIndex + 1, readingBuilder.Length - previousIndex - 1), pronunciationBuilder.ToString(previousIndex + 1, readingBuilder.Length - previousIndex - 1), TextType.PureKanji, system));
                                continue;
                            }

                            var index = readingBuilder.ToString()
                                        .IndexOf(Utilities.ToRawKatakana(kanaList[kanaIndex].ToString()), StringComparison.Ordinal);

                            Add(new JapaneseElement(ch.ToString(), readingBuilder.ToString(previousIndex + 1, index - previousIndex - 1), pronunciationBuilder.ToString(previousIndex + 1, index - previousIndex - 1), TextType.PureKanji, system));
                            previousIndex = index;
                            kanaIndex++;
                        }

                        if (Utilities.IsKana(ch))
                        {
                            var kana = Utilities.ToRawKatakana(ch.ToString());
                            Add(new JapaneseElement(ch.ToString(), kana, kana, TextType.PureKana, system));
                        }
                    }
                }

                else
                {
                    Add(new JapaneseElement(surfaceBuilder.ToString(), readingBuilder.ToString(), pronunciationBuilder.ToString(), TextType.PureKanji, system));
                }

                if (kanasInTheEnd.Length != 0)
                {
                    for (var i = kanasInTheEnd.Length - 1; i >= 0; i--)
                    {
                        var kana = Utilities.ToRawKatakana(kanasInTheEnd.ToString()[i].ToString());
                        Add(new JapaneseElement(kanasInTheEnd.ToString()[i].ToString(), kana, kana, TextType.PureKana, system));
                    }
                }
                break;

            case TextType.Others:
                Add(new JapaneseElement(node.Surface, node.Surface, node.Pronounciation, TextType.Others, system));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }
        }