public override void Read(Tokeniser t, CharacterReader r)
            {
                if (r.MatchesLetter())
                {
                    string name = r.ConsumeLetterSequence();
                    t.tagPending.AppendTagName(name.ToLowerInvariant());
                    t.dataBuffer.Append(name);
                    return;
                }

                char c = r.Consume();

                switch (c)
                {
                case '\t':
                case '\n':
                case '\f':
                case ' ':
                    if (t.IsAppropriateEndTagToken())
                    {
                        t.Transition(BeforeAttributeName);
                    }
                    else
                    {
                        AnythingElse(t, r);
                    }
                    break;

                case '/':
                    if (t.IsAppropriateEndTagToken())
                    {
                        t.Transition(SelfClosingStartTag);
                    }
                    else
                    {
                        AnythingElse(t, r);
                    }
                    break;

                case '>':
                    if (t.IsAppropriateEndTagToken())
                    {
                        t.EmitTagPending();
                        t.Transition(Data);
                    }
                    else
                    {
                        AnythingElse(t, r);
                    }
                    break;

                default:
                    AnythingElse(t, r);
                    break;
                }
            }
            public override void Read(Tokeniser t, CharacterReader r)
            {
                if (r.MatchesLetter())
                {
                    string name = r.ConsumeLetterSequence();
                    t.doctypePending.name.Append(name.ToLowerInvariant());
                    return;
                }

                char c = r.Consume();

                switch (c)
                {
                case '>':
                    t.EmitDoctypePending();
                    t.Transition(Data);
                    break;

                case '\t':
                case '\n':
                case '\f':
                case ' ':
                    t.Transition(AfterDoctypeName);
                    break;

                case nullChar:
                    t.Error(this);
                    t.doctypePending.name.Append(replacementChar);
                    break;

                case eof:
                    t.EofError(this);
                    t.doctypePending.forceQuirks = true;
                    t.EmitDoctypePending();
                    t.Transition(Data);
                    break;

                default:
                    t.doctypePending.name.Append(c);
                    break;
                }
            }
            public override void Read(Tokeniser t, CharacterReader r)
            {
                if (r.MatchesLetter())
                {
                    string name = r.ConsumeLetterSequence();
                    t.dataBuffer.Append(name.ToLowerInvariant());
                    t.Emit(name);
                    return;
                }

                char c = r.Consume();

                switch (c)
                {
                case '\t':
                case '\n':
                case '\f':
                case ' ':
                case '/':
                case '>':

                    if (t.dataBuffer.ToString().Equals("script"))
                    {
                        t.Transition(ScriptDataEscaped);
                    }
                    else
                    {
                        t.Transition(ScriptDataDoubleEscaped);
                    }

                    t.Emit(c);
                    break;

                default:
                    r.Unconsume();
                    t.Transition(ScriptDataDoubleEscaped);
                    break;
                }
            }