public override State PushChar(char c, IParseContext context, ref string rollback) { INamedXObject namedObject = context.Nodes.Peek() as INamedXObject; if (namedObject == null || namedObject.Name.Prefix != null) { throw new InvalidOperationException("Invalid state"); } Debug.Assert(context.CurrentStateLength > 1 || char.IsLetter(c) || c == '_', "First character pushed to a XmlTagNameState must be a letter."); Debug.Assert(context.CurrentStateLength > 1 || context.KeywordBuilder.Length == 0, "Keyword builder must be empty when state begins."); if (XmlChar.IsWhitespace(c) || c == '<' || c == '>' || c == '/' || c == '=') { rollback = string.Empty; if (context.KeywordBuilder.Length == 0) { context.LogError("Zero-length name."); } else { string s = context.KeywordBuilder.ToString(); int i = s.IndexOf(':'); if (i < 0) { namedObject.Name = new XName(s); } else { namedObject.Name = new XName(s.Substring(0, i), s.Substring(i + 1)); } } return(Parent); } if (c == ':') { if (context.KeywordBuilder.ToString().IndexOf(':') > 0) { context.LogError("Unexpected ':' in name."); } context.KeywordBuilder.Append(c); return(null); } if (XmlChar.IsNameChar(c)) { context.KeywordBuilder.Append(c); return(null); } rollback = string.Empty; context.LogError("Unexpected character '" + c + "' in name"); return(Parent); }
public override State PushChar(char c, IParseContext context, ref string rollback) { INamedXObject namedObject = context.Nodes.Peek() as INamedXObject; if (namedObject == null || namedObject.Name.Prefix != null) { throw new InvalidOperationException("Invalid state"); } Debug.Assert(context.CurrentStateLength > 1 || char.IsLetter(c) || c == '_', "First character pushed to a XmlTagNameState must be a letter."); Debug.Assert(context.CurrentStateLength > 1 || context.KeywordBuilder.Length == 0, "Keyword builder must be empty when state begins."); if (c == ':') { if (namedObject.Name.Name != null || context.KeywordBuilder.Length == 0) { context.LogError("Unexpected ':' in name."); return(Parent); } namedObject.Name = new XName(context.KeywordBuilder.ToString()); context.KeywordBuilder.Length = 0; return(null); } if (XmlChar.IsWhitespace(c) || c == '<' || c == '>' || c == '/' || c == '=') { rollback = string.Empty; if (context.KeywordBuilder.Length == 0) { context.LogError("Zero-length name."); } else if (namedObject.Name.Name != null) { //add prefix (and move current "name" to prefix) namedObject.Name = new XName(namedObject.Name.Name, context.KeywordBuilder.ToString()); } else { namedObject.Name = new XName(context.KeywordBuilder.ToString()); } //note: parent's MalformedTagState logs an error, so skip this //if (c == '<') //context.LogError ("Unexpected '<' in name."); return(Parent); } if (c == ':') { if (namedObject.Name.Name != null || context.KeywordBuilder.Length == 0) { context.LogError("Unexpected ':' in name."); return(Parent); } namedObject.Name = new XName(context.KeywordBuilder.ToString()); context.KeywordBuilder.Length = 0; return(null); } if (XmlChar.IsNameChar(c)) { context.KeywordBuilder.Append(c); return(null); } rollback = string.Empty; context.LogError("Unexpected character '" + c + "' in name"); return(Parent); }