コード例 #1
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    t.ChangeTokenState<BeforeAttributeNameState>();
                    return;
                case Chars.SOLIDUS:
                    t.ChangeTokenState<SelfClosingStartTagState>();
                    return;
                case Chars.GREATER_THAN_SIGN:
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case null:
                    OnMessageRaised(new SuddenlyEndAtAttributeError());
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    OnMessageRaised(new MissingSpaceAfterAttributeValueError(c));
                    t.UnConsume(1);
                    t.ChangeTokenState<BeforeAttributeNameState>();
                    return;
            }
        }
コード例 #2
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.HYPHEN_MINUS:
                    t.ChangeTokenState<ScriptDataDoubleEscapedDashState>();
                    t.EmitToken(Chars.HYPHEN_MINUS);
                    return;
                case Chars.LESS_THAN_SIGN:
                    t.ChangeTokenState<ScriptDataDoubleEscapedLessThanSignState>();
                    t.EmitToken(Chars.LESS_THAN_SIGN);
                    return;
                case Chars.NULL:
                    OnMessageRaised(new NullInScriptError());
                    t.EmitToken(Chars.REPLACEMENT_CHARACTER);
                    return;
                case null:
                    OnMessageRaised(new SuddenlyEndAtScriptError());

                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    t.EmitToken(c);
                    return;
            }
        }
コード例 #3
0
ファイル: TokenizationState.cs プロジェクト: bakera/Test
 // 文字参照
 // 参照されている文字を取得します。失敗したときはnullを返します。
 protected ReferencedCharacterToken ConsumeCharacterReference(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     if(t.AdditionalAllowedCharacter != null && c == t.AdditionalAllowedCharacter){
         // Not a character reference. No characters are consumed, and nothing is returned. (This is not an error, either.)
         OnMessageRaised(new RawAmpersandWarning());
         t.UnConsume(1);
         return null;
     }
     switch(c){
         case Chars.AMPERSAND:
         case Chars.LINE_FEED:
         case Chars.FORM_FEED:
         case Chars.SPACE:
         case Chars.LESS_THAN_SIGN:
         case null:
             // Not a character reference. No characters are consumed, and nothing is returned. (This is not an error, either.)
             OnMessageRaised(new RawAmpersandWarning());
             t.UnConsume(1);
             return null;
         case Chars.NUMBER_SIGN:
             return ConsumeNumericCharacterReference(t);
         default:
             return ConsumeNamedCharacterReference(t);
     }
 }
コード例 #4
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            if(c.IsLatinCapitalLetter()){
                t.TemporaryBuffer = "";
                t.TemporaryBuffer += c.ToLower();
                t.EmitToken(Chars.LESS_THAN_SIGN);
                t.EmitToken(c);
                t.ChangeTokenState<ScriptDataDoubleEscapeStartState>();
                return;
            } else if(c.IsLatinSmallLetter()){
                t.TemporaryBuffer = "";
                t.TemporaryBuffer += c;
                t.EmitToken(Chars.LESS_THAN_SIGN);
                t.EmitToken(c);
                t.ChangeTokenState<ScriptDataDoubleEscapeStartState>();
                return;
            }

            switch(c){
                case Chars.SOLIDUS:
                    t.TemporaryBuffer = "";
                    t.ChangeTokenState<ScriptDataEscapedEndTagOpenState>();
                    return;
                default:
                    t.EmitToken(Chars.LESS_THAN_SIGN);
                    t.UnConsume(1);
                    t.ChangeTokenState<ScriptDataEscapedState>();
                    return;
            }
        }
