public static void Script(HTMLScriptElement script) { //TODO what kind of object to return here? nothing? just invoke? //script.Src //script.Charset //script.Type throw new NotImplementedException(); }
/// <summary> /// See 8.2.5.4.8 The "text" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void Text(HtmlToken token) { if (token.Type == HtmlTokenType.Character) InsertCharacters(((HtmlCharacterToken)token).Data); else if (token.Type == HtmlTokenType.EOF) { RaiseErrorOccurred(ErrorCode.EOF); CloseCurrentNode(); insert = originalInsert; Consume(token); } else if (token.Type == HtmlTokenType.EndTag) { var tag = (HtmlTagToken)token; if (tag.Name == HTMLScriptElement.Tag) { PerformMicrotaskCheckpoint(); ProvideStableState(); var script = (HTMLScriptElement)CurrentNode; CloseCurrentNode(); insert = originalInsert; var oldInsertion = tokenizer.Stream.InsertionPoint; nesting++; //script.Prepare(); nesting--; if (nesting == 0) pause = false; tokenizer.Stream.InsertionPoint = oldInsertion; if (pendingParsingBlock != null) { if (nesting != 0) { pause = true; return; } do { script = pendingParsingBlock; pendingParsingBlock = null; //TODO Do not call Tokenizer HERE //TODO // 3. If the parser's Document has a style sheet that is blocking scripts or the script's "ready to be parser-executed" // flag is not set: spin the event loop until the parser's Document has no style sheet that is blocking scripts and // the script's "ready to be parser-executed" flag is set. //TODO From here on Tokenizer can be called again oldInsertion = tokenizer.Stream.InsertionPoint; nesting++; //script.Execute(); nesting--; if (nesting == 0) pause = false; tokenizer.Stream.ResetInsertionPoint(); } while (pendingParsingBlock != null); } } else { CloseCurrentNode(); insert = originalInsert; } } }
/// <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); }