/// <summary> /// See 8.2.4.61 Between DOCTYPE public and system identifiers state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeBetween(Char c, HtmlDoctypeToken doctype) { while (c.IsSpaceCharacter()) c = _src.Next; if (c == Specification.GT) { _model = HtmlParseMode.PCData; return doctype; } else if (c == Specification.DQ) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(_src.Next, doctype); } else if (c == Specification.SQ) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(_src.Next, doctype); } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; _src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(_src.Next, doctype); }
/// <summary> /// See 8.2.4.54 DOCTYPE name state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeName(Char c, HtmlDoctypeToken doctype) { while (true) { if (c.IsSpaceCharacter()) { doctype.Name = _stringBuffer.ToString(); _stringBuffer.Clear(); return DoctypeNameAfter(_src.Next, doctype); } else if (c == Specification.GT) { _model = HtmlParseMode.PCData; doctype.Name = _stringBuffer.ToString(); return doctype; } else if (c.IsUppercaseAscii()) _stringBuffer.Append(Char.ToLower(c)); else if (c == Specification.NULL) { RaiseErrorOccurred(ErrorCode.NULL); _stringBuffer.Append(Specification.REPLACEMENT); } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); _src.Back(); doctype.IsQuirksForced = true; doctype.Name = _stringBuffer.ToString(); return doctype; } else _stringBuffer.Append(c); c = _src.Next; } }
/// <summary> /// See 8.2.4.65 DOCTYPE system identifier (single-quoted) state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeSystemIdentifierSingleQuoted(Char c, HtmlDoctypeToken doctype) { while (true) { if (c == Specification.SQ) { doctype.SystemIdentifier = _stringBuffer.ToString(); _stringBuffer.Clear(); return DoctypeSystemIdentifierAfter(_src.Next, doctype); } else if (c == Specification.NULL) { RaiseErrorOccurred(ErrorCode.NULL); _stringBuffer.Append(Specification.REPLACEMENT); } else if (c == Specification.GT) { _model = HtmlParseMode.PCData; RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; doctype.SystemIdentifier = _stringBuffer.ToString(); _src.Back(); return doctype; } else _stringBuffer.Append(c); c = _src.Next; } }
/// <summary> /// See 8.2.4.67 Bogus DOCTYPE state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken BogusDoctype(Char c, HtmlDoctypeToken doctype) { while (true) { if (c == Specification.EOF) { _src.Back(); return doctype; } else if (c == Specification.GT) { _model = HtmlParseMode.PCData; return doctype; } c = _src.Next; } }
/// <summary> /// See 8.2.4.62 After DOCTYPE system keyword state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeSystem(Char c, HtmlDoctypeToken doctype) { if (c.IsSpaceCharacter()) { _model = HtmlParseMode.PCData; return DoctypeSystemIdentifierBefore(_src.Next, doctype); } else if (c == Specification.DQ) { RaiseErrorOccurred(ErrorCode.DoubleQuotationMarkUnexpected); doctype.SystemIdentifier = string.Empty; return DoctypeSystemIdentifierDoubleQuoted(_src.Next, doctype); } else if (c == Specification.SQ) { RaiseErrorOccurred(ErrorCode.SingleQuotationMarkUnexpected); doctype.SystemIdentifier = string.Empty; return DoctypeSystemIdentifierSingleQuoted(_src.Next, doctype); } else if (c == Specification.GT) { RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.SystemIdentifier = _stringBuffer.ToString(); doctype.IsQuirksForced = true; return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; _src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypeSystemInvalid); doctype.IsQuirksForced = true; return BogusDoctype(_src.Next, doctype); }
/// <summary> /// See 8.2.4.66 After DOCTYPE system identifier state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeSystemIdentifierAfter(Char c, HtmlDoctypeToken doctype) { while (c.IsSpaceCharacter()) c = _src.Next; if (c == Specification.GT) { _model = HtmlParseMode.PCData; return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; _src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypeInvalidCharacter); return BogusDoctype(_src.Next, doctype); }
/// <summary> /// See 8.2.4.55 After DOCTYPE name state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeNameAfter(Char c, HtmlDoctypeToken doctype) { while (c.IsSpaceCharacter()) c = _src.Next; if (c == Specification.GT) { _model = HtmlParseMode.PCData; return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); _src.Back(); doctype.IsQuirksForced = true; return doctype; } else if (_src.ContinuesWith("public")) { _src.Advance(5); return DoctypePublic(_src.Next, doctype); } else if (_src.ContinuesWith("system")) { _src.Advance(5); return DoctypeSystem(_src.Next, doctype); } RaiseErrorOccurred(ErrorCode.DoctypeUnexpectedAfterName); doctype.IsQuirksForced = true; return BogusDoctype(_src.Next, doctype); }
/// <summary> /// See 8.2.4.57 Before DOCTYPE public identifier state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypePublicIdentifierBefore(Char c, HtmlDoctypeToken doctype) { while (c.IsSpaceCharacter()) c = _src.Next; if (c == Specification.DQ) { _stringBuffer.Clear(); doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierDoubleQuoted(_src.Next, doctype); } else if (c == Specification.SQ) { _stringBuffer.Clear(); doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierSingleQuoted(_src.Next, doctype); } else if (c == Specification.GT) { _model = HtmlParseMode.PCData; RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.IsQuirksForced = true; return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; _src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypePublicInvalid); doctype.IsQuirksForced = true; return BogusDoctype(_src.Next, doctype); }
/// <summary> /// See 8.2.4.63 Before DOCTYPE system identifier state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypeSystemIdentifierBefore(Char c, HtmlDoctypeToken doctype) { while (Specification.IsSpaceCharacter(c)) c = src.Next; if (c == Specification.DQ) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(src.Next, doctype); } else if (c == Specification.SQ) { doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(src.Next, doctype); } else if (c == Specification.GT) { model = HtmlParseMode.PCData; RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.IsQuirksForced = true; doctype.SystemIdentifier = stringBuffer.ToString(); return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; doctype.SystemIdentifier = stringBuffer.ToString(); src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(src.Next, doctype); }
/// <summary> /// See 8.2.4.58 DOCTYPE public identifier (double-quoted) state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypePublicIdentifierDoubleQuoted(Char c, HtmlDoctypeToken doctype) { while (true) { if (c == Specification.DQ) { doctype.PublicIdentifier = stringBuffer.ToString(); return DoctypePublicIdentifierAfter(src.Next, doctype); ; } else if (c == Specification.NULL) { RaiseErrorOccurred(ErrorCode.NULL); stringBuffer.Append(Specification.REPLACEMENT); } else if (c == Specification.GT) { model = HtmlParseMode.PCData; RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.IsQuirksForced = true; doctype.PublicIdentifier = stringBuffer.ToString(); return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); src.Back(); doctype.IsQuirksForced = true; doctype.PublicIdentifier = stringBuffer.ToString(); return doctype; } else stringBuffer.Append(c); c = src.Next; } }
/// <summary> /// See 8.2.4.60 After DOCTYPE public identifier state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypePublicIdentifierAfter(Char c, HtmlDoctypeToken doctype) { if (Specification.IsSpaceCharacter(c)) { stringBuffer.Clear(); return DoctypeBetween(src.Next, doctype); } else if (c == Specification.GT) { model = HtmlParseMode.PCData; return doctype; } else if (c == Specification.DQ) { RaiseErrorOccurred(ErrorCode.DoubleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierDoubleQuoted(src.Next, doctype); } else if (c == Specification.SQ) { RaiseErrorOccurred(ErrorCode.SingleQuotationMarkUnexpected); doctype.SystemIdentifier = String.Empty; return DoctypeSystemIdentifierSingleQuoted(src.Next, doctype); } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypeInvalidCharacter); doctype.IsQuirksForced = true; return BogusDoctype(src.Next, doctype); }
/// <summary> /// See 8.2.4.56 After DOCTYPE public keyword state /// </summary> /// <param name="c">The next input character.</param> /// <param name="doctype">The current doctype token.</param> /// <returns>The emitted token.</returns> HtmlToken DoctypePublic(Char c, HtmlDoctypeToken doctype) { if (Specification.IsSpaceCharacter(c)) { return DoctypePublicIdentifierBefore(src.Next, doctype); } else if (c == Specification.DQ) { RaiseErrorOccurred(ErrorCode.DoubleQuotationMarkUnexpected); doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierDoubleQuoted(src.Next, doctype); } else if (c == Specification.SQ) { RaiseErrorOccurred(ErrorCode.SingleQuotationMarkUnexpected); doctype.PublicIdentifier = String.Empty; return DoctypePublicIdentifierSingleQuoted(src.Next, doctype); } else if (c == Specification.GT) { model = HtmlParseMode.PCData; RaiseErrorOccurred(ErrorCode.TagClosedWrong); doctype.IsQuirksForced = true; return doctype; } else if (c == Specification.EOF) { RaiseErrorOccurred(ErrorCode.EOF); doctype.IsQuirksForced = true; src.Back(); return doctype; } RaiseErrorOccurred(ErrorCode.DoctypePublicInvalid); doctype.IsQuirksForced = true; return BogusDoctype(src.Next, doctype); }
/// <summary> /// Appends the doctype token to the document. /// </summary> /// <param name="doctypeToken">The doctypen token.</param> void AddDoctype(HtmlDoctypeToken doctypeToken) { var node = new DocumentType(); node.SystemId = doctypeToken.SystemIdentifier; node.PublicId = doctypeToken.PublicIdentifier; node.Name = doctypeToken.Name; doc.AppendChild(node); }