Esempio n. 1
0
        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);
        }