/// <summary> /// See 8.2.5.4.4 The "in head" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void InHead(HtmlToken token) { if (token.Type == HtmlTokenType.Character) { var chars = (HtmlCharacterToken)token; var str = chars.TrimStart(); InsertCharacters(str); if (chars.IsEmpty) return; } else if (token.Type == HtmlTokenType.Comment) { AddComment(CurrentNode, token); return; } else if (token.Type == HtmlTokenType.DOCTYPE) { RaiseErrorOccurred(ErrorCode.DoctypeTagInappropriate); return; } else if (token.IsStartTag(HTMLHtmlElement.Tag)) { InBody(token); return; } else if (token.IsStartTag(HTMLBaseElement.Tag, HTMLBaseFontElement.Tag, HTMLBgsoundElement.Tag, HTMLLinkElement.Tag)) { var name = ((HtmlTagToken)token).Name; var element = HTMLElement.Factory(name); AddElementToCurrentNode(element, token, true); CloseCurrentNode(); return; } else if (token.IsStartTag(HTMLMetaElement.Tag)) { var element = new HTMLMetaElement(); AddElementToCurrentNode(element, token, true); CloseCurrentNode(); var charset = element.GetAttribute(HtmlEncoding.CHARSET); if (charset != null && HtmlEncoding.IsSupported(charset)) { SetCharset(charset); return; } charset = element.GetAttribute("http-equiv"); if (charset != null && charset.Equals("Content-Type", StringComparison.OrdinalIgnoreCase)) { charset = element.GetAttribute("content") ?? string.Empty; charset = HtmlEncoding.Extract(charset); if (HtmlEncoding.IsSupported(charset)) SetCharset(charset); } return; } else if (token.IsStartTag(HTMLTitleElement.Tag)) { RCDataAlgorithm((HtmlTagToken)token); return; } else if (token.IsStartTag(HTMLNoElement.NoFramesTag, HTMLStyleElement.Tag) || (doc.IsScripting && token.IsStartTag(HTMLNoElement.NoScriptTag))) { RawtextAlgorithm((HtmlTagToken)token); return; } else if (token.IsStartTag(HTMLNoElement.NoScriptTag)) { var element = new HTMLElement(); AddElementToCurrentNode(element, token); insert = HtmlTreeMode.InHeadNoScript; return; } else if (token.IsStartTag(HTMLScriptElement.Tag)) { var element = new HTMLScriptElement(); //element.IsParserInserted = true; //element.IsAlreadyStarted = fragment; AddElementToCurrentNode(element, token); tokenizer.Switch(HtmlParseMode.Script); originalInsert = insert; insert = HtmlTreeMode.Text; return; } else if (token.IsEndTag(HTMLHeadElement.Tag)) { CloseCurrentNode(); insert = HtmlTreeMode.AfterHead; return; } else if (token.IsStartTag(HTMLHeadElement.Tag)) { RaiseErrorOccurred(ErrorCode.HeadTagMisplaced); return; } else if (token.IsEndTagInv(HTMLHtmlElement.Tag, HTMLBodyElement.Tag, HTMLBRElement.Tag)) { RaiseErrorOccurred(ErrorCode.TagCannotEndHere); return; } CloseCurrentNode(); insert = HtmlTreeMode.AfterHead; AfterHead(token); }
/// <summary> /// See 8.2.5.4.5 The "in head noscript" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void InHeadNoScript(HtmlToken token) { if (token.Type == HtmlTokenType.DOCTYPE) { RaiseErrorOccurred(ErrorCode.DoctypeTagInappropriate); return; } else if (token.IsStartTag(HTMLHtmlElement.Tag)) { InBody(token); return; } else if (token.IsEndTag(HTMLNoElement.NoScriptTag)) { CloseCurrentNode(); insert = HtmlTreeMode.InHead; return; } else if (token.Type == HtmlTokenType.Character) { var chars = (HtmlCharacterToken)token; var str = chars.TrimStart(); InsertCharacters(str); if (chars.IsEmpty) return; } else if (token.Type == HtmlTokenType.Comment) { InHead(token); return; } else if (token.IsStartTag(HTMLBaseFontElement.Tag, HTMLBgsoundElement.Tag, HTMLLinkElement.Tag, HTMLMetaElement.Tag, HTMLNoElement.NoFramesTag, HTMLStyleElement.Tag)) { InHead(token); return; } else if (token.IsStartTag(HTMLHeadElement.Tag, HTMLNoElement.NoScriptTag)) { RaiseErrorOccurred(ErrorCode.TagInappropriate); return; } else if (token.IsEndTagInv(HTMLBRElement.Tag)) { RaiseErrorOccurred(ErrorCode.TagCannotEndHere); return; } RaiseErrorOccurred(ErrorCode.TokenNotPossible); CloseCurrentNode(); insert = HtmlTreeMode.InHead; InHead(token); }
/// <summary> /// See 8.2.5.4.12 The "in column group" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void InColumnGroup(HtmlToken token) { if (token.Type == HtmlTokenType.Character) { var chars = (HtmlCharacterToken)token; var str = chars.TrimStart(); InsertCharacters(str); } else if (token.Type == HtmlTokenType.Comment) AddComment(CurrentNode, token); else if (token.Type == HtmlTokenType.DOCTYPE) RaiseErrorOccurred(ErrorCode.DoctypeTagInappropriate); else if (token.IsStartTag(HTMLHtmlElement.Tag)) InBody(token); else if (token.IsStartTag(HTMLTableColElement.ColTag)) { var element = new HTMLTableColElement(); AddElementToCurrentNode(element, token, true); CloseCurrentNode(); } else if (token.IsEndTag(HTMLTableColElement.ColgroupTag)) InColumnGroupEndTagColgroup(); else if (token.IsEndTag(HTMLTableColElement.ColTag)) RaiseErrorOccurred(ErrorCode.TagClosedWrong); else if (token.Type == HtmlTokenType.EOF && CurrentNode == doc.DocumentElement) End(); else if (InColumnGroupEndTagColgroup()) InTable(token); }