コード例 #5
0
ファイル: EndTagOpenState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.GREATER_THAN_SIGN:
             OnMessageRaised(new EmptyEndTagError());
             t.ChangeTokenState<DataState>();
             return;
         case null:
             OnMessageRaised(new SuddenlyEndAtTagError());
             t.EmitToken(Chars.LESS_THAN_SIGN);
             t.EmitToken(Chars.SOLIDUS);
             t.UnConsume(1);
             t.ChangeTokenState<DataState>();
             return;
     }
     if(c.IsLatinCapitalLetter()){
         t.CurrentToken = new EndTagToken(){Name = c.ToLower().ToString()};
         t.ChangeTokenState<TagNameState>();
         return;
     } else if(c.IsLatinSmallLetter()){
         t.CurrentToken = new EndTagToken(){Name = c.ToString()};
         t.ChangeTokenState<TagNameState>();
         return;
     }
     OnMessageRaised(new UnknownEndTagError());
     t.ChangeTokenState<BogusCommentState>();
     return;
 }
コード例 #6
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            if(c.IsLatinCapitalLetter()){
                t.TemporaryBuffer += c.ToLower();
                t.EmitToken(c);
                return;
            } else if(c.IsLatinSmallLetter()){
                t.TemporaryBuffer += c;
                t.EmitToken(c);
                return;
            }

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                case Chars.SOLIDUS:
                case Chars.GREATER_THAN_SIGN:
                    if(t.TemporaryBuffer.Equals("script", StringComparison.InvariantCulture)){
                        t.ChangeTokenState<ScriptDataDoubleEscapedState>();
                    } else {
                        t.ChangeTokenState<ScriptDataEscapedState>();
                    }
                    t.EmitToken(c);
                    return;
                default:
                    t.UnConsume(1);
                    t.ChangeTokenState<ScriptDataEscapedState>();
                    return;
            }
        }
コード例 #7
0
ファイル: TagOpenState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.EXCLAMATION_MARK:
             t.ChangeTokenState<MarkupDeclarationOpenState>();
             return;
         case Chars.SOLIDUS:
             t.ChangeTokenState<EndTagOpenState>();
             return;
         case Chars.QUESTION_MARK:
             OnMessageRaised(new ProcessingInstructionError());
             t.ChangeTokenState<BogusCommentState>();
             return;
     }
     if(c.IsLatinCapitalLetter()){
         t.CurrentToken = new StartTagToken(){Name = c.ToLower().ToString()};
         t.ChangeTokenState<TagNameState>();
         return;
     } else if(c.IsLatinSmallLetter()){
         t.CurrentToken = new StartTagToken(){Name = c.ToString()};
         t.ChangeTokenState<TagNameState>();
         return;
     }
     OnMessageRaised(new UnknownMarkupError());
     t.UnConsume(1);
     t.ChangeTokenState<DataState>();
     t.EmitToken(Chars.LESS_THAN_SIGN);
     return;
 }
コード例 #8
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    return;
                case Chars.GREATER_THAN_SIGN:{
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                }
                case null:
                    OnMessageRaised(new SuddenlyEndAtDoctypeError());
                    ((DoctypeToken)t.CurrentToken).ForceQuirks = true;
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                default:
                    OnMessageRaised(new UnknownIdentifierAfterDoctypeError());
                    t.ChangeTokenState<BogusDoctypeState>();
                    return;
            }
        }
コード例 #9
0
ファイル: CommentEndDashState.cs プロジェクト: bakera/Test
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();
            switch(c){
                case Chars.HYPHEN_MINUS:
                    t.ChangeTokenState<CommentEndState>();
                    return;
                case Chars.NULL:
                    OnMessageRaised(new NullInCommentError());
                    t.CurrentCommentToken.Append(Chars.HYPHEN_MINUS);
                    t.CurrentCommentToken.Append(Chars.REPLACEMENT_CHARACTER);

                    t.ChangeTokenState<CommentState>();
                    return;
                case null:
                    OnMessageRaised(new SuddenlyEndAtCommentError());
                    t.EmitToken();
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    t.CurrentCommentToken.Append(Chars.HYPHEN_MINUS);
                    t.CurrentCommentToken.Append(c);
                    t.ChangeTokenState<CommentState>();
                    return;
            }
        }
