Esempio n. 1
0
        public System.Collections.Generic.IEnumerable <char> Transcribe(System.Collections.Generic.IEnumerable <char> input)
        {
            LetterCategory lastCategory = LetterCategory.Whitespace;

            System.Collections.Generic.IEnumerator <char> enumerator = input.GetEnumerator();
            bool evenInsertVowel = false;

            //If we are done, no more elements
            if (!enumerator.MoveNext())
            {
                yield break;
            }
            bool done = false;

            while (!done)
            {
                char current = enumerator.Current;

                //If we are done, no more elements
                if (!enumerator.MoveNext())
                {
                    done = true;
                }

                //If we are at the last element
                else if (current == enumerator.Current)
                {
                    done = !enumerator.MoveNext();
                }

                //Map ck to k
                else if (current == 'c' && enumerator.Current == 'k')
                {
                    done    = !enumerator.MoveNext();
                    current = 'k';
                }

                //Map ch to k if last character was a vowel,
                //otherwise map ch to s
                else if (current == 'c' && enumerator.Current == 'h')
                {
                    done    = !enumerator.MoveNext();
                    current = lastCategory == LetterCategory.Vowel ? 'k' : 's';
                }
                current = this.Map(current);
                LetterCategory category = this.Categorize(current);
                switch (category)
                {
                //Don't transpose other characters
                case LetterCategory.Other:
                    break;

                case LetterCategory.Vowel:
                    //If vowel, and last category was not a consonant
                    //add a h before the vowel
                    if (lastCategory != LetterCategory.Consonant)
                    {
                        yield return('h');
                    }
                    yield return(current);

                    break;

                case LetterCategory.Consonant:
                    //If consonant, and the last category was a consonant,
                    //add a u or i before the consonant
                    if (lastCategory == LetterCategory.Consonant)
                    {
                        yield return((evenInsertVowel = !evenInsertVowel) ? 'u' : 'i');
                    }
                    yield return(current);

                    break;

                case LetterCategory.Whitespace:
                    //If the last character in a word was a consonant,
                    //add a u or i to the end of that word.
                    if (lastCategory == LetterCategory.Consonant)
                    {
                        yield return(!evenInsertVowel ? 'u' : 'i');
                    }
                    evenInsertVowel = false;
                    if (lastCategory != LetterCategory.Whitespace)
                    {
                        yield return(' ');
                    }
                    break;
                }
                if (category != LetterCategory.Other)
                {
                    lastCategory = category;
                }
            }
            if (lastCategory == LetterCategory.Consonant)
            {
                yield return((evenInsertVowel = !evenInsertVowel) ? 'u' : 'i');
            }
        }
Esempio n. 2
0
        public System.Collections.Generic.IEnumerable <char> Transcribe(System.Collections.Generic.IEnumerable <char> input)
        {
            LetterCategory lastCategory  = LetterCategory.Whitespace;
            char           lastCharacter = '\0';

            System.Collections.Generic.IEnumerator <char> enumerator = input.GetEnumerator();
            bool evenInsertVowel = false;

            //If we are done, no more elements
            if (!enumerator.MoveNext())
            {
                yield break;
            }
            bool done    = false;
            char current = '\0';

            while (!done)
            {
                lastCharacter = current;
                current       = enumerator.Current;

                //If we are done, no more elements
                if (!enumerator.MoveNext())
                {
                    done = true;
                }

                //If we are at the last element
                else if (current == enumerator.Current)
                {
                    done = !enumerator.MoveNext();
                }

                //    //Map ck to k
                //    else if (current == 'c' && enumerator.Current == 'k')
                //    {
                //        done = !enumerator.MoveNext();
                //        current = 'k';
                //    }

                //    //Map ch to k if last character was a vowel,
                //    //otherwise map ch to s
                //    else if (current == 'c' && enumerator.Current == 'h')
                //    {
                //        done = !enumerator.MoveNext();
                //        current = lastCategory == LetterCategory.Vowel ? 'k' : 's';
                //    }
                current = this.Map(current);
                LetterCategory category = this.Categorize(current);


                switch (category)
                {
                //        //Don't transpose other characters
                case LetterCategory.Other:
                    if (current == '_')
                    {
                        yield return(current);
                    }
                    break;

                //case LetterCategory.Vowel:
                //    //If vowel, and last category was not a consonant
                //    //add a h before the vowel
                //    //if (lastCategory != LetterCategory.Consonant)
                //    //    yield return 'h';
                //    //yield return current;
                //    break;
                //case LetterCategory.Consonant:
                //    //If consonant, and the last category was a consonant,
                //    //add a u or i before the consonant
                //    //if (lastCategory == LetterCategory.Consonant)
                //    //    yield return (evenInsertVowel = !evenInsertVowel) ? 'u' : 'i';
                //    //yield return current;
                //    break;
                case LetterCategory.Whitespace:
                    //If the last character in a word was a consonant,
                    //add a u or i to the end of that word.
                    //if (lastCategory == LetterCategory.Consonant)
                    //    yield return !evenInsertVowel ? 'u' : 'i';
                    //evenInsertVowel = false;
                    if (lastCategory != LetterCategory.Whitespace)
                    {
                        switch (lastCharacter)
                        {
                        case 'g':
                        case 'b':
                        case 'h':
                            yield return('u');

                            yield return('r');

                            break;

                        case 'f':
                        case 'p':
                        case 's':
                        case 'v':
                            yield return('i');

                            yield return('r');

                            break;

                        case 'd':
                        case 'm':
                        case 'r':
                        case 't':
                            yield return('o');

                            yield return('n');

                            break;

                        case 'l':
                            yield return('r');

                            break;
                        }
                        yield return(' ');
                    }
                    break;

                default:

                    //Map ö to oe
                    if (current == 'ö')
                    {
                        yield return('o');

                        yield return('e');
                    }
                    else if (current == 'd')
                    {
                        yield return('t');

                        yield return('h');
                    }

                    else
                    {
                        yield return(current);
                    }
                    break;
                }
                if (category != LetterCategory.Other)
                {
                    lastCategory = category;
                }
            }
            //if (lastCategory == LetterCategory.Consonant)
            //        yield return (evenInsertVowel = !evenInsertVowel) ? 'u' : 'i';
        }