private static void WriteRoleText(XmlWriter writer, int roleIndex, bool testHyphenBinding, ref VerbalizationHyphenBinder hyphenBinder, ref string pendingPredicateText, ref bool wroteExpandedData) { if (roleIndex == -1) { writer.WriteStartElement("orm", "ExpandedData", ORMCoreDomainModel.XmlNamespace); if (!string.IsNullOrEmpty(pendingPredicateText)) { writer.WriteAttributeString("FrontText", pendingPredicateText); pendingPredicateText = null; } wroteExpandedData = true; } else { string hyphenBindingFormatString; if (testHyphenBinding && null != (hyphenBindingFormatString = hyphenBinder.GetRoleFormatString(roleIndex)) && hyphenBindingFormatString.Length > 1) { writer.WriteStartElement("orm", "RoleText", ORMCoreDomainModel.XmlNamespace); writer.WriteAttributeString("RoleIndex", roleIndex.ToString(CultureInfo.InvariantCulture)); int separatorIndex = hyphenBindingFormatString.IndexOf('\0'); if (separatorIndex > 0) { writer.WriteAttributeString("PreBoundText", hyphenBindingFormatString.Substring(0, separatorIndex)); } if ((hyphenBindingFormatString.Length - separatorIndex) > 1) { writer.WriteAttributeString("PostBoundText", hyphenBindingFormatString.Substring(separatorIndex + 1)); } if (!string.IsNullOrEmpty(pendingPredicateText)) { writer.WriteAttributeString("FollowingText", pendingPredicateText); pendingPredicateText = null; } writer.WriteEndElement(); } else if (!string.IsNullOrEmpty(pendingPredicateText)) { writer.WriteStartElement("orm", "RoleText", ORMCoreDomainModel.XmlNamespace); writer.WriteAttributeString("RoleIndex", roleIndex.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("FollowingText", pendingPredicateText); pendingPredicateText = null; writer.WriteEndElement(); } } }
void IXmlSerializable.WriteXml(XmlWriter writer) { string namespaceUri = ORMCoreDomainModel.XmlNamespace; writer.WriteStartElement("orm", "Reading", namespaceUri); writer.WriteAttributeString("id", '_' + XmlConvert.ToString(Id).ToUpperInvariant()); string readingText = Text; writer.WriteElementString("orm", "Data", namespaceUri, readingText); IList<RoleBase> roles = RoleCollection; int roleCount = roles.Count; VerbalizationHyphenBinder hyphenBinder = new VerbalizationHyphenBinder(this, null, null, null, "{0}\x0{1}", null); string alternateReadingText = hyphenBinder.ModifiedReadingText; if (alternateReadingText != null) { readingText = alternateReadingText; } int precedingIndex = -1; string pendingPredicateText = null; bool wroteExpandedData = false; int lastIndex = 0; // The regex gives leading text, not trailing, so postpone processing until // we have full data. bool testHyphenBinding = alternateReadingText != null; if (testHyphenBinding) { readingText = alternateReadingText; } Match visitMatch = FieldAndPredicatePartRegex.Match(readingText); while (visitMatch.Success) { GroupCollection groups = visitMatch.Groups; string currentIndexString = groups[ReplaceFieldsMatchIndexGroupName].Value; pendingPredicateText += groups[ReplaceFieldsMatchPredicatePartGroupName].Value; int currentIndex; if (int.TryParse(currentIndexString, NumberStyles.None, CultureInfo.InvariantCulture, out currentIndex) && currentIndex >= 0 && currentIndex < roleCount) { WriteRoleText(writer, precedingIndex, testHyphenBinding, ref hyphenBinder, ref pendingPredicateText, ref wroteExpandedData); precedingIndex = currentIndex; } else { // Error condition, just append the field text untouched to the predicate text pendingPredicateText += groups[ReplaceFieldsMatchFieldGroupName].Value; } lastIndex += visitMatch.Length; visitMatch = visitMatch.NextMatch(); } bool hasTrailingText = lastIndex < readingText.Length; if (lastIndex < readingText.Length) { pendingPredicateText += readingText.Substring(lastIndex); } if (precedingIndex != -1 || !string.IsNullOrEmpty(pendingPredicateText)) { WriteRoleText(writer, precedingIndex, testHyphenBinding, ref hyphenBinder, ref pendingPredicateText, ref wroteExpandedData); } if (wroteExpandedData) { writer.WriteEndElement(); // Matches ExpandedData element } writer.WriteEndElement(); // Matches Reading element }