コード例 #10
0
ファイル: TokenizationState.cs プロジェクト: bakera/Test
        /*
        If the character reference is being consumed as part of an attribute, and the last character matched is not a U+003B SEMICOLON character (;), and the next character is either a U+003D EQUALS SIGN character (=) or in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), U+0041 LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z, or U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z, then, for historical reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be unconsumed, and nothing is returned.
        */
        // 名前による文字参照を展開します。
        protected ReferencedCharacterToken ConsumeNamedCharacterReference(Tokenizer t)
        {
            StringBuilder referenceName = new StringBuilder();
            bool semicolonFound = false;

            char? lastChar = t.CurrentInputChar;
            while(lastChar.IsNameToken()){
                referenceName.Append(lastChar);
                lastChar = t.ConsumeChar();
            }
            if(lastChar == Chars.SEMICOLON){
                referenceName.Append(lastChar);
                semicolonFound = true;
            } else {
                // CurrentInputCharをreferenceNameの末尾にそろえる
                t.UnConsume(1);
            }
            string originalString = referenceName.ToString();

            string matchResult = null;
            while(referenceName.Length > 0){
                if(Chars.ExistsNamedChar(referenceName.ToString())){
                    matchResult = Chars.GetNamedChar(referenceName.ToString());
                    break;
                }
                referenceName.Remove(referenceName.Length-1, 1);
                // CurrentInputCharをreferenceNameの末尾にそろえる
                t.UnConsume(1);
            }

            if(matchResult == null){
                if(semicolonFound){
                    // 名前がなく、セミコロンがある場合はパースエラー
                    // if the characters after the U+0026 AMPERSAND character (&) consist of a sequence of one or more characters in the range ASCII digits, lowercase ASCII letters, and uppercase ASCII letters, followed by a ";" (U+003B) character, then this is a parse error.
                    OnMessageRaised(new UnknownNamedCharacterReferenceWithSemicolonError(originalString));
                } else {
                    // 名前がなくセミコロンがない場合はパースエラーにならない
                    OnMessageRaised(new UnknownNamedCharacterReferenceWithoutSemicolonWarning(originalString));
                }
                t.UnConsume(referenceName.Length);
                return null;
            }
            if(!semicolonFound){
                // 属性値の中のセミコロンなし文字参照は無視する
                if(t.CurrentTokenState is CharacterReferenceInAttributeState && t.NextInputChar.IsSuffixOfIgnoreCharacterReferenceInAttribute()){
                    OnMessageRaised(new IgnoredCharacterReferenceInAttributeWarning(referenceName));
                    t.UnConsume(referenceName.Length);
                    return null;
                }
                // それ以外のセミコロンなし文字参照はエラー
                OnMessageRaised(new NamedCharacterReferenceWithoutSemicolonError(referenceName));
            }

            ReferencedCharacterToken resultToken = new ReferencedCharacterToken(matchResult);
            resultToken.OriginalString = referenceName.ToString();
            return resultToken;
        }
コード例 #11
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    return;
                case Chars.SOLIDUS:
                    t.ChangeTokenState<SelfClosingStartTagState>();
                    return;
                case Chars.EQUALS_SIGN:
                    t.ChangeTokenState<BeforeAttributeValueState>();
                    return;
                case Chars.GREATER_THAN_SIGN:
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case Chars.NULL:
                    if(t.CurrentTagToken.FixAttribute() == false){
                        OnMessageRaised(new DuplicateAttributeError(t.CurrentTagToken.CurrentAttribute.Name));
                        t.CurrentTagToken.CurrentAttribute = null;
                    }
                    OnMessageRaised(new NullInAttributeNameError());
                    t.CurrentTagToken.CreateAttribute(Chars.REPLACEMENT_CHARACTER, "");
                    return;
                case Chars.QUOTATION_MARK:
                case Chars.APOSTROPHE:
                case Chars.LESS_THAN_SIGN:
                    OnMessageRaised(new InvaridCharAtAfterAttributeNameError(c,  t.CurrentTagToken.CurrentAttribute.Name));
                    goto default;
                case null:
                    OnMessageRaised(new SuddenlyEndAtAttributeError());
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    if(t.CurrentTagToken.FixAttribute() == false){
                        OnMessageRaised(new DuplicateAttributeError(t.CurrentTagToken.CurrentAttribute.Name));
                        t.CurrentTagToken.CurrentAttribute = null;
                    }
                    if(c.IsLatinCapitalLetter()){
                        t.CurrentTagToken.CreateAttribute(c.ToLower(), "");
                    } else {
                        t.CurrentTagToken.CreateAttribute(c, "");
                    }
                    t.ChangeTokenState<AttributeNameState>();
                    return;
            }
        }
