public void IsVowelRecognizesVowels() { foreach (var vowel in CharacterRanges.Vowels) { Assert.True(SpecialCharacterChecker.IsVowel(vowel)); } }
public static string ToKatakana(string input, WanaKanaOptions?options = null) { if (input is null) { throw new ArgumentNullException(nameof(input)); } options ??= new WanaKanaOptions(); if (input.Length == 0) { return(string.Empty); } if (options.PassRomaji) { return(KanaConverters.HiraganaToKatakana(input)); } if (MixedChecker.IsMixed(input) || RomajiChecker.IsRomaji(input) || SpecialCharacterChecker.IsEnglishPunctuation(input[0])) { var hiragana = KanaConverters.ToKana(input.ToLowerInvariant(), options); return(KanaConverters.HiraganaToKatakana(hiragana)); } return(KanaConverters.HiraganaToKatakana(input)); }
public void IsConsonantRecognizesConsonants() { foreach (var consonant in CharacterRanges.Consonants) { Assert.True(SpecialCharacterChecker.IsConsonant(consonant)); } }
public static string HiraganaToKatakana(string input) { if (input is null) { throw new ArgumentNullException(nameof(input)); } var builder = new StringBuilder(); foreach (var character in input) { // Short circuit to avoid incorrect codeshift for 'ー' and '・' if (SpecialCharacterChecker.IsLongDash(character) || SpecialCharacterChecker.IsSlashDot(character)) { builder.Append(character); } else if (HiraganaChecker.IsHiragana(character)) { // Shift charcode. var katakanaCode = (character - CharacterRanges.HiraganaStart) + CharacterRanges.KatakanaStart; var katakanaCharacter = (char)katakanaCode; builder.Append(katakanaCharacter); } else { // Pass non-hiragana chars through builder.Append(character); } } return(builder.ToString()); }
public void IsJapanesePunctuationAllJapanesePunctuationsAreRecognized() { foreach (var range in CharacterRanges.JapanesePunctuationRanges) { for (char character = range.Start; character <= range.End; character++) { Assert.True(SpecialCharacterChecker.IsJapanesePunctuation(character)); } } }
public void IsEnglishPunctuationAllJapanesePunctuationsAreInvalid() { foreach (var range in CharacterRanges.JapanesePunctuationRanges) { for (char character = range.Start; character <= range.End; character++) { Assert.False(SpecialCharacterChecker.IsEnglishPunctuation(character)); } } }
public static string KatakanaToHiragana(string input, bool isDestinationRomaji = false) { if (input is null) { throw new ArgumentNullException(nameof(input)); } char?previousKana = null; var builder = new StringBuilder(); for (int index = 0; index < input.Length; index++) { var character = input[index]; // Short circuit to avoid incorrect codeshift for 'ー' and '・' if (SpecialCharacterChecker.IsSlashDot(character) || IsInitialLongDash(character, index) || IsKanaAsSymbol(character)) { builder.Append(character); // Transform long vowels: 'オー' to 'おう' } else if (previousKana != null && IsInnerLongDash(character, index)) { // Transform previousKana back to romaji, and slice off the vowel var romaji = RomajiConverter.ToRomaji(previousKana.ToString()).Last(); // However, ensure 'オー' => 'おお' => 'oo' if this is a transform on the way to romaji if (KatakanaChecker.IsKatakana(input[index - 1]) && romaji == 'o' && isDestinationRomaji) { builder.Append('お'); } else { builder.Append(_longVowels[romaji]); } } else if (!SpecialCharacterChecker.IsLongDash(character) && KatakanaChecker.IsKatakana(character)) { // Shift charcode. var hiraganaCode = (character - CharacterRanges.KatakanaStart) + CharacterRanges.HiraganaStart; var hiragana = (char)hiraganaCode; previousKana = hiragana; builder.Append(hiragana); } else { // Pass non katakana chars through previousKana = null; builder.Append(character); } } return(builder.ToString()); }
public void IsConsonantExcludingY() { Assert.False(SpecialCharacterChecker.IsConsonant('y', false)); }
public void IsEnglishPunctuationVarious(char character, bool expectedResult) { Assert.Equal(expectedResult, SpecialCharacterChecker.IsEnglishPunctuation(character)); }
public void IsVowelInvalidCases(char character) { Assert.False(SpecialCharacterChecker.IsVowel(character)); }
public void IsVowelExcludingY() { Assert.False(SpecialCharacterChecker.IsVowel('y', false)); }
public void IsConsonantInvalidCases(char character) { Assert.False(SpecialCharacterChecker.IsConsonant(character)); }
public void IsConsonantIncludesYByDefault() { Assert.True(SpecialCharacterChecker.IsConsonant('y')); }
private static bool IsInnerLongDash(char character, int index) => SpecialCharacterChecker.IsLongDash(character) && index > 0;
private static string GetTokenType(char character, bool compact = false) { if (compact) { if (IsJaNumber(character)) { return(TokenTypes.Other); } if (IsEnNumber(character)) { return(TokenTypes.Other); } if (IsEnSpace(character)) { return(TokenTypes.English); } if (SpecialCharacterChecker.IsEnglishPunctuation(character)) { return(TokenTypes.Other); } if (IsJaSpace(character)) { return(TokenTypes.Japanese); } if (SpecialCharacterChecker.IsJapanesePunctuation(character)) { return(TokenTypes.Other); } if (JapaneseChecker.IsJapanese(character)) { return(TokenTypes.Japanese); } if (RomajiChecker.IsRomaji(character)) { return(TokenTypes.English); } } else { if (IsJaSpace(character)) { return(TokenTypes.Space); } if (IsEnSpace(character)) { return(TokenTypes.Space); } if (IsJaNumber(character)) { return(TokenTypes.JapaneseNumber); } if (IsEnNumber(character)) { return(TokenTypes.EnglishNumber); } if (SpecialCharacterChecker.IsEnglishPunctuation(character)) { return(TokenTypes.EnglishPunctuation); } if (SpecialCharacterChecker.IsJapanesePunctuation(character)) { return(TokenTypes.JapanesePunctuation); } if (KanjiChecker.IsKanji(character)) { return(TokenTypes.Kanji); } if (HiraganaChecker.IsHiragana(character)) { return(TokenTypes.Hiragana); } if (KatakanaChecker.IsKatakana(character)) { return(TokenTypes.Katakana); } if (JapaneseChecker.IsJapanese(character)) { return(TokenTypes.Japanese); } if (RomajiChecker.IsRomaji(character)) { return(TokenTypes.English); } } return(TokenTypes.Other); }