/// <summary> /// Applies the final rules to convert from a language-specific phonetic representation to a /// language-independent representation. /// </summary> /// <param name="phonemeBuilder">The current phonemes.</param> /// <param name="finalRules">The final rules to apply.</param> /// <returns>The resulting phonemes.</returns> private PhonemeBuilder ApplyFinalRules(PhonemeBuilder phonemeBuilder, IDictionary <string, IList <Rule> > finalRules) { if (finalRules == null) { throw new ArgumentNullException("finalRules can not be null"); } if (finalRules.Count == 0) { return(phonemeBuilder); } ISet <Phoneme> phonemes = new JCG.SortedSet <Phoneme>(Phoneme.COMPARER); foreach (Phoneme phoneme in phonemeBuilder.Phonemes) { PhonemeBuilder subBuilder = PhonemeBuilder.Empty(phoneme.Languages); string phonemeText = phoneme.GetPhonemeText(); for (int i = 0; i < phonemeText.Length;) { RulesApplication rulesApplication = new RulesApplication(finalRules, phonemeText, subBuilder, i, maxPhonemes).Invoke(); bool found = rulesApplication.IsFound; subBuilder = rulesApplication.PhonemeBuilder; if (!found) { // not found, appending as-is subBuilder.Append(phonemeText.Substring(i, 1)); } i = rulesApplication.I; } phonemes.UnionWith(subBuilder.Phonemes); } return(new PhonemeBuilder(phonemes.ToList())); }