コード例 #12
0
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     if(c == Chars.SOLIDUS){
         t.TemporaryBuffer = "";
         t.ChangeTokenState<RAWTEXTEndTagOpenState>();
         return;
     }
     t.EmitToken(Chars.LESS_THAN_SIGN);
     t.UnConsume(1);
     t.ChangeTokenState<RAWTEXTState>();
     return;
 }
コード例 #13
0
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.HYPHEN_MINUS:
             t.EmitToken(Chars.HYPHEN_MINUS);
             t.ChangeTokenState<ScriptDataEscapedDashDashState>();
             return;
         default:
             t.UnConsume(1);
             t.ChangeTokenState<ScriptDataState>();
             return;
     }
 }
コード例 #14
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.SOLIDUS:
                    t.TemporaryBuffer = "";
                    t.ChangeTokenState<ScriptDataDoubleEscapeEndState>();
                    return;
                default:
                    t.UnConsume(1);
                    t.ChangeTokenState<ScriptDataDoubleEscapedState>();
                    return;
            }
        }
コード例 #15
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            if(c.IsLatinCapitalLetter()){
                t.CurrentTagToken.Name += c.ToLower();
                t.TemporaryBuffer += c;
                return;
            } else if(c.IsLatinSmallLetter()){
                t.CurrentTagToken.Name += c;
                t.TemporaryBuffer += c;
                return;
            }

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    if(t.IsAppropriateEndTagToken){
                        t.ChangeTokenState<BeforeAttributeNameState>();
                        return;
                    }
                    goto default;
                case Chars.SOLIDUS:
                    if(t.IsAppropriateEndTagToken){
                        t.ChangeTokenState<SelfClosingStartTagState>();
                        return;
                    }
                    goto default;
                case Chars.GREATER_THAN_SIGN:
                    if(t.IsAppropriateEndTagToken){
                        t.EmitToken();
                        t.ChangeTokenState<DataState>();
                        return;
                    }
                    goto default;
                default:{
                    t.EmitToken(Chars.LESS_THAN_SIGN);
                    t.EmitToken(Chars.SOLIDUS);

                    t.EmitToken(t.TemporaryBuffer);
                    t.UnConsume(1);
                    t.ChangeTokenState<ScriptDataEscapedState>();
                    return;
                }
            }
        }
コード例 #16
0
ファイル: PLAINTEXTState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.NULL:
             OnMessageRaised(new NullInDataError());
             t.EmitToken(Chars.REPLACEMENT_CHARACTER);
             return;
         case null:
             t.EmitToken(new EndOfFileToken());
             return;
         default:
             t.EmitToken(c);
             return;
     }
 }
コード例 #17
0
ファイル: BogusDoctypeState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.GREATER_THAN_SIGN:{
             t.ChangeTokenState<DataState>();
             return;
         }
         case null:
             t.UnConsume(1);
             t.ChangeTokenState<DataState>();
             t.EmitToken();
             return;
         default:
             return;
     }
 }
