internal string replaceNames(ParseResult parseData) { StringBuilder sb = new StringBuilder(); IEnumerable <ParseResult> parts; if (parseData.type == ParseResult.ParseResultType.COMPLEX) { parts = (parseData as ComplexParseResult).parts; } else { parts = Enumerable.Repeat(parseData, 1); } bool prevName = false; foreach (var part in parts) { if (part.type == ParseResult.ParseResultType.UNPARSED) { prevName = false; sb.Append(part.asText()); } else if (part.type == ParseResult.ParseResultType.WORD) { WordParseResult wp = part as WordParseResult; bool found = false; bool isName = wp.isName(); bool isReplacement = wp.isReplacement(); if (isName || isReplacement) { var entry = wp.getSelectedEntry(); DictionarySense sense = entry.sense.FirstOrDefault(); if (sense != null && sense.glossary.Count > 0) { if (prevName) { sb.Append(' '); } sb.Append(sense.glossary.First()); found = true; } else { if (entry.kana.Count > 0) { if (prevName) { sb.Append(' '); } sb.Append(entry.kana.First().text); found = true; } } } else if (prevName) { foreach (EdictEntry entry in wp.getEntries()) { if (nameSuffixes.ContainsKey(part.asText())) { string reading = nameSuffixes[part.asText()]; sb.Append(reading); found = true; break; } else if (nameSuffixes.ContainsKey(entry.getText())) { string reading = nameSuffixes[entry.getText()]; sb.Append(reading); found = true; break; } } } if (found) { prevName = isName || prevName; } else { prevName = false; sb.Append(part.asText()); } } } return(sb.ToString()); }