Example #1
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Name.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        /// <returns>The emitted token.</returns>
        private XmlToken TagName(XmlTagToken tag)
        {
            var c = GetNext();

            while (c.IsXmlName())
            {
                StringBuffer.Append(c);
                c = GetNext();
            }

            tag.Name = FlushBuffer();

            if (c == Symbols.EndOfFile)
            {
                throw XmlParseError.EOF.At(GetCurrentPosition());
            }

            if (c == Symbols.GreaterThan)
            {
                return(tag);
            }
            else if (c.IsSpaceCharacter())
            {
                return(AttributeBeforeName(tag));
            }
            else if (c == Symbols.Solidus)
            {
                return(TagSelfClosing(tag));
            }

            throw XmlParseError.XmlInvalidName.At(GetCurrentPosition());
        }
Example #2
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Attribute.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        /// <param name="quote">The quote character.</param>
        private XmlToken AttributeValue(XmlTagToken tag, Char quote)
        {
            var c = GetNext();

            while (c != quote)
            {
                if (c == Symbols.EndOfFile)
                {
                    throw XmlParseError.EOF.At(GetCurrentPosition());
                }

                if (c == Symbols.LessThan)
                {
                    throw XmlParseError.XmlLtInAttributeValue.At(GetCurrentPosition());
                }

                if (c == Symbols.Ampersand)
                {
                    StringBuffer.Append(CharacterReference());
                }
                else
                {
                    StringBuffer.Append(c);
                }

                c = GetNext();
            }

            tag.SetAttributeValue(FlushBuffer());
            return(AttributeAfterValue(tag));
        }
Example #3
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Attribute.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        private XmlToken AttributeName(XmlTagToken tag)
        {
            var c = GetNext();

            while (c.IsXmlName())
            {
                StringBuffer.Append(c);
                c = GetNext();
            }

            var name = FlushBuffer();

            if (!String.IsNullOrEmpty(tag.GetAttribute(name)))
            {
                throw XmlParseError.XmlUniqueAttribute.At(GetCurrentPosition());
            }

            tag.AddAttribute(name);

            if (c.IsSpaceCharacter())
            {
                do
                {
                    c = GetNext();
                }while (c.IsSpaceCharacter());
            }

            if (c != Symbols.Equality)
            {
                throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition());
            }

            return(AttributeBeforeValue(tag));
        }
Example #4
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Attribute.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        private XmlToken AttributeBeforeName(XmlTagToken tag)
        {
            var c = SkipSpaces();

            if (c == Symbols.Solidus)
            {
                return(TagSelfClosing(tag));
            }
            else if (c == Symbols.GreaterThan)
            {
                return(tag);
            }

            if (c == Symbols.EndOfFile)
            {
                throw XmlParseError.EOF.At(GetCurrentPosition());
            }

            if (c.IsXmlNameStart())
            {
                StringBuffer.Append(c);
                return(AttributeName(tag));
            }

            throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition());
        }
Example #5
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Attribute.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        private XmlToken AttributeBeforeValue(XmlTagToken tag)
        {
            var c = SkipSpaces();

            if (c != Symbols.DoubleQuote && c != Symbols.SingleQuote)
            {
                throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition());
            }

            return(AttributeValue(tag, c));
        }
Example #6
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#d0e2480.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        private XmlToken TagSelfClosing(XmlTagToken tag)
        {
            var c = GetNext();

            tag.IsSelfClosing = true;

            if (c == Symbols.GreaterThan)
            {
                return(tag);
            }

            if (c == Symbols.EndOfFile)
            {
                throw XmlParseError.EOF.At(GetCurrentPosition());
            }

            throw XmlParseError.XmlInvalidName.At(GetCurrentPosition());
        }
Example #7
0
        /// <summary>
        /// More http://www.w3.org/TR/REC-xml/#NT-Attribute.
        /// </summary>
        /// <param name="tag">The current tag token.</param>
        private XmlToken AttributeAfterValue(XmlTagToken tag)
        {
            var c = GetNext();

            if (c.IsSpaceCharacter())
            {
                return(AttributeBeforeName(tag));
            }
            else if (c == Symbols.Solidus)
            {
                return(TagSelfClosing(tag));
            }
            else if (c == Symbols.GreaterThan)
            {
                return(tag);
            }

            throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition());
        }