コード例 #18
0
ファイル: CDATASectionState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.RIGHT_SQUARE_BRACKET:
             if(IsStringMatch(t, CDATASectionEndId)){
                 t.ChangeTokenState<DataState>();
                 return;
             }
             break;
         case null:
             t.UnConsume(1);
             t.ChangeTokenState<DataState>();
             return;
     }
     t.EmitToken(c);
 }
コード例 #19
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    return;
                case Chars.QUOTATION_MARK:
                    t.ChangeTokenState<AttributeValueState<DoubleQuoted>>();
                    return;
                case Chars.AMPERSAND:
                    t.ChangeTokenState<AttributeValueUnQuotedState>();
                    return;
                case Chars.APOSTROPHE:
                    t.ChangeTokenState<AttributeValueState<SingleQuoted>>();
                    return;
                case Chars.NULL:
                    OnMessageRaised(new NullInAttributeValueError());
                    t.CurrentTagToken.CurrentAttribute.Value += Chars.REPLACEMENT_CHARACTER;
                    t.ChangeTokenState<AttributeValueUnQuotedState>();
                    return;
                case Chars.GREATER_THAN_SIGN:
                    OnMessageRaised(new MissingAttributeValueError());
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case Chars.LESS_THAN_SIGN:
                case Chars.EQUALS_SIGN:
                case Chars.GRAVE_ACCENT:
                    OnMessageRaised(new InvalidCharInUnquotedAttributeValueError(c));
                    goto default;
                case null:
                    OnMessageRaised(new SuddenlyEndAtAttributeError());
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    t.CurrentTagToken.CurrentAttribute.Value += c;
                    t.ChangeTokenState<AttributeValueUnQuotedState>();
                    return;
            }
        }
コード例 #20
0
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     if(c == Chars.SOLIDUS){
         t.TemporaryBuffer = "";
         t.ChangeTokenState<ScriptDataEndTagOpenState>();
         return;
     }
     if(c == Chars.EXCLAMATION_MARK){
         t.EmitToken(Chars.LESS_THAN_SIGN);
         t.EmitToken(Chars.EXCLAMATION_MARK);
         t.ChangeTokenState<ScriptDataEscapeStartState>();
         return;
     }
     t.EmitToken(Chars.LESS_THAN_SIGN);
     t.UnConsume(1);
     t.ChangeTokenState<ScriptDataState>();
     return;
 }
コード例 #21
0
ファイル: RAWTEXTState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.LESS_THAN_SIGN:
             t.ChangeTokenState<RAWTEXTLessThanSignState>();
             break;
         case Chars.NULL:
             OnMessageRaised(new NullInDataError());
             t.EmitToken(Chars.REPLACEMENT_CHARACTER);
             return;
         case null:
             t.EmitToken(new EndOfFileToken());
             return;
         default:
             t.EmitToken(c);
             return;
     }
 }
コード例 #22
0
ファイル: RAWTEXTEndTagOpenState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     if(c.IsLatinCapitalLetter()){
         t.CurrentToken = new EndTagToken(){Name = c.ToLower().ToString()};
         t.TemporaryBuffer += c;
         t.ChangeTokenState<RAWTEXTEndTagNameState>();
         return;
     } else if(c.IsLatinSmallLetter()){
         t.CurrentToken = new EndTagToken(){Name = c.ToString()};
         t.TemporaryBuffer += c;
         t.ChangeTokenState<RAWTEXTEndTagNameState>();
         return;
     }
     t.EmitToken(Chars.LESS_THAN_SIGN);
     t.EmitToken(Chars.SOLIDUS);
     t.UnConsume(1);
     t.ChangeTokenState<RAWTEXTState>();
     return;
 }
コード例 #23
0
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     if(IsStringMatch(t, CommentId)){
         t.CurrentToken = new CommentToken();
         t.ChangeTokenState<CommentStartState>();
         return;
     }
     if(IsStringMatch(t, DoctypeId)){
         t.ChangeTokenState<DoctypeState>();
         return;
     }
     if(IsStringMatchCaseSensitive(t, CDATASectionStartId)){
         t.ChangeTokenState<CDATASectionState>();
         return;
     }
     OnMessageRaised(new UnknownMarkupDeclarationError());
     t.ChangeTokenState<BogusCommentState>();
     return;
 }
