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