public static QuirksMode GetQuirksMode(this HtmlDoctypeToken doctype) { if (doctype.IsFullQuirks) { return(QuirksMode.On); } else if (doctype.IsLimitedQuirks) { return(QuirksMode.Limited); } return(QuirksMode.Off); }
private static void DoctypeTokensMatch(HtmlDoctypeToken actualToken, Html5LibTokenizerTestOutputDoctypeToken expectedToken) { // Name if (expectedToken.Name == null) { actualToken.Name.HasValue.Should().BeFalse(); } else { actualToken.Name.HasValue.Should().BeTrue(); actualToken.Name.TryGet(out var actualTokenName); actualTokenName.Should().Be(expectedToken.Name); } // PublicIdentifier if (expectedToken.PublicId == null) { actualToken.PublicIdentifier.HasValue.Should().BeFalse(); } else { actualToken.PublicIdentifier.TryGet(out var actualTokenPublicId); actualTokenPublicId.Should().Be(expectedToken.PublicId); } // SystemIdentifier if (expectedToken.SystemId == null) { actualToken.SystemIdentifier.HasValue.Should().BeFalse(); } else { actualToken.SystemIdentifier.TryGet(out var actualTokenSystemId); actualTokenSystemId.Should().Be(expectedToken.SystemId); } // ForceQuirks actualToken.ForceQuirks.Should().Be(!expectedToken.Correctness); }
/// <summary> /// See 8.2.4.67 Bogus DOCTYPE state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken BogusDoctype(HtmlDoctypeToken doctype) { while (true) { switch (GetNext()) { case Symbols.GreaterThan: _state = HtmlParseMode.PCData; break; case Symbols.EndOfFile: Back(); break; default: continue; } return doctype; } }
/// <summary> /// See 8.2.4.66 After DOCTYPE system identifier state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeSystemIdentifierAfter(HtmlDoctypeToken doctype) { var c = SkipSpaces(); switch (c) { case Symbols.GreaterThan: _state = HtmlParseMode.PCData; break; case Symbols.EndOfFile: RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; Back(); break; default: RaiseErrorOccurred(HtmlParseError.DoctypeInvalidCharacter); return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.65 DOCTYPE system identifier (single-quoted) state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeSystemIdentifierSingleQuoted(HtmlDoctypeToken doctype) { while (true) { var c = GetNext(); switch (c) { case Symbols.SingleQuote: doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); return DoctypeSystemIdentifierAfter(doctype); case Symbols.Null: RaiseErrorOccurred(HtmlParseError.Null); _stringBuffer.Append(Symbols.Replacement); continue; case Symbols.GreaterThan: _state = HtmlParseMode.PCData; RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); break; case Symbols.EndOfFile: RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); Back(); break; default: _stringBuffer.Append(c); continue; } return doctype; } }
/// <summary> /// See 8.2.4.64 DOCTYPE system identifier (double-quoted) state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeSystemIdentifierDoubleQuoted(HtmlDoctypeToken doctype) { while (true) { var c = GetNext(); if (c == Symbols.DoubleQuote) { doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); return DoctypeSystemIdentifierAfter(doctype); } else if (c == Symbols.Null) { RaiseErrorOccurred(HtmlParseError.Null); _stringBuffer.Append(Symbols.Replacement); } else if (c == Symbols.GreaterThan) { _state = HtmlParseMode.PCData; RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); break; } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); Back(); break; } else { _stringBuffer.Append(c); } } return doctype; }
/// <summary> /// See 8.2.4.63 Before DOCTYPE system identifier state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeSystemIdentifierBefore(HtmlDoctypeToken doctype) { var c = SkipSpaces(); if (c == Symbols.DoubleQuote) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(doctype); } else if (c == Symbols.SingleQuote) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(doctype); } else if (c == Symbols.GreaterThan) { _state = HtmlParseMode.PCData; RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); Back(); } else { RaiseErrorOccurred(HtmlParseError.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.60 After DOCTYPE public identifier state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypePublicIdentifierAfter(HtmlDoctypeToken doctype) { var c = GetNext(); if (c.IsSpaceCharacter()) { return DoctypeBetween(doctype); } else if (c == Symbols.GreaterThan) { _state = HtmlParseMode.PCData; } else if (c == Symbols.DoubleQuote) { RaiseErrorOccurred(HtmlParseError.DoubleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(doctype); } else if (c == Symbols.SingleQuote) { RaiseErrorOccurred(HtmlParseError.SingleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(doctype); } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; Back(); } else { RaiseErrorOccurred(HtmlParseError.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.55 After DOCTYPE name state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeNameAfter(HtmlDoctypeToken doctype) { var c = SkipSpaces(); if (c == Symbols.GreaterThan) { _state = HtmlParseMode.PCData; } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); Back(); doctype.IsQuirksForced = true; } else if (ContinuesWith("public")) { Advance(5); return DoctypePublic(doctype); } else if (ContinuesWith("system")) { Advance(5); return DoctypeSystem(doctype); } else { RaiseErrorOccurred(HtmlParseError.DoctypeUnexpectedAfterName); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.54 DOCTYPE name state /// </summary> /// <param name="doctype">The current doctype token.</param> HtmlToken DoctypeName(HtmlDoctypeToken doctype) { while (true) { var c = GetNext(); if (c.IsSpaceCharacter()) { doctype.Name = _stringBuffer.ToString(); _stringBuffer.Clear(); return DoctypeNameAfter(doctype); } else if (c == Symbols.GreaterThan) { _state = HtmlParseMode.PCData; doctype.Name = _stringBuffer.ToString(); _stringBuffer.Clear(); break; } else if (c.IsUppercaseAscii()) { _stringBuffer.Append(Char.ToLower(c)); } else if (c == Symbols.Null) { RaiseErrorOccurred(HtmlParseError.Null); _stringBuffer.Append(Symbols.Replacement); } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); Back(); doctype.IsQuirksForced = true; doctype.Name = _stringBuffer.ToString(); _stringBuffer.Clear(); break; } else { _stringBuffer.Append(c); } } return doctype; }
/// <summary> /// See 8.2.4.62 After DOCTYPE system keyword state /// </summary> /// <param name="doctype">The current doctype token.</param> private HtmlToken DoctypeSystem(HtmlDoctypeToken doctype) { var c = GetNext(); if (c.IsSpaceCharacter()) { State = HtmlParseMode.PCData; return DoctypeSystemIdentifierBefore(doctype); } else if (c == Symbols.DoubleQuote) { RaiseErrorOccurred(HtmlParseError.DoubleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(doctype); } else if (c == Symbols.SingleQuote) { RaiseErrorOccurred(HtmlParseError.SingleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(doctype); } else if (c == Symbols.GreaterThan) { RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.SystemIdentifier = FlushBuffer(); doctype.IsQuirksForced = true; } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; Back(); } else { RaiseErrorOccurred(HtmlParseError.DoctypeSystemInvalid); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.61 Between DOCTYPE public and system identifiers state /// </summary> /// <param name="doctype">The current doctype token.</param> private HtmlToken DoctypeBetween(HtmlDoctypeToken doctype) { var c = SkipSpaces(); if (c == Symbols.GreaterThan) { State = HtmlParseMode.PCData; } else if (c == Symbols.DoubleQuote) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(doctype); } else if (c == Symbols.SingleQuote) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(doctype); } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; Back(); } else { RaiseErrorOccurred(HtmlParseError.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }
/// <summary> /// See 8.2.4.59 DOCTYPE public identifier (single-quoted) state /// </summary> /// <param name="doctype">The current doctype token.</param> private HtmlToken DoctypePublicIdentifierSingleQuoted(HtmlDoctypeToken doctype) { while (true) { var c = GetNext(); if (c == Symbols.SingleQuote) { doctype.PublicIdentifier = FlushBuffer(); return DoctypePublicIdentifierAfter(doctype); } else if (c == Symbols.Null) { AppendReplacement(); } else if (c == Symbols.GreaterThan) { State = HtmlParseMode.PCData; RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.IsQuirksForced = true; doctype.PublicIdentifier = FlushBuffer(); break; } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; doctype.PublicIdentifier = FlushBuffer(); Back(); break; } else { StringBuffer.Append(c); } } return doctype; }
/// <summary> /// See 8.2.4.57 Before DOCTYPE public identifier state /// </summary> /// <param name="doctype">The current doctype token.</param> private HtmlToken DoctypePublicIdentifierBefore(HtmlDoctypeToken doctype) { var c = SkipSpaces(); if (c == Symbols.DoubleQuote) { doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierDoubleQuoted(doctype); } else if (c == Symbols.SingleQuote) { doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierSingleQuoted(doctype); } else if (c == Symbols.GreaterThan) { State = HtmlParseMode.PCData; RaiseErrorOccurred(HtmlParseError.TagClosedWrong); doctype.IsQuirksForced = true; } else if (c == Symbols.EndOfFile) { RaiseErrorOccurred(HtmlParseError.EOF); doctype.IsQuirksForced = true; Back(); } else { RaiseErrorOccurred(HtmlParseError.DoctypePublicInvalid); doctype.IsQuirksForced = true; return BogusDoctype(doctype); } return doctype; }