コード例 #24
0
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    t.ChangeTokenState<BeforeDoctypeSystemIdentifierState>();
                    return;
                case Chars.QUOTATION_MARK:
                    OnMessageRaised(new MissingSpaceBeforeDoctypeIdentifierError());
                    ((DoctypeToken)t.CurrentToken).SystemIdentifier = "";
                    t.ChangeTokenState<DoctypeSystemIdentifierState<DoubleQuoted>>();
                    return;
                case Chars.APOSTROPHE:
                    OnMessageRaised(new MissingSpaceBeforeDoctypeIdentifierError());
                    ((DoctypeToken)t.CurrentToken).SystemIdentifier = "";
                    t.ChangeTokenState<DoctypePublicIdentifierState<SingleQuoted>>();
                    return;
                case Chars.GREATER_THAN_SIGN:
                    OnMessageRaised(new MissingSystemIdentifierError());
                    ((DoctypeToken)t.CurrentToken).ForceQuirks = true;
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case null:
                    OnMessageRaised(new SuddenlyEndAtDoctypeError());
                    ((DoctypeToken)t.CurrentToken).ForceQuirks = true;
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                default:
                    OnMessageRaised(new MissingQuoteIdentifierError());
                    ((DoctypeToken)t.CurrentToken).ForceQuirks = true;
                    t.ChangeTokenState<BogusDoctypeState>();
                    return;
            }
        }
コード例 #25
0
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.GREATER_THAN_SIGN:
             ((TagToken)t.CurrentToken).SelfClosing = true;
             t.EmitToken();
             t.ChangeTokenState<DataState>();
             return;
         case null:
             OnMessageRaised(new SuddenlyEndAtScriptError());
             t.UnConsume(1);
             t.ChangeTokenState<DataState>();
             return;
         default:
             OnMessageRaised(new InvaridAttributeInSelfClosingTagError());
             t.UnConsume(1);
             t.ChangeTokenState<BeforeAttributeNameState>();
             return;
     }
 }
コード例 #26
0
ファイル: BeforeDoctypeNameState.cs プロジェクト: bakera/Test
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    return;
                case Chars.NULL:
                    OnMessageRaised(new NullInDoctypeError());
                    t.ChangeTokenState<DoctypeNameState>();
                    t.CurrentToken = new DoctypeToken(){Name = Chars.REPLACEMENT_CHARACTER.ToString()};
                    return;
                case Chars.GREATER_THAN_SIGN:
                    OnMessageRaised(new EmptyDoctypeError());
                    t.ChangeTokenState<DataState>();
                    t.EmitToken(new DoctypeToken(){ForceQuirks = true});
                    return;
                case null:{
                    OnMessageRaised(new SuddenlyEndAtDoctypeError());
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    t.EmitToken(new DoctypeToken(){ForceQuirks = true});
                    return;
                }
                default:{
                    DoctypeToken result = new DoctypeToken();
                    if(c.IsLatinCapitalLetter()){
                        result.Name = c.ToLower().ToString();
                    } else {
                        result.Name = c.ToString();
                    }
                    t.CurrentToken = result;
                    t.ChangeTokenState<DoctypeNameState>();
                    return;
                }
            }
        }
コード例 #27
0
ファイル: DataState.cs プロジェクト: bakera/Test
 public override void Read(Tokenizer t)
 {
     char? c = t.ConsumeChar();
     switch(c){
         case Chars.AMPERSAND:
             t.ChangeTokenState<CharacterReferenceInDataState>();
             break;
         case Chars.LESS_THAN_SIGN:
             t.ChangeTokenState<TagOpenState>();
             break;
         case Chars.NULL:
             OnMessageRaised(new NullInDataError());
             t.EmitToken(c);
             return;
         case null:
             t.EmitToken(new EndOfFileToken());
             return;
         default:
             t.EmitToken(c);
             return;
     }
 }
