//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); }
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); }
/// <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); }
/// <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); }
/// <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); }
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); } }