Example #1
0
		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();
				}
			}
		}
Example #2
0
		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
		}