////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///  Method: State Attribute.
        /// </summary>
        /// <param name="c">  The char c.</param>
        /// <returns>
        ///  The Scan.TokenType value.
        /// </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private TokenType StateAttribute(char c)
        {
            switch (c)
            {
            case '>':
                Scanner.AppendMoveNext(c);
                _state = _state == State.ScriptAttribute?State.Script: State.Body;
                return(TokenType.Punctuation);

            case '/':
                c = Scanner.AppendMoveNext(c);
                if (c == '>')
                {
                    Scanner.AppendMoveNext(c);
                    _state = State.None;
                }
                return(TokenType.Punctuation);

            case '\'':
            case '"':
                return(Scanner.ScanDelimited(c, TokenType.String, '\0'));

            case '\n':
                return(Scanner.ScanEol());
            }

            return(char.IsLetter(c) ? Scanner.ScanName(c) : base.ClassifyCharacter(c));
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///  Method: Block Comment.
        /// </summary>
        /// <param name="c">  The char c.</param>
        /// <returns>
        ///  The SourcePreview.TokenType value.
        /// </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private TokenType BlockComment(char c)
        {
            while (c != '\0')
            {
                switch (c)
                {
                case '\n':
                    if (Scanner.Token.Length > 0)
                    {
                        return(TokenType.Comment);
                    }
                    return(Scanner.ScanEol());

                case '\r':
                    c = Scanner.MoveNext();
                    break;

                default:

                    if (Scanner.Accept(Scanner.Language.BlockComment[1], false))
                    {
                        _inBlockComment = false;
                        return(TokenType.Comment);
                    }
                    c = Scanner.AppendMoveNext(c);
                    break;
                }
            }

            return(TokenType.Comment);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///  Method: Classify Possible Tag.
        /// </summary>
        /// <param name="c">  The char c.</param>
        /// <returns>
        ///  The Scan.TokenType value.
        /// </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private TokenType ClassifyPossibleTag(char c)
        {
            while (c != '\0')
            {
                switch (c)
                {
                case '\n':
                    return(Scanner.Token.Length > 0 ? (TokenType)TokenType.Default : Scanner.ScanEol());

                case '<':
                    if (Scanner.Token.Length > 0)
                    {
                        return(TokenType.Default);
                    }

                    c = Scanner.AppendMoveNext(c);

                    if (c == '/')
                    {
                        // end tag
                        Scanner.AppendMoveNext(c);
                        _state = State.Tag;
                        return(TokenType.Punctuation);
                    }
                    else if (c == '!')
                    {
                        // <!DOCTYPE xxxxxx >
                        // <!--  xxxxxxx -->
                        c = Scanner.AppendMoveNext(c);
                        if (c == '-' && Scanner.PeekNextChar() == '-')
                        {
                            // looking for ending comment, treat as comment
                            _state = State.Comment;
                            return(ScanComment(c));
                        }
                        _state = State.Tag;
                        return(TokenType.Punctuation);
                    }
                    else
                    {
                        // start tag
                        _state = State.Tag;
                        return(TokenType.Punctuation);
                    }

                default:
                    c = Scanner.AppendMoveNext(c);
                    break;
                }
            }
            return(TokenType.End);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///  Method: Scan Comment. Either entering a comment or in a comment after Eol
        /// </summary>
        /// <returns>
        ///  The Scan.TokenType value.
        /// </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private TokenType ScanComment(char c)
        {
            while (c != '\0' && c != '\n')
            {
                if (Scanner.Accept("-->", false))
                {
                    _state = State.None;
                    break;
                }

                c = Scanner.AppendMoveNext(c);
            }

            return(TokenType.Comment);
        }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 /// <summary>
 ///  Method: Scan Script.
 /// </summary>
 /// <param name="c">  The char c.</param>
 /// <returns>
 ///  The Scan.TokenType value.
 /// </returns>
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 private TokenType ScanScript(char c)
 {
     while (c != '\0' && c != '\n')
     {
         if (c == '<')
         {
             c = Scanner.AppendMoveNext(c);
             if (c == '/')
             {
                 c = Scanner.AppendMoveNext(c);
                 Scanner.ScanName(c);
                 c = Scanner.CurrentChar;
                 if (c == '>')
                 {
                     Scanner.AppendMoveNext(c);
                     _state = State.None;
                     break;
                 }
             }
         }
         c = Scanner.AppendMoveNext(c);
     }
     return(TokenType.Keyword3);
 }