コード例 #28
0
ファイル: AfterDoctypeNameState.cs プロジェクト: bakera/Test
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    return;
                case Chars.GREATER_THAN_SIGN:
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case null:{
                    OnMessageRaised(new SuddenlyEndAtDoctypeError());
                    DoctypeToken result = (DoctypeToken)t.CurrentToken;
                    result.ForceQuirks = true;
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                }
                default:
                    if(IsStringMatch(t, DoctypePublicId)){
                        t.ChangeTokenState<AfterDoctypePublicKeywordState>();
                        return;
                    }
                    if(IsStringMatch(t, DoctypeSystemId)){
                        t.ChangeTokenState<AfterDoctypeSystemKeywordState>();
                        return;
                    } else {
                        OnMessageRaised(new UnknownIdentifierInDoctypeError());
                        ((DoctypeToken)t.CurrentToken).ForceQuirks = true;
                        t.ChangeTokenState<BogusDoctypeState>();
                        return;
                    }
            }
        }
コード例 #29
0
ファイル: TagNameState.cs プロジェクト: bakera/Test
        public override void Read(Tokenizer t)
        {
            char? c = t.ConsumeChar();

            switch(c){
                case Chars.CHARACTER_TABULATION:
                case Chars.LINE_FEED:
                case Chars.FORM_FEED:
                case Chars.SPACE:
                    t.ChangeTokenState<BeforeAttributeNameState>();
                    return;
                case Chars.SOLIDUS:
                    t.ChangeTokenState<SelfClosingStartTagState>();
                    return;
                case Chars.GREATER_THAN_SIGN:
                    t.ChangeTokenState<DataState>();
                    t.EmitToken();
                    return;
                case Chars.NULL:
                    OnMessageRaised(new NullInElementNameError());
                    t.CurrentTagToken.Name += Chars.REPLACEMENT_CHARACTER;
                    return;
                case null:
                    OnMessageRaised(new SuddenlyEndAtTagError());
                    t.UnConsume(1);
                    t.ChangeTokenState<DataState>();
                    return;
                default:{
                    TagToken result = (TagToken)t.CurrentToken;
                    if(c.IsLatinCapitalLetter()){
                        result.Name += c.ToLower();
                    } else {
                        result.Name += c;
                    }
                    return;
                }
            }
        }
コード例 #30
0
ファイル: BogusCommentState.cs プロジェクト: bakera/Test
        /*
        Consume every character up to and including the first U+003E GREATER-THAN SIGN character (>) or the end of the file (EOF), whichever comes first. Emit a comment token whose data is the concatenation of all the characters starting from and including the character that caused the state machine to switch into the bogus comment state, up to and including the character immediately before the last consumed character (i.e. up to the character just before the U+003E or EOF character), but with any U+0000 NULL characters replaced by U+FFFD REPLACEMENT CHARACTER characters. (If the comment was started by the end of the file (EOF), the token is empty.)

        Switch to the data state.

        If the end of the file was reached, reconsume the EOF character.
        */
        public override void Read(Tokenizer t)
        {
            if(!(t.CurrentToken is CommentToken)){
                t.CurrentToken = new CommentToken();
                t.CurrentCommentToken.Append(t.CurrentInputChar);
            }
            char? c = t.ConsumeChar();
            switch(c){
                case Chars.GREATER_THAN_SIGN:{
                    t.EmitToken();
                    t.ChangeTokenState<DataState>();
                    return;
                }
                case null:
                    t.UnConsume(1);
                    t.EmitToken();
                    t.ChangeTokenState<DataState>();
                    return;
                default:
                    t.CurrentCommentToken.Append(c);
                    return;
            }
        }