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;
Example #15
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);
 }