mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-20 05:42:34 +03:00
370da47fa0
git-svn-id: svn://kolibrios.org@3584 a494cfbc-eb01-0410-851d-a64ba20cac60
2783 lines
145 KiB
HTML
2783 lines
145 KiB
HTML
<!DOCTYPE HTML>
|
||
|
||
|
||
<html lang="en-GB-hixie">
|
||
<head>
|
||
<title>HTML 5</title>
|
||
<link href="/style/specification" type="text/css" rel="stylesheet">
|
||
<link href="/images/icon" rel="icon">
|
||
|
||
<style type="text/css">
|
||
h4 + .element { margin-top: -2.5em; padding-top: 2em; }
|
||
h4 + p + .element { margin-top: -5em; padding-top: 4em; }
|
||
.element { background: #EEFFEE; color: black; margin: 0 0 1em -1em; padding: 0 1em 0.25em 0.75em; border-left: solid #99FF99 0.25em; -padding: 0; /* that last decl is for IE6. Try removing it, it's hilarious! */ }
|
||
.proposal { border: blue solid; padding: 1em; }
|
||
table.matrix, table.matrix td { border: none; text-align: right; }
|
||
table.matrix { margin-left: 2em; }
|
||
</style>
|
||
|
||
<link href="section-tokenisation.html#nav-bar" rel="prev" title="8.2.3. Tokenisation"><link href="index.html#contents" rel="index" title="Table of contents"><link href="section-namespaces.html#nav-bar" rel="next" title="8.3. Namespaces"></head><body class="draft"><div class="head">
|
||
<p><a href="http://www.whatwg.org/" class="logo" rel="home"><img src="/images/logo" alt="WHATWG"></a></p>
|
||
|
||
<h1 id="html-5">HTML 5</h1>
|
||
|
||
<h2 id="working" class="no-num no-toc">Working Draft — 12 June 2007</h2></div><nav id="nav-bar"><a href="section-tokenisation.html#nav-bar">< 8.2.3. Tokenisation</a> – <a href="index.html#contents">Table of contents</a> – <a href="section-namespaces.html#nav-bar">8.3. Namespaces ></a></nav><h4 id="tree-construction"><span class="secno">8.2.4. </span><dfn id="tree-construction0">Tree construction</dfn></h4>
|
||
|
||
<p>The input to the tree construction stage is a sequence of tokens from
|
||
the <a href="section-tokenisation.html#tokenisation0">tokenisation</a> stage. The tree construction
|
||
stage is associated with a DOM <code>Document</code> object when a parser
|
||
is created. The "output" of this stage consists of dynamically modifying
|
||
or extending that document's DOM tree.
|
||
|
||
</p><p>Tree construction passes through several phases. Initially, UAs must act
|
||
according to the steps described as being those of <a href="#the-initial0">the initial phase</a>.
|
||
|
||
</p><p>This specification does not define when an interactive user agent has to
|
||
render the <code>Document</code> available to the user, or when it has to
|
||
begin accepting user input.
|
||
|
||
</p><p>When the steps below require the UA to <dfn id="append">append a
|
||
character</dfn> to a node, the UA must collect it and all subsequent
|
||
consecutive characters that would be appended to that node, and insert one
|
||
<code>Text</code> node whose data is the concatenation of all those
|
||
characters.
|
||
|
||
</p><p id="mutation-during-parsing">DOM mutation events must not fire for changes
|
||
caused by the UA parsing the document. (Conceptually, the parser is not
|
||
mutating the DOM, it is constructing it.) This includes the parsing of any
|
||
content inserted using <code title="dom-document-write-HTML"><a href="section-dynamic.html#document.write0">document.write()</a></code> and <code title="dom-document-writeln"><a href="section-dynamic.html#document.writeln">document.writeln()</a></code> calls.<!--
|
||
XXX xref -->
|
||
<a href="#refsDOM3EVENTS">[DOM3EVENTS]</a></p>
|
||
<!-- XXX
|
||
what abotu innerHTML? -->
|
||
|
||
<p class="note">Not all of the tag names mentioned below are conformant tag
|
||
names in this specification; many are included to handle legacy content.
|
||
They still form part of the algorithm that implementations are required to
|
||
implement to claim conformance.
|
||
|
||
</p><p class="note">The algorithm described below places no limit on the depth of
|
||
the DOM tree generated, or on the length of tag names, attribute names,
|
||
attribute values, text nodes, etc. While implementators are encouraged to
|
||
avoid arbitrary limits, it is recognised that <a href="section-conformance.html#hardwareLimitations">practical concerns</a> will likely force user
|
||
agents to impose nesting depths.
|
||
|
||
</p><h5 id="the-initial"><span class="secno">8.2.4.1. </span><dfn id="the-initial0">The initial phase</dfn></h5>
|
||
|
||
<p>Initially, the tree construction stage must handle each token emitted
|
||
from the <a href="section-tokenisation.html#tokenisation0">tokenisation</a> stage as follows:
|
||
|
||
</p><dl class="switch">
|
||
<dt>A DOCTYPE token that is marked as being in error
|
||
|
||
</dt><dt>A comment token
|
||
|
||
</dt><dt>A start tag token
|
||
|
||
</dt><dt>An end tag token
|
||
|
||
</dt><dt>A character token that is not one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM
|
||
FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dt>An end-of-file token
|
||
|
||
</dt><dd>
|
||
<p>This specification does not define how to handle this case. In
|
||
particular, user agents may ignore the entirety of this specification
|
||
altogether for such documents, and instead invoke special parse modes
|
||
with a greater emphasis on backwards compatibility.</p>
|
||
|
||
<div class="note">
|
||
<p>Browsers in particular have generally used DOCTYPE-based sniffing to
|
||
invoke an "alternative conformance mode" known as <em>quirks mode</em>
|
||
on certain documents. In this mode, emphasis is put on legacy
|
||
compatibility rather than on standards compliance. This specification
|
||
takes no position on this behaviour; documents without DOCTYPEs or with
|
||
DOCTYPEs that do not conform to the syntax allowed by this
|
||
specification are considered to be out of scope of this specification.</p>
|
||
</div>
|
||
|
||
<div class="big-issue">
|
||
<p>As far as parsing goes, the quirks I know of are:</p>
|
||
|
||
<ul>
|
||
<li>Comment parsing is different.
|
||
|
||
</li><li>The following is considered one script block (!):
|
||
<pre><script><!-- document.write('</script>'); --></script></pre>
|
||
|
||
</li><li><code title=""></br></code> and <code title=""></p></code> do
|
||
magical things.
|
||
|
||
</li><li><code><a href="section-prose.html#p">p</a></code> can contain <code><a href="section-tabular.html#table">table</a></code>
|
||
|
||
</li><li>Safari and IE have special parsing rules for <% ... %> (even
|
||
in standards mode, though clearly this should be quirks-only).
|
||
</li></ul>
|
||
|
||
<p>Maybe we should just adopt all those and be done with it. One parsing
|
||
mode to rule them all. Or legitimise/codify the quirks mode parsing in
|
||
some way.</p>
|
||
|
||
<p>Would be interesting to do a search to see how many pages hit each of
|
||
the above.</p>
|
||
<!-- biased by page rank? --></div>
|
||
|
||
</dd><dt>A DOCTYPE token marked as being correct
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>DocumentType</code> node to the <code>Document</code>
|
||
node, with the <code title="">name</code> attribute set to the name
|
||
given in the DOCTYPE token (which will be "HTML"), and the other
|
||
attributes specific to <code>DocumentType</code> objects set to null,
|
||
empty lists, or the empty string as appropriate.</p>
|
||
|
||
<p>Then, switch to <a href="#the-root1">the root element phase</a> of the
|
||
tree construction stage.</p>
|
||
<!-- XXX should set doctype on the Document object, too, unless
|
||
spec is defined to already point to it if you append -->
|
||
|
||
|
||
</dd><dt>A character token that <em>is</em> one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM
|
||
FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append that character</a>
|
||
to the <code>Document</code> node.</p>
|
||
</dd></dl>
|
||
|
||
<h5 id="the-root0"><span class="secno">8.2.4.2. </span><dfn id="the-root1">The
|
||
root element phase</dfn></h5>
|
||
|
||
<p>After <a href="#the-initial0">the initial phase</a>, as each token is
|
||
emitted from the <a href="section-tokenisation.html#tokenisation0">tokenisation</a> stage, it must
|
||
be processed as described in this section.
|
||
|
||
</p><dl class="switch">
|
||
<dt>A DOCTYPE token
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <code>Document</code> object
|
||
with the <code title="">data</code> attribute set to the data given in
|
||
the comment token.</p>
|
||
|
||
</dd><dt>A character token that is one of one of U+0009 CHARACTER TABULATION,
|
||
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
|
||
U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append that character</a>
|
||
to the <code>Document</code> node.</p>
|
||
|
||
</dd><dt>A character token that is <em>not</em> one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM
|
||
FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dt>A start tag token
|
||
|
||
</dt><dt>An end tag token
|
||
|
||
</dt><dt>An end-of-file token
|
||
|
||
</dt><dd>
|
||
<p>Create an <code><a href="section-elements.html#htmlelement">HTMLElement</a></code> node
|
||
with the tag name <code><a href="section-the-root.html#html">html</a></code>, in the <a href="section-namespaces.html#html-namespace0">HTML namespace</a>. Append it to the
|
||
<code>Document</code> object. Switch to <a href="#the-main0">the main
|
||
phase</a> and reprocess the current token.</p>
|
||
|
||
<p class="big-issue">Should probably make end tags be ignored, so that
|
||
"</head><!-- --><html>" puts the comment befor the root node
|
||
(or should we?)</p>
|
||
</dd></dl>
|
||
|
||
<p>The root element can end up being removed from the <code>Document</code>
|
||
object, e.g. by scripts; nothing in particular happens in such cases,
|
||
content continues being appended to the nodes as described in the next
|
||
section.
|
||
|
||
</p><h5 id="the-main"><span class="secno">8.2.4.3. </span><dfn id="the-main0">The
|
||
main phase</dfn></h5>
|
||
|
||
<p>After <a href="#the-root1">the root element phase</a>, each token
|
||
emitted from the <a href="section-tokenisation.html#tokenisation0">tokenisation</a> stage must be
|
||
processed as described in <em>this</em> section. This is by far the most
|
||
involved part of parsing an HTML document.
|
||
|
||
</p><p>The tree construction stage in this phase has several pieces of state: a
|
||
<a href="#stack">stack of open elements</a>, a <a href="#list-of4">list of
|
||
active formatting elements</a>, a <a href="#head-element"><code title="">head</code> element pointer</a>, a <a href="#form-element"><code title="">form</code> element pointer</a>, and an <a href="#insertion0">insertion mode</a>.
|
||
|
||
</p><p class="big-issue">We could just fold insertion modes and phases into one
|
||
concept (and duplicate the two rules common to all insertion modes into
|
||
all of them).
|
||
|
||
</p><h6 id="the-stack"><span class="secno">8.2.4.3.1. </span>The stack of open
|
||
elements</h6>
|
||
|
||
<p>Initially the <dfn id="stack">stack of open elements</dfn> contains just
|
||
the <code><a href="section-the-root.html#html">html</a></code> root element node created in the
|
||
<a href="#the-root1" title="the root element phase">last phase</a> before
|
||
switching to <em>this</em> phase (or, in the <a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>, the <code><a href="section-the-root.html#html">html</a></code> element created to represent the element
|
||
whose <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code> attribute is being set). That's
|
||
the topmost node of the stack. It never gets popped off the stack. (This
|
||
stack grows downwards.)
|
||
|
||
</p><p>The <dfn id="current4">current node</dfn> is the bottommost node in this
|
||
stack.
|
||
|
||
</p><p>Elements in the stack fall into the following categories:
|
||
|
||
</p><dl>
|
||
<dt><dfn id="special">Special</dfn>
|
||
|
||
</dt><dd>
|
||
<p>The following HTML elements have varying levels of special parsing
|
||
rules: <code><a href="section-sections.html#address">address</a></code>, <code><a href="section-the-canvas.html#area">area</a></code>, <code><a href="section-document.html#base">base</a></code>,
|
||
<code>basefont</code>, <code>bgsound</code>, <code><a href="section-sections.html#blockquote">blockquote</a></code>, <code><a href="section-sections.html#body0">body</a></code>, <code><a href="section-prose.html#br">br</a></code>,
|
||
<code>center</code>, <code><a href="section-tabular.html#col">col</a></code>, <code><a href="section-tabular.html#colgroup">colgroup</a></code>, <code><a href="section-lists0.html#dd">dd</a></code>,
|
||
<code>dir</code>, <code><a href="section-miscellaneous.html#div">div</a></code>, <code><a href="section-lists0.html#dl">dl</a></code>, <code><a href="section-lists0.html#dt">dt</a></code>, <code><a href="section-embedded.html#embed">embed</a></code>, <code>fieldset</code>,
|
||
<code>form</code>, <code>frame</code>, <code>frameset</code>, <code><a href="section-sections.html#h1">h1</a></code>, <code><a href="section-sections.html#h2">h2</a></code>, <code><a href="section-sections.html#h3">h3</a></code>, <code><a href="section-sections.html#h4">h4</a></code>, <code><a href="section-sections.html#h5">h5</a></code>, <code><a href="section-sections.html#h6">h6</a></code>, <code><a href="section-document.html#head">head</a></code>, <code><a href="section-prose.html#hr">hr</a></code>,
|
||
<code><a href="section-embedded.html#iframe">iframe</a></code>,
|
||
<code>image</code><!-- XXX ? this isn't an element that can end up
|
||
on the stack-->,
|
||
<code><a href="section-embedded.html#img">img</a></code>, <code>input</code>,
|
||
<code>isindex</code>, <code><a href="section-lists0.html#li">li</a></code>, <code><a href="section-document.html#link">link</a></code>, <code>listing</code>, <code><a href="section-the-command.html#menu">menu</a></code>, <code><a href="section-document.html#meta0">meta</a></code>,
|
||
<code>noembed</code>, <code>noframes</code>, <code><a href="section-scripting0.html#noscript">noscript</a></code>, <code><a href="section-lists0.html#ol">ol</a></code>,
|
||
<code>optgroup</code>, <code>option</code>, <code><a href="section-prose.html#p">p</a></code>, <code><a href="section-embedded.html#param">param</a></code>,
|
||
<code>plaintext</code>, <code><a href="section-preformatted.html#pre">pre</a></code>, <code><a href="section-scripting0.html#script0">script</a></code>, <code>select</code>,
|
||
<code>spacer</code>, <code><a href="section-document.html#style">style</a></code>, <code><a href="section-tabular.html#tbody">tbody</a></code>, <code>textarea</code>, <code><a href="section-tabular.html#tfoot0">tfoot</a></code>, <code><a href="section-tabular.html#thead0">thead</a></code>, <code><a href="section-document.html#title1">title</a></code>, <code><a href="section-tabular.html#tr">tr</a></code>,
|
||
<code><a href="section-lists0.html#ul">ul</a></code>, and <code>wbr</code>.
|
||
|
||
</p></dd><dt><dfn id="scoping">Scoping</dfn>
|
||
|
||
</dt><dd>
|
||
<p>The following HTML elements introduce new <a href="#have-an" title="has an element in scope">scopes</a> for various parts of the
|
||
parsing: <code>button</code>, <code><a href="section-tabular.html#caption0">caption</a></code>, <code><a href="section-the-root.html#html">html</a></code>, <code>marquee</code>, <code><a href="section-embedded.html#object">object</a></code>, <code><a href="section-tabular.html#table">table</a></code>, <code><a href="section-tabular.html#td">td</a></code> and
|
||
<code><a href="section-tabular.html#th">th</a></code>.
|
||
|
||
</p></dd><dt><dfn id="formatting">Formatting</dfn>
|
||
|
||
</dt><dd>
|
||
<p>The following HTML elements are those that end up in the <a href="#list-of4">list of active formatting elements</a>: <code><a href="section-phrase.html#a">a</a></code>, <code><a href="section-phrase.html#b">b</a></code>,
|
||
<code>big</code>, <code><a href="section-phrase.html#em">em</a></code>, <code><a href="section-presentational.html#font">font</a></code>, <code><a href="section-phrase.html#i">i</a></code>,
|
||
<code>nobr</code>, <code>s</code>, <code><a href="section-phrase.html#small">small</a></code>, <code>strike</code>, <code><a href="section-phrase.html#strong">strong</a></code>, <code>tt</code>, and <code>u</code>.
|
||
|
||
</p></dd><dt><dfn id="phrasing">Phrasing</dfn>
|
||
|
||
</dt><dd>
|
||
<p>All other elements found while parsing an HTML document.
|
||
</p></dd></dl>
|
||
|
||
<p class="big-issue">Still need to add these new elements to the lists:
|
||
<code><a href="section-scripting0.html#event-source">event-source</a></code>, <code><a href="section-sections.html#section">section</a></code>, <code><a href="section-sections.html#nav">nav</a></code>,
|
||
<code><a href="section-sections.html#article">article</a></code>, <code><a href="section-sections.html#aside">aside</a></code>, <code><a href="section-sections.html#header">header</a></code>,
|
||
<code><a href="section-sections.html#footer">footer</a></code>, <code><a href="section-interactive.html#datagrid0">datagrid</a></code>, <code><a href="section-the-command.html#command0">command</a></code>
|
||
|
||
</p><p>The <a href="#stack">stack of open elements</a> is said to <dfn id="have-an" title="has an element in scope">have an element in scope</dfn>
|
||
or <dfn id="have-an0" title="has an element in table scope">have an element
|
||
in <em>table scope</em></dfn> when the following algorithm terminates in a
|
||
match state:
|
||
|
||
</p><ol>
|
||
<li>
|
||
<p>Initialise <var title="">node</var> to be the <a href="#current4">current node</a> (the bottommost node of the stack).
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> is the target node, terminate in a match
|
||
state.
|
||
|
||
</p></li><li>
|
||
<p>Otherwise, if <var title="">node</var> is a <code><a href="section-tabular.html#table">table</a></code> element, terminate in a failure state.
|
||
|
||
</p></li><li>
|
||
<p>Otherwise, if the algorithm is the "has an element in scope" variant
|
||
(rather than the "has an element in table scope" variant), and <var title="">node</var> is one of the following, terminate in a failure
|
||
state:</p>
|
||
|
||
<ul class="brief">
|
||
<li><code><a href="section-tabular.html#caption0">caption</a></code>
|
||
|
||
</li><li><code><a href="section-tabular.html#td">td</a></code>
|
||
|
||
</li><li><code><a href="section-tabular.html#th">th</a></code>
|
||
|
||
</li><li><code>button</code>
|
||
|
||
</li><li><code>marquee</code>
|
||
|
||
</li><li><code><a href="section-embedded.html#object">object</a></code>
|
||
</li></ul>
|
||
|
||
</li><li>
|
||
<p>Otherwise, if <var title="">node</var> is an <code><a href="section-the-root.html#html">html</a></code> element, terminate in a failure state.
|
||
(This can only happen if the <var title="">node</var> is the topmost
|
||
node of the <a href="#stack">stack of open elements</a>, and prevents
|
||
the next step from being invoked if there are no more elements in the
|
||
stack.)
|
||
|
||
</p></li><li>
|
||
<p>Otherwise, set <var title="">node</var> to the previous entry in the
|
||
<a href="#stack">stack of open elements</a> and return to step 2. (This
|
||
will never fail, since the loop will always terminate in the previous
|
||
step if the top of the stack is reached.)
|
||
</p></li></ol>
|
||
|
||
<p>Nothing happens if at any time any of the elements in the <a href="#stack">stack of open elements</a> are moved to a new location in,
|
||
or removed from, the <code>Document</code> tree. In particular, the stack
|
||
is not changed in this situation. This can cause, amongst other strange
|
||
effects, content to be appended to nodes that are no longer in the DOM.
|
||
|
||
</p><p class="note">In some cases (namely, when <a href="#adoptionAgency">closing
|
||
misnested formatting elements</a>), the stack is manipulated in a
|
||
random-access fashion.
|
||
|
||
</p><h6 id="the-list"><span class="secno">8.2.4.3.2. </span>The list of active
|
||
formatting elements</h6>
|
||
|
||
<p>Initially the <dfn id="list-of4">list of active formatting elements</dfn>
|
||
is empty. It is used to handle mis-nested <a href="#formatting" title="formatting">formatting element tags</a>.
|
||
|
||
</p><p>The list contains elements in the <a href="#formatting">formatting</a>
|
||
category, and scope markers. The scope markers are inserted when entering
|
||
buttons, <code><a href="section-embedded.html#object">object</a></code> elements, marquees,
|
||
table cells, and table captions, and are used to prevent formatting from
|
||
"leaking" into tables, buttons, <code><a href="section-embedded.html#object">object</a></code>
|
||
elements, and marquees.
|
||
|
||
</p><p>When the steps below require the UA to <dfn id="reconstruct">reconstruct
|
||
the active formatting elements</dfn>, the UA must perform the following
|
||
steps:
|
||
|
||
</p><ol>
|
||
<li>If there are no entries in the <a href="#list-of4">list of active
|
||
formatting elements</a>, then there is nothing to reconstruct; stop this
|
||
algorithm.
|
||
|
||
</li><li>If the last (most recently added) entry in the <a href="#list-of4">list of active formatting elements</a> is a marker, or
|
||
if it is an element that is in the <a href="#stack">stack of open
|
||
elements</a>, then there is nothing to reconstruct; stop this algorithm.
|
||
|
||
</li><li>Let <var title="">entry</var> be the last (most recently added)
|
||
element in the <a href="#list-of4">list of active formatting
|
||
elements</a>.
|
||
|
||
</li><li>If there are no entries before <var title="">entry</var> in the <a href="#list-of4">list of active formatting elements</a>, then jump to
|
||
step 8.
|
||
|
||
</li><li>Let <var title="">entry</var> be the entry one earlier than <var title="">entry</var> in the <a href="#list-of4">list of active formatting
|
||
elements</a>.
|
||
|
||
</li><li>If <var title="">entry</var> is neither a marker nor an element that
|
||
is also in the <a href="#stack">stack of open elements</a>, go to step 4.
|
||
|
||
</li><li>Let <var title="">entry</var> be the element one later than <var title="">entry</var> in the <a href="#list-of4">list of active formatting
|
||
elements</a>.
|
||
|
||
</li><li>Perform a shallow clone of the element <var title="">entry</var> to
|
||
obtain <var title="">clone</var>. <a href="#refsDOM3CORE">[DOM3CORE]</a>
|
||
|
||
</li><li>Append <var title="">clone</var> to the <a href="#current4">current
|
||
node</a> and push it onto the <a href="#stack">stack of open elements</a>
|
||
so that it is the new <a href="#current4">current node</a>.
|
||
|
||
</li><li>Replace the entry for <var title="">entry</var> in the list with an
|
||
entry for <var title="">clone</var>.
|
||
|
||
</li><li>If the entry for <var title="">clone</var> in the <a href="#list-of4">list of active formatting elements</a> is not the last
|
||
entry in the list, return to step 7.
|
||
</li></ol>
|
||
|
||
<p>This has the effect of reopening all the formatting elements that were
|
||
opened in the current body, cell, or caption (whichever is youngest) that
|
||
haven't been explicitly closed.
|
||
|
||
</p><p class="note">The way this specification is written, the <a href="#list-of4">list of active formatting elements</a> always consists of
|
||
elements in chronological order with the least recently added element
|
||
first and the most recently added element last (except for while steps 8
|
||
to 11 of the above algorithm are being executed, of course).
|
||
|
||
</p><p>When the steps below require the UA to <dfn id="clear0">clear the list of
|
||
active formatting elements up to the last marker</dfn>, the UA must
|
||
perform the following steps:
|
||
|
||
</p><ol>
|
||
<li>Let <var title="">entry</var> be the last (most recently added) entry
|
||
in the <a href="#list-of4">list of active formatting elements</a>.
|
||
|
||
</li><li>Remove <var title="">entry</var> from the <a href="#list-of4">list of
|
||
active formatting elements</a>.
|
||
|
||
</li><li>If <var title="">entry</var> was a marker, then stop the algorithm at
|
||
this point. The list has been cleared up to the last marker.
|
||
|
||
</li><li>Go to step 1.
|
||
</li></ol>
|
||
|
||
<h6 id="creating"><span class="secno">8.2.4.3.3. </span>Creating and inserting
|
||
HTML elements</h6>
|
||
|
||
<p>When the steps below require the UA to <dfn id="create" title="create an
|
||
element for the token">create an element for a token</dfn>, the UA must
|
||
create a node implementing the interface appropriate for the element type
|
||
corresponding to the tag name of the token (as given in the section of
|
||
this specification that defines that element, e.g. for an <code><a href="section-phrase.html#a">a</a></code> element it would be the <code><a href="section-phrase.html#htmlanchorelement">HTMLAnchorElement</a></code> interface), with
|
||
the tag name being the name of that element, with the node being in the <a href="section-namespaces.html#html-namespace0">HTML namespace</a>, and with the attributes on the
|
||
node being those given in the given token.
|
||
|
||
</p><p>When the steps below require the UA to <dfn id="insert">insert an HTML
|
||
element</dfn> for a token, the UA must first <a href="#create">create an
|
||
element for the token</a>, and then append this node to the <a href="#current4">current node</a>, and push it onto the <a href="#stack">stack of open elements</a> so that it is the new <a href="#current4">current node</a>.
|
||
|
||
</p><p>The steps below may also require that the UA insert an HTML element in a
|
||
particular place, in which case the UA must <a href="#create">create an
|
||
element for the token</a> and then insert or append the new node in the
|
||
location specified. (This happens in particular during the parsing of
|
||
tables with invalid content.)
|
||
|
||
</p><p>The interface appropriate for an element that is not defined in this
|
||
specification is <code><a href="section-elements.html#htmlelement">HTMLElement</a></code>.
|
||
|
||
</p><h6 id="closing"><span class="secno">8.2.4.3.4. </span>Closing elements that
|
||
have implied end tags</h6>
|
||
|
||
<p>When the steps below require the UA to <dfn id="generate">generate implied
|
||
end tags</dfn>, then, if the <a href="#current4">current node</a> is a
|
||
<code><a href="section-lists0.html#dd">dd</a></code> element, a <code><a href="section-lists0.html#dt">dt</a></code> element, an <code><a href="section-lists0.html#li">li</a></code>
|
||
element, a <code><a href="section-prose.html#p">p</a></code> element, a <code><a href="section-tabular.html#td">td</a></code> element, a <code><a href="section-tabular.html#th">th</a></code>
|
||
element, or a <code><a href="section-tabular.html#tr">tr</a></code> element, the UA must act
|
||
as if an end tag with the respective tag name had been seen and then <a href="#generate">generate implied end tags</a> again.
|
||
|
||
</p><p>The step that requires the UA to generate implied end tags but lists an
|
||
element to exclude from the process, then the UA must perform the above
|
||
steps as if that element was not in the above list.
|
||
|
||
</p><h6 id="the-element"><span class="secno">8.2.4.3.5. </span>The element pointers</h6>
|
||
|
||
<p>Initially the <dfn id="head-element"><code title="">head</code> element
|
||
pointer</dfn> and the <dfn id="form-element"><code title="">form</code>
|
||
element pointer</dfn> are both null.
|
||
|
||
</p><p>Once a <code><a href="section-document.html#head">head</a></code> element has been parsed
|
||
(whether implicitly or explicitly) the <a href="#head-element"><code title="">head</code> element pointer</a> gets set to point to this node.
|
||
|
||
</p><p>The <a href="#form-element"><code title="">form</code> element
|
||
pointer</a> points to the last <code>form</code> element that was opened
|
||
and whose end tag has not yet been seen. It is used to make form controls
|
||
associate with forms in the face of dramatically bad markup, for
|
||
historical reasons.
|
||
|
||
</p><h6 id="the-insertion"><span class="secno">8.2.4.3.6. </span>The insertion mode</h6>
|
||
|
||
<p>Initially the <dfn id="insertion0">insertion mode</dfn> is "<a href="#before2" title="insertion mode: before head">before head</a>". It
|
||
can change to "<a href="#in-head" title="insertion mode: in head">in
|
||
head</a>", "<a href="#after1" title="insertion mode: after head">after
|
||
head</a>", "<a href="#in-body" title="insertion mode: in body">in
|
||
body</a>", "<a href="#in-table" title="insertion mode: in table">in
|
||
table</a>", "<a href="#in-caption" title="insertion mode: in caption">in
|
||
caption</a>", "<a href="#in-column" title="insertion mode: in column
|
||
group">in column group</a>", "<a href="#in-table0" title="insertion mode:
|
||
in table body">in table body</a>", "<a href="#in-row" title="insertion
|
||
mode: in row">in row</a>", "<a href="#in-cell" title="insertion mode: in
|
||
cell">in cell</a>", "<a href="#in-select" title="insertion mode: in
|
||
select">in select</a>", "<a href="#after2" title="insertion mode: after
|
||
body">after body</a>", "<a href="#in-frameset" title="insertion mode: in
|
||
frameset">in frameset</a>", and "<a href="#after3" title="insertion mode:
|
||
after frameset">after frameset</a>" during the course of the parsing, as
|
||
described below. It affects how certain tokens are processed.
|
||
|
||
</p><p>If the tree construction stage is switched from <a href="#the-main0">the
|
||
main phase</a> to <a href="#the-trailing0">the trailing end phase</a> and
|
||
back again, the various pieces of state are not reset; the UA must act as
|
||
if the state was maintained.
|
||
|
||
</p><p>When the steps below require the UA to <dfn id="reset">reset the insertion
|
||
mode appropriately</dfn>, it means the UA must follow these steps:
|
||
|
||
</p><ol>
|
||
<li>Let <var title="">last</var> be false.
|
||
|
||
</li><li>Let <var title="">node</var> be the last node in the <a href="#stack">stack of open elements</a>.
|
||
|
||
</li><li>If <var title="">node</var> is the first node in the stack of open
|
||
elements, then set <var title="">last</var> to true. If the element whose
|
||
<code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code>
|
||
attribute is being set is neither a <code><a href="section-tabular.html#td">td</a></code>
|
||
element nor a <code><a href="section-tabular.html#th">th</a></code> element, then set <var title="">node</var> to the element whose <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code>
|
||
attribute is being set. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>)
|
||
|
||
</li><li>If <var title="">node</var> is a <code>select</code> element, then
|
||
switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-select" title="insertion mode: in select">in select</a>" and
|
||
abort these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>)
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#td">td</a></code> or
|
||
<code><a href="section-tabular.html#th">th</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-cell" title="insertion mode: in cell">in cell</a>" and abort these steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#tr">tr</a></code>
|
||
element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-row" title="insertion mode: in row">in row</a>" and abort these
|
||
steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#tbody">tbody</a></code>, <code><a href="section-tabular.html#thead0">thead</a></code>,
|
||
or <code><a href="section-tabular.html#tfoot0">tfoot</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table0" title="insertion mode: in table body">in table body</a>" and abort these
|
||
steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#caption0">caption</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-caption" title="insertion mode: in caption">in caption</a>" and abort these steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#colgroup">colgroup</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-column" title="insertion mode: in column group">in column group</a>" and abort
|
||
these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-tabular.html#table">table</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table" title="insertion mode: in table">in table</a>" and abort these steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-document.html#head">head</a></code>
|
||
element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-body" title="insertion mode: in body">in body</a>" ("<a href="#in-body" title="insertion mode: in body">in body</a>"! <em> not
|
||
"<a href="#in-head" title="insertion mode: in head">in head</a>"</em>!)
|
||
and abort these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>)
|
||
|
||
</li><li>If <var title="">node</var> is a <code><a href="section-sections.html#body0">body</a></code> element, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-body" title="insertion mode: in body">in body</a>" and abort these steps.
|
||
|
||
</li><li>If <var title="">node</var> is a <code>frameset</code> element, then
|
||
switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-frameset" title="insertion mode: in frameset">in frameset</a>"
|
||
and abort these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>)
|
||
|
||
</li><li>If <var title="">node</var> is an <code><a href="section-the-root.html#html">html</a></code> element, then: if the <a href="#head-element"><code title="">head</code> element pointer</a> is
|
||
null, switch the <a href="#insertion0">insertion mode</a> to "<a href="#before2" title="insertion mode: before head">before head</a>",
|
||
otherwise, switch the <a href="#insertion0">insertion mode</a> to "<a href="#after1" title="insertion mode: after head">after head</a>". In
|
||
either case, abort these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</li>
|
||
<!-- XXX can the head element pointer ever be
|
||
non-null when we're going through these steps? -->
|
||
|
||
<li>If <var title="">last</var> is true, then set the <a href="#insertion0">insertion mode</a> to "<a href="#in-body" title="insertion mode: in body">in body</a>" and abort these steps. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)
|
||
|
||
</li><li>Let <var title="">node</var> now be the node before <var title="">node</var> in the <a href="#stack">stack of open elements</a>.
|
||
|
||
</li><li>Return to step 3.
|
||
</li></ol>
|
||
<!--When you don't have to handle innerHTML, you can use this
|
||
simplified explanation instead:
|
||
|
||
<ol>
|
||
|
||
<li><p>If the <span>stack of open elements</span> <span title="has
|
||
an element in table scope">has a <code>td</code> or <code>th</code>
|
||
element in table scope</span>, then switch the <span>insertion
|
||
mode</span> to "<span title="insertion mode: in cell">in
|
||
cell</span>".</p></li>
|
||
|
||
<li><p>Otherwise, if the <span>stack of open elements</span> <span
|
||
title="has an element in table scope">has a <code>tr</code> element
|
||
in table scope</span>, then switch the <span>insertion mode</span>
|
||
to "<span title="insertion mode: in row">in row</span>".</p></li>
|
||
|
||
<li><p>Otherwise, if the <span>stack of open elements</span> <span
|
||
title="has an element in table scope">has a <code>tbody</code>,
|
||
<code>tfoot</code>, or <code>thead</code> element in table
|
||
scope</span>, then switch the <span>insertion mode</span> to "<span
|
||
title="insertion mode: in table body">in table
|
||
body</span>".</p></li>
|
||
|
||
<li><p>Otherwise, if the <span>stack of open elements</span> <span
|
||
title="has an element in table scope">has a <code>caption</code>
|
||
element in table scope</span>, then switch the <span>insertion
|
||
mode</span> to "<span title="insertion mode: in caption">in
|
||
caption</span>".</p></li>
|
||
|
||
( you can't reach this point with a colgroup element on the
|
||
stack )
|
||
|
||
<li><p>Otherwise, if the <span>stack of open elements</span> <span
|
||
title="has an element in table scope">has a <code>table</code>
|
||
element in table scope</span>, then switch the <span>insertion
|
||
mode</span> to "<span title="insertion mode: in table">in
|
||
table</span>".</p></li>
|
||
|
||
<li><p>Otherwise, switch the <span>insertion mode</span> to "<span
|
||
title="insertion mode: in body">in body</span>".</p></li>
|
||
|
||
</ol>
|
||
-->
|
||
|
||
<h6 id="how-to0"><span class="secno">8.2.4.3.7. </span>How to handle tokens in
|
||
the main phase</h6>
|
||
|
||
<p>Tokens in the main phase must be handled as follows:
|
||
|
||
</p><dl class="switch">
|
||
<dt>A DOCTYPE token
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>A start tag token with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>If this start tag token was not the first start tag token, then it is
|
||
a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>For each attribute on the token, check to see if the attribute is
|
||
already present on the top element of the <a href="#stack">stack of open
|
||
elements</a>. If it is not, add the attribute and its corresponding
|
||
value to that element.</p>
|
||
|
||
</dd><dt>An end-of-file token
|
||
|
||
</dt><dd>
|
||
<p><a href="#generate">Generate implied end tags.</a></p>
|
||
|
||
<p>If there are more than two nodes on the <a href="#stack">stack of open
|
||
elements</a>, or if there are two nodes but the second node is not a
|
||
<code><a href="section-sections.html#body0">body</a></code> node, this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Otherwise, if the parser was originally created in order to handle the
|
||
setting of an element's <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code> attribute, and there's more than
|
||
one element in the <a href="#stack">stack of open elements</a>, and the
|
||
second node on the <a href="#stack">stack of open elements</a> is not a
|
||
<code><a href="section-sections.html#body0">body</a></code> node, then this is a <a href="section-parsing.html#parse">parse error</a>. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p><a href="#stops">Stop parsing.</a></p>
|
||
|
||
<p class="big-issue">This fails because it doesn't imply HEAD and BODY
|
||
tags. We should probably expand out the insertion modes and merge them
|
||
with phases and then put the three things here into each insertion mode
|
||
instead of trying to factor them out so carefully.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Depends on the <a href="#insertion0">insertion mode</a>:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>If the <a href="#insertion0">insertion mode</a> is "<dfn id="before2" title="insertion mode: before head">before head</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag token with the tag name "head"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>Set the <a href="#head-element"><code title="">head</code> element
|
||
pointer</a> to this new element node.</p>
|
||
|
||
<p>Append the new element to the <a href="#current4">current node</a>
|
||
and push it onto the <a href="#stack">stack of open elements</a>.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#in-head" title="insertion mode: in head">in head</a>".</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is one of: "base", "link",
|
||
"meta", "script", "style", "title"
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "head" and no
|
||
attributes had been seen, then reprocess the current token.</p>
|
||
|
||
<p class="note">This will result in a <code><a href="section-document.html#head">head</a></code> element being generated, and with the
|
||
current token being reprocessed in the "<a href="#in-head" title="insertion mode: in head">in head</a>" <a href="#insertion0">insertion mode</a>.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "head" and no
|
||
attributes had been seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>Any other end tag
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>A character token that is <em>not</em> one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dt>Any other start tag token
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "head" and no
|
||
attributes had been seen, then reprocess the current token.</p>
|
||
|
||
<p class="note">This will result in an empty <code><a href="section-document.html#head">head</a></code> element being generated, with the
|
||
current token being reprocessed in the "<a href="#after1" title="insertion mode: after head">after head</a>" <a href="#insertion0">insertion mode</a>.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-inhead">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-head" title="insertion mode: in head">in
|
||
head</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows.</p>
|
||
|
||
<p class="note">The rules for handling "title", "style", and "script"
|
||
start tags are similar, but not identical.</p>
|
||
|
||
<p class="note">It is possible for the <a href="#tree-construction0">tree
|
||
construction</a> stage's <a href="#the-main0" title="the main
|
||
phase">main phase</a> to be in the "<a href="#in-head" title="insertion mode: in head">in head</a>" <a href="#insertion0">insertion mode</a> without the <a href="#current4">current node</a> being a <code><a href="section-document.html#head">head</a></code> element, e.g. if a <code><a href="section-document.html#head">head</a></code> end tag is immediately followed by a
|
||
<code><a href="section-document.html#meta0">meta</a></code> start tag.</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "title"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>Append the new element to the node pointed to by the <a href="#head-element"><code title="">head</code> element pointer</a>,
|
||
or, if that is null (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>), to the <a href="#current4">current node</a>.</p>
|
||
|
||
<p>Switch the tokeniser's <a href="section-tokenisation.html#content2">content model flag</a>
|
||
to the RCDATA state.</p>
|
||
|
||
<p>Then, collect all the character tokens that the tokeniser returns
|
||
until it returns a token that is not a character token.</p>
|
||
|
||
<p>If this process resulted in a collection of character tokens,
|
||
append a single <code>Text</code> node to the <code><a href="section-document.html#title1">title</a></code> element node whose contents is the
|
||
concatenation of all those tokens' characters.</p>
|
||
|
||
<p>The tokeniser's <a href="section-tokenisation.html#content2">content model flag</a> will
|
||
have switched back to the PCDATA state.</p>
|
||
|
||
<p>If the next token is an end tag token with the tag name "title",
|
||
ignore it. Otherwise, this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "style"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>Append the new element to the <a href="#current4">current
|
||
node</a>, unless the <a href="#insertion0">insertion mode</a> is "<a href="#in-head" title="insertion mode: in head">in head</a>" and the
|
||
<a href="#head-element"><code title="">head</code> element
|
||
pointer</a> is not null, in which case append it to the node pointed
|
||
to by the <a href="#head-element"><code title="">head</code> element
|
||
pointer</a>. <!--
|
||
<head></head><style><body> should put the style block in the
|
||
head, and does so by switching back to in head, but the head
|
||
isn't the current node at that point (comments should go
|
||
between the head and the body) -->.</p>
|
||
|
||
<p>Switch the tokeniser's <a href="section-tokenisation.html#content2">content model flag</a>
|
||
to the CDATA state.</p>
|
||
|
||
<p>Then, collect all the character tokens that the tokeniser returns
|
||
until it returns a token that is not a character token, or until it
|
||
stops tokenising.</p>
|
||
|
||
<p>If this process resulted in a collection of character tokens,
|
||
append a single <code>Text</code> node to the <code><a href="section-document.html#style">style</a></code> element node whose contents is the
|
||
concatenation of all those tokens' characters.</p>
|
||
|
||
<p>The tokeniser's <a href="section-tokenisation.html#content2">content model flag</a> will
|
||
have switched back to the PCDATA state.</p>
|
||
|
||
<p>If the next token is an end tag token with the tag name "style",
|
||
ignore it. Otherwise, this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
</dd><dt id="scriptTag">A start tag with the tag name "script"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>Mark the element as being <a href="section-scripting0.html#parser-inserted">"parser-inserted"</a>. This ensures that, if
|
||
the script is external, any <code title="dom-document-write-HTML"><a href="section-dynamic.html#document.write0">document.write()</a></code> calls in the
|
||
script will execute in-line, instead of blowing the document away,
|
||
as would happen in most other cases.</p>
|
||
|
||
<p>Switch the tokeniser's <a href="section-tokenisation.html#content2">content model flag</a>
|
||
to the CDATA state.</p>
|
||
|
||
<p>Then, collect all the character tokens that the tokeniser returns
|
||
until it returns a token that is not a character token, or until it
|
||
stops tokenising.</p>
|
||
|
||
<p>If this process resulted in a collection of character tokens,
|
||
append a single <code>Text</code> node to the <code><a href="section-scripting0.html#script0">script</a></code> element node whose contents is the
|
||
concatenation of all those tokens' characters.</p>
|
||
|
||
<p>The tokeniser's <a href="section-tokenisation.html#content2">content model flag</a> will
|
||
have switched back to the PCDATA state.</p>
|
||
|
||
<p>If the next token is not an end tag token with the tag name
|
||
"script", then this is a <a href="section-parsing.html#parse">parse error</a>; mark the
|
||
<code><a href="section-scripting0.html#script0">script</a></code> element as <a href="section-scripting0.html#already">"already executed"</a>. Otherwise, the token is the
|
||
<code><a href="section-scripting0.html#script0">script</a></code> element's end tag, so
|
||
ignore it.</p>
|
||
|
||
<p>If the parser was originally created in order to handle the
|
||
setting of a node's <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code> attribute, then mark the
|
||
<code><a href="section-scripting0.html#script0">script</a></code> element as <a href="section-scripting0.html#already">"already executed"</a>, and skip the rest of the
|
||
processing described for this token (including the part below where
|
||
"<a href="section-scripting0.html#the-script" title="the script that will execute as soon
|
||
as the parser resumes">scripts that will execute as soon as the
|
||
parser resumes</a>" are executed). (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p class="note">Marking the <code><a href="section-scripting0.html#script0">script</a></code>
|
||
element as "already executed" prevents it from executing when it is
|
||
inserted into the document a few paragraphs below. Scripts missing
|
||
their end tags and scripts that were inserted using <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code>
|
||
aren't executed.</p>
|
||
|
||
<p>Let the <var title="">old insertion point</var> have the same
|
||
value as the current <a href="section-parsing.html#insertion">insertion point</a>. Let
|
||
the <a href="section-parsing.html#insertion">insertion point</a> be just before the <a href="section-parsing.html#next-input">next input character</a>.</p>
|
||
|
||
<p>Append the new element to the <a href="#current4">current
|
||
node</a>, unless the <a href="#insertion0">insertion mode</a> is "<a href="#in-head" title="insertion mode: in head">in head</a>" and the
|
||
<a href="#head-element"><code title="">head</code> element
|
||
pointer</a> is not null, in which case append it to the node pointed
|
||
to by the <a href="#head-element"><code title="">head</code> element
|
||
pointer</a>. <!--
|
||
<head></head><script><body> should put the script in the head,
|
||
and does so by switching back to in head, but the head isn't
|
||
the current node at that point (comments should go between the
|
||
head and the body) -->
|
||
<a href="section-scripting0.html#running0" title="running a script">Special processing
|
||
occurs when a <code>script</code> element is inserted into a
|
||
document</a> that might cause some script to execute, which might
|
||
cause <a href="section-dynamic.html#document.write0" title="dom-document-write-HTML">new
|
||
characters to be inserted into the tokeniser</a>.</p>
|
||
|
||
<p>Let the <a href="section-parsing.html#insertion">insertion point</a> have the value of
|
||
the <var title="">old insertion point</var>. (In other words,
|
||
restore the <a href="section-parsing.html#insertion">insertion point</a> to the value it
|
||
had before the previous paragraph. This value might be the
|
||
"undefined" value.)</p>
|
||
|
||
<p id="scriptTagParserResumes">At this stage, if there is <a href="section-scripting0.html#the-script" title="the script that will execute as soon as
|
||
the parser resumes">a script that will execute as soon as the parser
|
||
resumes</a>, then:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>If the tree construction stage is <a href="section-parsing.html#nestedParsing">being
|
||
called reentrantly</a>, say from a call to <code title="dom-document-write-HTML"><a href="section-dynamic.html#document.write0">document.write()</a></code>:
|
||
|
||
</dt><dd>
|
||
<p>Abort the processing of any nested invokations of the tokeniser,
|
||
yielding control back to the caller. (Tokenisation will resume
|
||
when the caller returns to the "outer" tree construction stage.)
|
||
|
||
</p></dd><dt>Otherwise:
|
||
|
||
</dt><dd>
|
||
<p>Follow these steps:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>Let <var title="">the script</var> be <a href="section-scripting0.html#the-script">the script that will execute as soon as the
|
||
parser resumes</a>. There is no longer <a href="section-scripting0.html#the-script" title="the script that will execute as soon as the parser
|
||
resumes">a script that will execute as soon as the parser
|
||
resumes</a>.
|
||
|
||
</p></li><li>
|
||
<p><a href="section-terminology.html#pause">Pause</a> until the script has
|
||
<span>completed loading</span><!-- XXX xref -->.
|
||
|
||
</p></li><li>
|
||
<p>Let the <a href="section-parsing.html#insertion">insertion point</a> be just
|
||
before the <a href="section-parsing.html#next-input">next input character</a>.
|
||
|
||
</p></li><li>
|
||
<p><a href="section-scripting0.html#executing0" title="executing a script block">Execute
|
||
the script</a>.
|
||
|
||
</p></li><li>
|
||
<p>Let the <a href="section-parsing.html#insertion">insertion point</a> be undefined
|
||
again.
|
||
|
||
</p></li><li>
|
||
<p>If there is once again <a href="section-scripting0.html#the-script" title="the script
|
||
that will execute as soon as the parser resumes">a script that
|
||
will execute as soon as the parser resumes</a>, then repeat
|
||
these steps from step 1.
|
||
</p></li></ol>
|
||
</dd></dl>
|
||
|
||
</dd><dt>A start tag with the tag name "base", "link", or "meta"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>Append the new element to the node pointed to by the <a href="#head-element"><code title="">head</code> element pointer</a>,
|
||
or, if that is null (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>), to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "head"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is a <code><a href="section-document.html#head">head</a></code> element, pop the <a href="#current4">current node</a> off the <a href="#stack">stack of
|
||
open elements</a>. Otherwise, this is a <a href="section-parsing.html#parse">parse
|
||
error</a>.</p>
|
||
<!-- might happen if you see two </head>s
|
||
and something in between the two sends you from "after head"
|
||
back to "in head" -->
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#after1" title="insertion mode: after head">after head</a>".</p>
|
||
|
||
</dd><dt>An end tag with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>Act as described in the "anything else" entry below.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "head"
|
||
|
||
</dt><dt>Any other end tag
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is a <code><a href="section-document.html#head">head</a></code> element, act as if an end tag token
|
||
with the tag name "head" had been seen.</p>
|
||
|
||
<p>Otherwise, change the <a href="#insertion0">insertion mode</a> to
|
||
"<a href="#after1" title="insertion mode: after head">after
|
||
head</a>".</p>
|
||
|
||
<p>Then, reprocess the current token.</p>
|
||
|
||
<p class="big-issue">In certain UAs, <a href="https://bugzilla.mozilla.org/attachment.cgi?id=180157&action=view">some
|
||
elements</a> don't trigger the "in body" mode straight away, but
|
||
instead get put into the head. Do we want to copy that?</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt>If the <a href="#insertion0">insertion mode</a> is "<dfn id="after1" title="insertion mode: after head">after head</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag token with the tag name "body"
|
||
|
||
</dt><dd>
|
||
<p><a href="#insert" title="insert an HTML element">Insert a
|
||
<code>body</code> element</a> for the token.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#in-body" title="insertion mode: in body">in body</a>".</p>
|
||
|
||
</dd><dt>A start tag token with the tag name "frameset"
|
||
|
||
</dt><dd>
|
||
<p><a href="#insert" title="insert an HTML element">Insert a
|
||
<code>frameset</code> element</a> for the token.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#in-frameset" title="insertion mode: in frameset">in
|
||
frameset</a>".</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is one of: "base", "link",
|
||
"meta", "script", "style", "title"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Switch the <a href="#insertion0">insertion mode</a> back to "<a href="#in-head" title="insertion mode: in head">in head</a>" and reprocess the
|
||
token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "body" and no
|
||
attributes had been seen, and then reprocess the current token.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-inbody">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-body" title="insertion mode: in body">in
|
||
body</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#append" title="append a character">Append the token's
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is one of: "script", "style"
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> had been "<a href="#in-head" title="insertion mode: in
|
||
head">in head</a>".</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is one of: "base", "link",
|
||
"meta", "title"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Process the token as if the <a href="#insertion0">insertion mode</a> had been "<a href="#in-head" title="insertion mode: in head">in head</a>".</p>
|
||
|
||
</dd><dt>A start tag token with the tag name "body"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>.</p>
|
||
|
||
<p>If the second element on the <a href="#stack">stack of open
|
||
elements</a> is not a <code><a href="section-sections.html#body0">body</a></code>
|
||
element, or, if the <a href="#stack">stack of open elements</a> has
|
||
only one node on it, then ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise, for each attribute on the token, check to see if the
|
||
attribute is already present on the <code><a href="section-sections.html#body0">body</a></code> element (the second element) on the <a href="#stack">stack of open elements</a>. If it is not, add the
|
||
attribute and its corresponding value to that element.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "body"
|
||
|
||
</dt><dd>
|
||
<p>If the second element in the <a href="#stack">stack of open
|
||
elements</a> is not a <code><a href="section-sections.html#body0">body</a></code>
|
||
element, this is a <a href="section-parsing.html#parse">parse error</a>. Ignore the
|
||
token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p class="big-issue">this needs to handle closing of implied elements,
|
||
but without closing them</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is not the <code><a href="section-sections.html#body0">body</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#after2" title="insertion mode: after body">after body</a>".</p>
|
||
|
||
</dd><dt>An end tag with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>Act as if an end tag with tag name "body" had been seen, then, if
|
||
that token wasn't ignored, reprocess the current token.</p>
|
||
|
||
<p class="note">The fake end tag token here can only be ignored in the
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "address", "blockquote",
|
||
"center", "dir", "div", "dl", "fieldset", "listing", "menu", "ol",
|
||
"p", "ul"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "pre"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token.</p>
|
||
|
||
<p>If the next token is a U+000A LINE FEED (LF) character token, then
|
||
ignore that token and move on to the next one. (Newlines at the
|
||
start of <code><a href="section-preformatted.html#pre">pre</a></code> blocks are ignored as
|
||
an authoring convenience.)</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "form"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#form-element"><code title="form">form</code>
|
||
element pointer</a> is not null, ignore the token with a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p><a href="#insert" title="insert an html Element">Insert an HTML
|
||
element</a> for the token, and set the <code title="form">form</code>
|
||
element pointer to point to the element created.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "li"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p>Run the following algorithm:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>Initialise <var title="">node</var> to be the <a href="#current4">current node</a> (the bottommost node of the
|
||
stack).
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> is an <code><a href="section-lists0.html#li">li</a></code> element, then pop all the nodes from the
|
||
<a href="#current4">current node</a> up to <var title="">node</var>, including <var title="">node</var>, then stop
|
||
this algorithm. If more than one node is popped, then this is a <a href="section-parsing.html#parse">parse error</a>.
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> is not in the <a href="#formatting">formatting</a> category, and is not in the <a href="#phrasing">phrasing</a> category, and is not an <code><a href="section-sections.html#address">address</a></code> or <code><a href="section-miscellaneous.html#div">div</a></code> element, then stop this algorithm.
|
||
</p></li>
|
||
<!-- an element <foo> is in this
|
||
list if the following markup:
|
||
|
||
<!DOCTYPE html><body><ol><li><foo><li>
|
||
|
||
...results in the second <li> not being (in any way) a
|
||
descendant of the first <li>, or if <foo> is a formatting
|
||
element that gets reopened later. -->
|
||
|
||
<li>
|
||
<p>Otherwise, set <var title="">node</var> to the previous entry in
|
||
the <a href="#stack">stack of open elements</a> and return to step
|
||
2.
|
||
</p></li></ol>
|
||
|
||
<p>Finally, <a href="#insert" title="insert an html element">insert
|
||
an <code>li</code> element</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "dd" or "dt"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p>Run the following algorithm:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>Initialise <var title="">node</var> to be the <a href="#current4">current node</a> (the bottommost node of the
|
||
stack).
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> is a <code><a href="section-lists0.html#dd">dd</a></code> or <code><a href="section-lists0.html#dt">dt</a></code>
|
||
element, then pop all the nodes from the <a href="#current4">current node</a> up to <var title="">node</var>,
|
||
including <var title="">node</var>, then stop this algorithm. If
|
||
more than one node is popped, then this is a <a href="section-parsing.html#parse">parse error</a>.
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> is not in the <a href="#formatting">formatting</a> category, and is not in the <a href="#phrasing">phrasing</a> category, and is not an <code><a href="section-sections.html#address">address</a></code> or <code><a href="section-miscellaneous.html#div">div</a></code> element, then stop this algorithm.
|
||
</p></li>
|
||
<!-- an element <foo> is in this
|
||
list if the following markup:
|
||
|
||
<!DOCTYPE html><body><ol><dt><foo><dt>
|
||
|
||
...results in the second <li> not being (in any way) a
|
||
descendant of the first <li>, or if <foo> is a formatting
|
||
element that gets reopened later. -->
|
||
|
||
<li>
|
||
<p>Otherwise, set <var title="">node</var> to the previous entry in
|
||
the <a href="#stack">stack of open elements</a> and return to step
|
||
2.
|
||
</p></li></ol>
|
||
|
||
<p>Finally, <a href="#insert" title="insert an html element">insert
|
||
an HTML element</a> with the same tag name as the token's.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is "plaintext"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token.</p>
|
||
|
||
<p>Switch the <a href="section-tokenisation.html#content2">content model flag</a> to the
|
||
PLAINTEXT state.</p>
|
||
|
||
<p class="note">Once a start tag with the tag name "plaintext" has been
|
||
seen, that will be the last token ever seen other than character
|
||
tokens (and the end-of-file token), because there is no way to
|
||
switch the <a href="section-tokenisation.html#content2">content model flag</a> out of the
|
||
PLAINTEXT state.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "address", "blockquote",
|
||
"center", "dir", "div", "dl", "fieldset", "listing", "menu", "ol",
|
||
"pre", "ul"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> with the same tag name
|
||
as that of the token, then <a href="#generate">generate implied end
|
||
tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not an element
|
||
with the same tag name as that of the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> with the same tag name
|
||
as that of the token, then pop elements from this stack until an
|
||
element with that tag name has been popped from the stack.</p>
|
||
<!-- XXX quirk (except for in certain cases?):
|
||
<p>Otherwise, act as if a start tag with the tag name given in
|
||
the token had been seen, then reprocess the current token.</p>
|
||
-->
|
||
|
||
|
||
</dd><dt>An end tag whose tag name is "form"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> with the same tag name
|
||
as that of the token, then <a href="#generate">generate implied end
|
||
tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not an element
|
||
with the same tag name as that of the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Otherwise, if the <a href="#current4">current node</a> is an
|
||
element with the same tag name as that of the token pop that element
|
||
from the stack.</p>
|
||
|
||
<p>In any case, set the <a href="#form-element"><code title="">form</code> element pointer</a> to null.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "p"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then <a href="#generate">generate implied end
|
||
tags</a>, except for <code><a href="section-prose.html#p">p</a></code> elements.</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is not a <code><a href="section-prose.html#p">p</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then pop elements from this stack until the
|
||
stack no longer <a href="#have-an" title="has an element in
|
||
scope">has a <code>p</code> element in scope</a>.</p>
|
||
<!-- XXX quirk:
|
||
<p>Otherwise, act as if a start tag with the tag name
|
||
<code>p</code> had been seen, then reprocess the current
|
||
token.</p>
|
||
-->
|
||
|
||
|
||
</dd><dt>An end tag whose tag name is "dd", "dt", or "li"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> whose tag name matches
|
||
the tag name of the token, then <a href="#generate">generate implied
|
||
end tags</a>, except for elements with the same tag name as the
|
||
token.</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is not an element with
|
||
the same tag name as the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> whose tag name matches
|
||
the tag name of the token, then pop elements from this stack until
|
||
an element with that tag name has been popped from the stack.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
|
||
"h5", "h6"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has in scope</a> an
|
||
element whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
|
||
"h6", then this is a <a href="section-parsing.html#parse">parse error</a>; pop elements
|
||
from the stack until an element with one of those tag names has been
|
||
popped from the stack.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5",
|
||
"h6"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has in scope</a> an
|
||
element whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
|
||
"h6", then <a href="#generate">generate implied end tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not an element
|
||
with the same tag name as that of the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has in scope</a> an
|
||
element whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
|
||
"h6", then pop elements from the stack until an element with one of
|
||
those tag names has been popped from the stack.</p>
|
||
<!-- XXX quirk:
|
||
<p>Otherwise, act as if a start tag with the tag name given in
|
||
the token had been seen, then reprocess the current token.</p>
|
||
-->
|
||
</dd>
|
||
<!-- ADOPTION AGENCY ELEMENTS
|
||
Mozilla-only: bdo blink del ins sub sup q
|
||
Safari-only: code dfn kbd nobr samp var wbr
|
||
Both: a b big em font i s small strike strong tt u -->
|
||
|
||
<dt>A start tag whose tag name is "a"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#list-of4">list of active formatting elements</a>
|
||
contains an element whose tag name is "a" between the end of the
|
||
list and the last marker on the list (or the start of the list if
|
||
there is no marker on the list), then this is a <a href="section-parsing.html#parse">parse error</a>; act as if an end tag with the tag
|
||
name "a" had been seen, then remove that element from the <a href="#list-of4">list of active formatting elements</a> and the <a href="#stack">stack of open elements</a> if the end tag didn't
|
||
already remove it (it might not have if the element is not <a href="#have-an0" title="has an element in table scope">in table
|
||
scope</a>).</p>
|
||
|
||
<p class="example">In the non-conforming stream
|
||
<code><a href="a">a<table><a href="b">b</table>x</code>,
|
||
the first <code><a href="section-phrase.html#a">a</a></code> element would be closed
|
||
upon seeing the second one, and the "x" character would be inside a
|
||
link to "b", not to "a". This is despite the fact that the outer
|
||
<code><a href="section-phrase.html#a">a</a></code> element is not in table scope
|
||
(meaning that a regular <code></a></code> end tag at the start of
|
||
the table wouldn't close the outer <code><a href="section-phrase.html#a">a</a></code>
|
||
element).</p>
|
||
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token. Add that element to the <a href="#list-of4">list of active formatting elements</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "b", "big", "em", "font",
|
||
"i", "nobr", "s", "small", "strike", "strong", "tt", "u"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token. Add that element to the <a href="#list-of4">list of active formatting elements</a>.</p>
|
||
|
||
</dd><dt id="adoptionAgency">An end tag whose tag name is one of: "a", "b",
|
||
"big", "em", "font", "i", "nobr", "s", "small", "strike", "strong",
|
||
"tt", "u"
|
||
|
||
</dt><dd>
|
||
<p>Follow these steps:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>Let the <var title="">formatting element</var> be the last
|
||
element in the <a href="#list-of4">list of active formatting
|
||
elements</a> that:</p>
|
||
|
||
<ul>
|
||
<li>is between the end of the list and the last scope marker in
|
||
the list, if any, or the start of the list otherwise, and
|
||
|
||
</li><li>has the same tag name as the token.
|
||
</li></ul>
|
||
|
||
<p>If there is no such node, or, if that node is also in the <a href="#stack">stack of open elements</a> but the element is not <a href="#have-an" title="has an element in scope">in scope</a>, then
|
||
this is a <a href="section-parsing.html#parse">parse error</a>. Abort these steps. The
|
||
token is ignored.</p>
|
||
|
||
<p>Otherwise, if there is such a node, but that node is not in the
|
||
<a href="#stack">stack of open elements</a>, then this is a <a href="section-parsing.html#parse">parse error</a>; remove the element from the list,
|
||
and abort these steps.</p>
|
||
|
||
<p>Otherwise, there is a <var title="">formatting element</var> and
|
||
that element is in <a href="#stack" title="stack of open
|
||
elements">the stack</a> and is <a href="#have-an" title="has an
|
||
element in scope">in scope</a>. If the element is not the <a href="#current4">current node</a>, this is a <a href="section-parsing.html#parse">parse error</a>. In any case, proceed with the
|
||
algorithm as written in the following steps.</p>
|
||
|
||
</li><li>
|
||
<p>Let the <var title="">furthest block</var> be the topmost node
|
||
in the <a href="#stack">stack of open elements</a> that is lower
|
||
in the stack than the <var title="">formatting element</var>, and
|
||
is not an element in the <a href="#phrasing">phrasing</a> or <a href="#formatting">formatting</a> categories. There might not be
|
||
one.
|
||
|
||
</p></li><li>
|
||
<p>If there is no <var title="">furthest block</var>, then the UA
|
||
must skip the subsequent steps and instead just pop all the nodes
|
||
from the bottom of the <a href="#stack">stack of open
|
||
elements</a>, from the <a href="#current4">current node</a> up to
|
||
the <var title="">formatting element</var>, and remove the <var title="">formatting element</var> from the <a href="#list-of4">list of active formatting elements</a>.
|
||
|
||
</p></li><li>
|
||
<p>Let the <var title="">common ancestor</var> be the element
|
||
immediately above the <var title="">formatting element</var> in
|
||
the <a href="#stack">stack of open elements</a>.
|
||
|
||
</p></li><li>
|
||
<p>If the <var title="">furthest block</var> has a parent node,
|
||
then remove the <var title="">furthest block</var> from its parent
|
||
node.
|
||
|
||
</p></li><li>
|
||
<p>Let a bookmark note the position of the <var title="">formatting
|
||
element</var> in the <a href="#list-of4">list of active formatting
|
||
elements</a> relative to the elements on either side of it in the
|
||
list.
|
||
|
||
</p></li><li>
|
||
<p>Let <var title="">node</var> and <var title="">last node</var>
|
||
be the <var title="">furthest block</var>. Follow these steps:</p>
|
||
|
||
<ol>
|
||
<li>Let <var title="">node</var> be the element immediately prior
|
||
to <var title="">node</var> in the <a href="#stack">stack of open
|
||
elements</a>.
|
||
|
||
</li><li>If <var title="">node</var> is not in the <a href="#list-of4">list of active formatting elements</a>, then
|
||
remove <var title="">node</var> from the <a href="#stack">stack
|
||
of open elements</a> and then go back to step 1.
|
||
|
||
</li><li>Otherwise, if <var title="">node</var> is the <var title="">formatting element</var>, then go to the next step in
|
||
the overall algorithm.
|
||
|
||
</li><li>Otherwise, if <var title="">last node</var> is the <var title="">furthest block</var>, then move the aforementioned
|
||
bookmark to be immediately after the <var title="">node</var> in
|
||
the <a href="#list-of4">list of active formatting elements</a>.
|
||
|
||
</li><li>If <var title="">node</var> has any children, perform a
|
||
shallow clone of <var title="">node</var>, replace the entry for
|
||
<var title="">node</var> in the <a href="#list-of4">list of
|
||
active formatting elements</a> with an entry for the clone,
|
||
replace the entry for <var title="">node</var> in the <a href="#stack">stack of open elements</a> with an entry for the
|
||
clone, and let <var title="">node</var> be the clone.
|
||
|
||
</li><li>Insert <var title="">last node</var> into <var title="">node</var>, first removing it from its previous parent
|
||
node if any.
|
||
|
||
</li><li>Let <var title="">last node</var> be <var title="">node</var>.
|
||
|
||
</li><li>Return to step 1 of this inner set of steps.
|
||
</li></ol>
|
||
|
||
</li><li>
|
||
<p>Insert whatever <var title="">last node</var> ended up being in
|
||
the previous step into the <var title="">common ancestor</var>
|
||
node, first removing it from its previous parent node if any.
|
||
|
||
</p></li><li>
|
||
<p>Perform a shallow clone of the <var title="">formatting
|
||
element</var>.
|
||
|
||
</p></li><li>
|
||
<p>Take all of the child nodes of the <var title="">furthest
|
||
block</var> and append them to the clone created in the last step.
|
||
|
||
</p></li><li>
|
||
<p>Append that clone to the <var title="">furthest block</var>.
|
||
|
||
</p></li><li>
|
||
<p>Remove the <var title="">formatting element</var> from the <a href="#list-of4">list of active formatting elements</a>, and
|
||
insert the clone into the <a href="#list-of4">list of active
|
||
formatting elements</a> at the position of the aforementioned
|
||
bookmark.
|
||
|
||
</p></li><li>
|
||
<p>Remove the <var title="">formatting element</var> from the <a href="#stack">stack of open elements</a>, and insert the clone
|
||
into the <a href="#stack">stack of open elements</a> immediately
|
||
after (i.e. in a more deeply nested position than) the position of
|
||
the <var title="">furthest block</var> in that stack.
|
||
|
||
</p></li><li>
|
||
<p>Jump back to step 1 in this series of steps.
|
||
</p></li></ol>
|
||
|
||
<p class="note">The way these steps are defined, only elements in the
|
||
<a href="#formatting">formatting</a> category ever get cloned by
|
||
this algorithm.</p>
|
||
<!--XXX
|
||
<div class="example">
|
||
<p class="big-issue">Need an example.</p>
|
||
</div>
|
||
-->
|
||
|
||
<p class="note">Because of the way this algorithm causes elements to
|
||
change parents, it has been dubbed the "adoption agency algorithm"
|
||
(in contrast with other possibly algorithms for dealing with
|
||
misnested content, which included the "incest algorithm", the
|
||
"secret affair algorithm", and the "Heisenberg algorithm").</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is "button"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a
|
||
<code>button</code> element in scope</a>, then this is a <a href="section-parsing.html#parse">parse error</a>; act as if an end tag with the tag
|
||
name "button" had been seen, then reprocess the token.</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p>Insert a marker at the end of the <a href="#list-of4">list of
|
||
active formatting elements</a>.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is one of: "marquee", "object"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p>Insert a marker at the end of the <a href="#list-of4">list of
|
||
active formatting elements</a>.</p>
|
||
|
||
</dd><dt>An end tag token whose tag name is one of: "button", "marquee",
|
||
"object"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has in scope</a> an
|
||
element whose tag name is the same as the tag name of the token,
|
||
then <a href="#generate">generate implied end tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not an element
|
||
with the same tag name as the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Now, if the <a href="#stack">stack of open elements</a> <a href="#have-an">has an element in scope</a> whose tag name matches
|
||
the tag name of the token, then pop elements from the stack until
|
||
that element has been popped from the stack, and <a href="#clear0">clear the list of active formatting elements up to
|
||
the last marker</a>.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is "xmp"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p>Switch the <a href="section-tokenisation.html#content2">content model flag</a> to the CDATA
|
||
state.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
<!-- XXX quirks: don't do this -->
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#in-table" title="insertion mode: in table">in table</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "area", "basefont",
|
||
"bgsound", "br", "embed", "img", "param", "spacer", "wbr"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token. Immediately pop the <a href="#current4">current node</a> off the <a href="#stack">stack of
|
||
open elements</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "hr"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an" title="has an element in scope">has a <code>p</code>
|
||
element in scope</a>, then act as if an end tag with the tag name
|
||
<code><a href="section-prose.html#p">p</a></code> had been seen.</p>
|
||
<!-- XXX quirks: don't do this -->
|
||
<p><a href="#insert" title="insert an html element">Insert an HTML
|
||
element</a> for the token. Immediately pop the <a href="#current4">current node</a> off the <a href="#stack">stack of
|
||
open elements</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "image"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Change the token's tag name to
|
||
"img" and reprocess it. (Don't ask.)</p>
|
||
<!-- As of
|
||
2005-12, studies showed that around 0.2% of pages used the
|
||
<image> element. -->
|
||
|
||
|
||
</dd><dt>A start tag whose tag name is "input"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert" title="insert an html element">Insert an
|
||
<code>input</code> element</a> for the token.</p>
|
||
|
||
<p>If the <a href="#form-element"><code title="">form</code> element
|
||
pointer</a> is not null, then <span>associate</span><!--XXX
|
||
xref! -->
|
||
the <code>input</code> element with the <code>form</code> element
|
||
pointed to by the <a href="#form-element"><code title="">form</code>
|
||
element pointer</a>.</p>
|
||
|
||
<p>Pop that <code>input</code> element off the <a href="#stack">stack
|
||
of open elements</a>.</p>
|
||
|
||
</dd><dt id="isindex">A start tag whose tag name is "isindex"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>.</p>
|
||
|
||
<p>If the <a href="#form-element"><code title="">form</code> element
|
||
pointer</a> is not null, then ignore the token.</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "form" had been
|
||
seen.</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "hr" had been seen.</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "p" had been seen.</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "label" had been
|
||
seen.</p>
|
||
|
||
<p>Act as if a stream of character tokens had been seen (see below
|
||
for what they should say).</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "input" had been
|
||
seen, with all the attributes from the "isindex" token, except with
|
||
the "name" attribute set to the value "isindex" (ignoring any
|
||
explicit "name" attribute).</p>
|
||
|
||
<p>Act as if a stream of character tokens had been seen (see below
|
||
for what they should say).</p>
|
||
|
||
<p>Act as if an end tag token with the tag name "label" had been
|
||
seen.</p>
|
||
|
||
<p>Act as if an end tag token with the tag name "p" had been seen.</p>
|
||
|
||
<p>Act as if a start tag token with the tag name "hr" had been seen.</p>
|
||
|
||
<p>Act as if an end tag token with the tag name "form" had been seen.</p>
|
||
|
||
<p>The two streams of character tokens together should, together with
|
||
the <code>input</code> element, express the equivalent of "This is a
|
||
searchable index. Insert your search keywords here: (input field)"
|
||
in the user's preferred language.</p>
|
||
|
||
<p class="big-issue"> Then need to specify that if the form submission
|
||
causes just a single form control, whose name is "isindex", to be
|
||
submitted, then we submit just the value part, not the "isindex="
|
||
part.</p>
|
||
</dd>
|
||
<!-- XXX keygen support; don't forget form element pointer!
|
||
|
||
<dt>A start tag whose tag name is "keygen"</dt>
|
||
<dd>
|
||
...
|
||
</dd>
|
||
-->
|
||
|
||
<dt>A start tag whose tag name is "textarea"
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>If the <a href="#form-element"><code title="">form</code> element
|
||
pointer</a> is not null, then <span>associate</span><!--XXX
|
||
xref! -->
|
||
the <code>textarea</code> element with the <code>form</code> element
|
||
pointed to by the <a href="#form-element"><code title="">form</code>
|
||
element pointer</a>.</p>
|
||
|
||
<p>Append the new element to the <a href="#current4">current
|
||
node</a>.</p>
|
||
|
||
<p>Switch the tokeniser's <a href="section-tokenisation.html#content2">content model flag</a>
|
||
to the RCDATA state.</p>
|
||
|
||
<p>If the next token is a U+000A LINE FEED (LF) character token, then
|
||
ignore that token and move on to the next one. (Newlines at the
|
||
start of <code>textarea</code> elements are ignored as an authoring
|
||
convenience.)</p>
|
||
|
||
<p>Then, collect all the character tokens that the tokeniser returns
|
||
until it returns a token that is not a character token, or until it
|
||
stops tokenising.</p>
|
||
|
||
<p>If this process resulted in a collection of character tokens,
|
||
append a single <code>Text</code> node, whose contents is the
|
||
concatenation of all those tokens' characters, to the new element
|
||
node.</p>
|
||
|
||
<p>The tokeniser's <a href="section-tokenisation.html#content2">content model flag</a> will
|
||
have switched back to the PCDATA state.</p>
|
||
|
||
<p>If the next token is an end tag token with the tag name
|
||
"textarea", ignore it. Otherwise, this is a <a href="section-parsing.html#parse">parse
|
||
error</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "iframe", "noembed",
|
||
"noframes"
|
||
|
||
</dt><dt>A start tag whose tag name is "noscript", if <a href="section-scripting.html#scripting2">scripting is enabled</a>:
|
||
|
||
</dt><dd>
|
||
<p><a href="#create">Create an element for the token</a>.</p>
|
||
|
||
<p>For "iframe" tags, the node must be an <code><a href="section-embedded.html#htmliframeelement">HTMLIFrameElement</a></code> object, for
|
||
the other tags it must be an <code><a href="section-elements.html#htmlelement">HTMLElement</a></code> object.</p>
|
||
|
||
<p>Append the new element to the <a href="#current4">current
|
||
node</a>.</p>
|
||
|
||
<p>Switch the tokeniser's <a href="section-tokenisation.html#content2">content model flag</a>
|
||
to the CDATA state.</p>
|
||
|
||
<p>Then, collect all the character tokens that the tokeniser returns
|
||
until it returns a token that is not a character token, or until it
|
||
stops tokenising.</p>
|
||
|
||
<p>If this process resulted in a collection of character tokens,
|
||
append a single <code>Text</code> node, whose contents is the
|
||
concatenation of all those tokens' characters, to the new element
|
||
node.</p>
|
||
|
||
<p>The tokeniser's <a href="section-tokenisation.html#content2">content model flag</a> will
|
||
have switched back to the PCDATA state.</p>
|
||
|
||
<p>If the next token is an end tag token with the same tag name as
|
||
the start tag token, ignore it. Otherwise, this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "select"
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p>Change the <a href="#insertion0">insertion mode</a> to "<a href="#in-select" title="insertion mode: in select">in select</a>".</p>
|
||
</dd>
|
||
<!-- XXX quirks:
|
||
<dt>An end tag whose tag name is "br"</dt>
|
||
<dd>
|
||
<p>Act as if a start tag token with the tag name "br" had been
|
||
seen. Ignore the end tag token.</p>
|
||
</dd>
|
||
-->
|
||
|
||
<dt>A start or end tag whose tag name is one of: "caption", "col",
|
||
"colgroup", "frame", "frameset", "head", "option", "optgroup",
|
||
"tbody", "td", "tfoot", "th", "thead", "tr"
|
||
|
||
</dt><dt>An end tag whose tag name is one of: "area", "basefont",
|
||
"bgsound", <!--XXX quirks: remove br-->"br", "embed", "hr", "iframe",
|
||
"image", "img", "input", "isindex", "noembed", "noframes", "param",
|
||
"select", "spacer", "table", "textarea", "wbr"</dt>
|
||
<!-- add keygen if we add the start tag -->
|
||
|
||
<dt>An end tag whose tag name is "noscript", if <a href="section-scripting.html#scripting2">scripting is enabled</a>:
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>A start or end tag whose tag name is one of: "event-source",
|
||
"section", "nav", "article", "aside", "header", "footer", "datagrid",
|
||
"command"
|
||
|
||
</dt><dd> <!-- XXXX -->
|
||
<p class="big-issue">Work in progress!</p>
|
||
|
||
</dd><dt>A start tag token not covered by the previous entries
|
||
|
||
</dt><dd>
|
||
<p><a href="#reconstruct">Reconstruct the active formatting
|
||
elements</a>, if any.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
<p class="note">This element will be a <a href="#phrasing">phrasing</a>
|
||
element.</p>
|
||
<!--
|
||
Put the following into the MathML namespace if parsed:
|
||
math, mrow, mfrac, msqrt, mroot, mstyle, merror, mpadded,
|
||
mphantom, mfenced, menclose, msub, msup, msubsup, munder,
|
||
mover, munderover, mmultiscripts, mtable, mlabeledtr, mtr,
|
||
mtd, maction
|
||
-->
|
||
|
||
|
||
</dd><dt>An end tag token not covered by the previous entries
|
||
|
||
</dt><dd>
|
||
<p>Run the following algorithm:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>Initialise <var title="">node</var> to be the <a href="#current4">current node</a> (the bottommost node of the
|
||
stack).
|
||
|
||
</p></li><li>
|
||
<p>If <var title="">node</var> has the same tag name as the end tag
|
||
token, then:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p><a href="#generate">Generate implied end tags</a>.
|
||
|
||
</p></li><li>
|
||
<p>If the tag name of the end tag token does not match the tag
|
||
name of the <a href="#current4">current node</a>, this is a <a href="section-parsing.html#parse">parse error</a>.
|
||
|
||
</p></li><li>
|
||
<p>Pop all the nodes from the <a href="#current4">current
|
||
node</a> up to <var title="">node</var>, including <var title="">node</var>, then stop this algorithm.
|
||
</p></li></ol>
|
||
|
||
</li><li>
|
||
<p>Otherwise, if <var title="">node</var> is in neither the <a href="#formatting">formatting</a> category nor the <a href="#phrasing">phrasing</a> category, then this is a <a href="section-parsing.html#parse">parse error</a>. Stop this algorithm. The end tag
|
||
token is ignored.
|
||
|
||
</p></li><li>
|
||
<p>Set <var title="">node</var> to the previous entry in the <a href="#stack">stack of open elements</a>.
|
||
|
||
</p></li><li>
|
||
<p>Return to step 2.
|
||
</p></li></ol>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-intable">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-table" title="insertion mode: in table">in
|
||
table</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "caption"
|
||
|
||
</dt><dd>
|
||
<p><a href="#clear1">Clear the stack back to a table context</a>.
|
||
(See below.)</p>
|
||
|
||
<p>Insert a marker at the end of the <a href="#list-of4">list of
|
||
active formatting elements</a>.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token, then
|
||
switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-caption" title="insertion mode: in caption">in
|
||
caption</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "colgroup"
|
||
|
||
</dt><dd>
|
||
<p><a href="#clear1">Clear the stack back to a table context</a>.
|
||
(See below.)</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token, then
|
||
switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-column" title="insertion mode: in column group">in column
|
||
group</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "col"
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "colgroup" had been
|
||
seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "tbody", "tfoot", "thead"
|
||
|
||
</dt><dd>
|
||
<p><a href="#clear1">Clear the stack back to a table context</a>.
|
||
(See below.)</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token, then
|
||
switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table0" title="insertion mode: in table body">in table
|
||
body</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "td", "th", "tr"
|
||
|
||
</dt><dd>
|
||
<p>Act as if a start tag token with the tag name "tbody" had been
|
||
seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Act as if an end tag token with
|
||
the tag name "table" had been seen, then, if that token wasn't
|
||
ignored, reprocess the current token.</p>
|
||
|
||
<p class="note">The fake end tag token here can only be ignored in the
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#generate">Generate implied end tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not a <code><a href="section-tabular.html#table">table</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Pop elements from this stack until a <code><a href="section-tabular.html#table">table</a></code> element has been popped from the
|
||
stack.</p>
|
||
|
||
<p><a href="#reset">Reset the insertion mode appropriately</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "body", "caption", "col",
|
||
"colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Process the token as if the <a href="#insertion0">insertion mode</a> was "<a href="#in-body" title="insertion mode: in body">in body</a>", with the following
|
||
exception:</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is a <code><a href="section-tabular.html#table">table</a></code>, <code><a href="section-tabular.html#tbody">tbody</a></code>, <code><a href="section-tabular.html#tfoot0">tfoot</a></code>, <code><a href="section-tabular.html#thead0">thead</a></code>, or <code><a href="section-tabular.html#tr">tr</a></code> element, then, whenever a node would be
|
||
inserted into the <a href="#current4">current node</a>, it must
|
||
instead be inserted into the <em><a href="#foster">foster parent
|
||
element</a></em>.</p>
|
||
|
||
<p>The <dfn id="foster">foster parent element</dfn> is the parent
|
||
element of the last <code><a href="section-tabular.html#table">table</a></code> element
|
||
in the <a href="#stack">stack of open elements</a>, if there is a
|
||
<code><a href="section-tabular.html#table">table</a></code> element and it has such a
|
||
parent element. If there is no <code><a href="section-tabular.html#table">table</a></code> element in the <a href="#stack">stack
|
||
of open elements</a> (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code>
|
||
case</a>), then the <em><a href="#foster">foster parent
|
||
element</a></em> is the first element in the <a href="#stack">stack
|
||
of open elements</a> (the <code><a href="section-the-root.html#html">html</a></code>
|
||
element). Otherwise, if there is a <code><a href="section-tabular.html#table">table</a></code> element in the <a href="#stack">stack
|
||
of open elements</a>, but the last <code><a href="section-tabular.html#table">table</a></code> element in the <a href="#stack">stack
|
||
of open elements</a> has no parent, or its parent node is not an
|
||
element, then the <em><a href="#foster">foster parent
|
||
element</a></em> is the element before the last <code><a href="section-tabular.html#table">table</a></code> element in the <a href="#stack">stack
|
||
of open elements</a>.</p>
|
||
|
||
<p>If the <em><a href="#foster">foster parent element</a></em> is the
|
||
parent element of the last <code><a href="section-tabular.html#table">table</a></code>
|
||
element in the <a href="#stack">stack of open elements</a>, then the
|
||
new node must be inserted immediately <em>before</em> the last
|
||
<code><a href="section-tabular.html#table">table</a></code> element in the <a href="#stack">stack of open elements</a> in the <a href="#foster">foster parent element</a>; otherwise, the new node
|
||
must be <em>appended</em> to the <a href="#foster">foster parent
|
||
element</a>.</p>
|
||
</dd></dl>
|
||
|
||
<p>When the steps above require the UA to <dfn id="clear1">clear the
|
||
stack back to a table context</dfn>, it means that the UA must, while
|
||
the <a href="#current4">current node</a> is not a <code><a href="section-tabular.html#table">table</a></code> element or an <code><a href="section-the-root.html#html">html</a></code> element, pop elements from the <a href="#stack">stack of open elements</a>. If this causes any elements
|
||
to be popped from the stack, then this is a <a href="section-parsing.html#parse">parse
|
||
error</a>.</p>
|
||
|
||
<p class="note">The <a href="#current4">current node</a> being an
|
||
<code><a href="section-the-root.html#html">html</a></code> element after this process is an
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt id="parsing-main-incaption">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-caption" title="insertion mode: in caption">in
|
||
caption</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>An end tag whose tag name is "caption"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#generate">Generate implied end tags</a>.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not a <code><a href="section-tabular.html#caption0">caption</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Pop elements from this stack until a <code><a href="section-tabular.html#caption0">caption</a></code> element has been popped from the
|
||
stack.</p>
|
||
|
||
<p><a href="#clear0">Clear the list of active formatting elements up
|
||
to the last marker</a>.</p>
|
||
|
||
<p>Switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table" title="insertion mode: in table">in table</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "caption", "col",
|
||
"colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
|
||
|
||
</dt><dt>An end tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Act as if an end tag with the
|
||
tag name "caption" had been seen, then, if that token wasn't
|
||
ignored, reprocess the current token.</p>
|
||
|
||
<p class="note">The fake end tag token here can only be ignored in the
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "body", "col", "colgroup",
|
||
"html", "tbody", "td", "tfoot", "th", "thead", "tr"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> was "<a href="#in-body" title="insertion mode: in body">in
|
||
body</a>".</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-incolgroup">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-column" title="insertion mode: in column
|
||
group">in column group</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "col"
|
||
|
||
</dt><dd>
|
||
<p><a href="#insert" title="insert an HTML element">Insert a
|
||
<code>col</code> element</a> for the token. Immediately pop the <a href="#current4">current node</a> off the <a href="#stack">stack of
|
||
open elements</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "colgroup"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is the root <code><a href="section-the-root.html#html">html</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>, ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise, pop the <a href="#current4">current node</a> (which
|
||
will be a <code><a href="section-tabular.html#colgroup">colgroup</a></code> element)
|
||
from the <a href="#stack">stack of open elements</a>. Switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table" title="insertion mode: in table">in table</a>".</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "col"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Act as if an end tag with the tag name "colgroup" had been seen,
|
||
and then, if that token wasn't ignored, reprocess the current token.</p>
|
||
|
||
<p class="note">The fake end tag token here can only be ignored in the
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-intbody">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-table0" title="insertion mode: in table body">in
|
||
table body</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>A start tag whose tag name is "tr"
|
||
|
||
</dt><dd>
|
||
<p><a href="#clear2">Clear the stack back to a table body
|
||
context</a>. (See below.)</p>
|
||
|
||
<p><a href="#insert" title="insert an HTML element">Insert a
|
||
<code>tr</code> element</a> for the token, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-row" title="insertion mode: in row">in row</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "th", "td"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Act as if a start tag with the
|
||
tag name "tr" had been seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "tbody", "tfoot", "thead"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token.</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#clear2">Clear the stack back to a table body
|
||
context</a>. (See below.)</p>
|
||
|
||
<p>Pop the <a href="#current4">current node</a> from the <a href="#stack">stack of open elements</a>. Switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table" title="insertion mode: in table">in table</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "caption", "col",
|
||
"colgroup", "tbody", "tfoot", "thead"
|
||
|
||
</dt><dt>An end tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have a
|
||
<code>tbody</code>, <code>thead</code>, or <code>tfoot</code>
|
||
element in table scope</a>, this is a <a href="section-parsing.html#parse">parse
|
||
error</a>. Ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#clear2">Clear the stack back to a table body
|
||
context</a>. (See below.)</p>
|
||
|
||
<p>Act as if an end tag with the same tag name as the <a href="#current4">current node</a> ("tbody", "tfoot", or "thead") had
|
||
been seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "body", "caption", "col",
|
||
"colgroup", "html", "td", "th", "tr"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> was "<a href="#in-table" title="insertion mode: in
|
||
table">in table</a>".</p>
|
||
</dd></dl>
|
||
|
||
<p>When the steps above require the UA to <dfn id="clear2">clear the
|
||
stack back to a table body context</dfn>, it means that the UA must,
|
||
while the <a href="#current4">current node</a> is not a <code><a href="section-tabular.html#tbody">tbody</a></code>, <code><a href="section-tabular.html#tfoot0">tfoot</a></code>, <code><a href="section-tabular.html#thead0">thead</a></code>, or <code><a href="section-the-root.html#html">html</a></code> element, pop elements from the <a href="#stack">stack of open elements</a>. If this causes any elements
|
||
to be popped from the stack, then this is a <a href="section-parsing.html#parse">parse
|
||
error</a>.</p>
|
||
|
||
<p class="note">The <a href="#current4">current node</a> being an
|
||
<code><a href="section-the-root.html#html">html</a></code> element after this process is an
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt id="parsing-main-intr">If the <a href="#insertion0">insertion mode</a>
|
||
is "<dfn id="in-row" title="insertion mode: in row">in row</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>A start tag whose tag name is one of: "th", "td"
|
||
|
||
</dt><dd>
|
||
<p><a href="#clear3">Clear the stack back to a table row context</a>.
|
||
(See below.)</p>
|
||
|
||
<p><a href="#insert" title="insert an HTML element">Insert an HTML
|
||
element</a> for the token, then switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-cell" title="insertion mode: in cell">in cell</a>".</p>
|
||
|
||
<p>Insert a marker at the end of the <a href="#list-of4">list of
|
||
active formatting elements</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "tr"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#clear3">Clear the stack back to a table row context</a>.
|
||
(See below.)</p>
|
||
|
||
<p>Pop the <a href="#current4">current node</a> (which will be a
|
||
<code><a href="section-tabular.html#tr">tr</a></code> element) from the <a href="#stack">stack of open elements</a>. Switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-table0" title="insertion mode: in table body">in table body</a>".</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "caption", "col",
|
||
"colgroup", "tbody", "tfoot", "thead", "tr"
|
||
|
||
</dt><dt>An end tag whose tag name is "table"
|
||
|
||
</dt><dd>
|
||
<p>Act as if an end tag with the tag name "tr" had been seen, then,
|
||
if that token wasn't ignored, reprocess the current token.</p>
|
||
|
||
<p class="note">The fake end tag token here can only be ignored in the
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "tbody", "tfoot", "thead"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token.</p>
|
||
|
||
<p>Otherwise, act as if an end tag with the tag name "tr" had been
|
||
seen, then reprocess the current token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "body", "caption", "col",
|
||
"colgroup", "html", "td", "th"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> was "<a href="#in-table" title="insertion mode: in
|
||
table">in table</a>".</p>
|
||
</dd></dl>
|
||
|
||
<p>When the steps above require the UA to <dfn id="clear3">clear the
|
||
stack back to a table row context</dfn>, it means that the UA must,
|
||
while the <a href="#current4">current node</a> is not a <code><a href="section-tabular.html#tr">tr</a></code> element or an <code><a href="section-the-root.html#html">html</a></code> element, pop elements from the <a href="#stack">stack of open elements</a>. If this causes any elements
|
||
to be popped from the stack, then this is a <a href="section-parsing.html#parse">parse
|
||
error</a>.</p>
|
||
|
||
<p class="note">The <a href="#current4">current node</a> being an
|
||
<code><a href="section-the-root.html#html">html</a></code> element after this process is an
|
||
<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>.</p>
|
||
|
||
</dd><dt id="parsing-main-intd">If the <a href="#insertion0">insertion mode</a>
|
||
is "<dfn id="in-cell" title="insertion mode: in cell">in cell</dfn>"
|
||
|
||
</dt><dd>
|
||
<dl class="switch">
|
||
<dt>An end tag whose tag name is one of: "td", "th"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as that of the
|
||
token, then this is a <a href="section-parsing.html#parse">parse error</a> and the token
|
||
must be ignored.</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p><a href="#generate">Generate implied end tags</a>, except for
|
||
elements with the same tag name as the token.</p>
|
||
|
||
<p>Now, if the <a href="#current4">current node</a> is not an element
|
||
with the same tag name as the token, then this is a <a href="section-parsing.html#parse">parse error</a>.</p>
|
||
|
||
<p>Pop elements from this stack until an element with the same tag
|
||
name as the token has been popped from the stack.</p>
|
||
|
||
<p><a href="#clear0">Clear the list of active formatting elements up
|
||
to the last marker</a>.</p>
|
||
|
||
<p>Switch the <a href="#insertion0">insertion mode</a> to "<a href="#in-row" title="insertion mode: in row">in row</a>". (The <a href="#current4">current node</a> will be a <code><a href="section-tabular.html#tr">tr</a></code> element at this point.)</p>
|
||
|
||
</dd><dt>A start tag whose tag name is one of: "caption", "col",
|
||
"colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does
|
||
<em>not</em> <a href="#have-an0" title="has an element in table
|
||
scope">have a <code>td</code> or <code>th</code> element in table
|
||
scope</a>, then this is a <a href="section-parsing.html#parse">parse error</a>; ignore
|
||
the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise, <a href="#close2">close the cell</a> (see below) and
|
||
reprocess the current token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "body", "caption", "col",
|
||
"colgroup", "html"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "table", "tbody", "tfoot",
|
||
"thead", "tr"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as that of the
|
||
token (which can only happen for "tbody", "tfoot" and "thead", or,
|
||
in the <a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>), then
|
||
this is a <a href="section-parsing.html#parse">parse error</a> and the token must be
|
||
ignored.</p>
|
||
|
||
<p>Otherwise, <a href="#close2">close the cell</a> (see below) and
|
||
reprocess the current token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> was "<a href="#in-body" title="insertion mode: in body">in
|
||
body</a>".</p>
|
||
</dd></dl>
|
||
|
||
<p>Where the steps above say to <dfn id="close2">close the cell</dfn>,
|
||
they mean to follow the following algorithm:</p>
|
||
|
||
<ol>
|
||
<li>
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an0" title="has an element in table scope">has a
|
||
<code>td</code> element in table scope</a>, then act as if an end
|
||
tag token with the tag name "td" had been seen.
|
||
|
||
</p></li><li>
|
||
<p>Otherwise, the <a href="#stack">stack of open elements</a> will <a href="#have-an0" title="has an element in table scope">have a
|
||
<code>th</code> element in table scope</a>; act as if an end tag
|
||
token with the tag name "th" had been seen.
|
||
</p></li></ol>
|
||
|
||
<p class="note">The <a href="#stack">stack of open elements</a> cannot
|
||
have both a <code><a href="section-tabular.html#td">td</a></code> and a <code><a href="section-tabular.html#th">th</a></code> element <a href="#have-an0" title="has an
|
||
element in table scope">in table scope</a> at the same time, nor can
|
||
it have neither when the <a href="#insertion0">insertion mode</a> is
|
||
"<a href="#in-cell" title="insertion mode: in cell">in cell</a>".</p>
|
||
|
||
</dd><dt id="parsing-main-inselect">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-select" title="insertion mode: in select">in
|
||
select</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the token's
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is "option"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is an
|
||
<code>option</code> element, act as if an end tag with the tag name
|
||
"option" had been seen.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
</dd><dt>A start tag token whose tag name is "optgroup"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is an
|
||
<code>option</code> element, act as if an end tag with the tag name
|
||
"option" had been seen.</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is an
|
||
<code>optgroup</code> element, act as if an end tag with the tag
|
||
name "optgroup" had been seen.</p>
|
||
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.</p>
|
||
|
||
</dd><dt>An end tag token whose tag name is "optgroup"
|
||
|
||
</dt><dd>
|
||
<p>First, if the <a href="#current4">current node</a> is an
|
||
<code>option</code> element, and the node immediately before it in
|
||
the <a href="#stack">stack of open elements</a> is an
|
||
<code>optgroup</code> element, then act as if an end tag with the
|
||
tag name "option" had been seen.</p>
|
||
|
||
<p>If the <a href="#current4">current node</a> is an
|
||
<code>optgroup</code> element, then pop that node from the <a href="#stack">stack of open elements</a>. Otherwise, this is a <a href="section-parsing.html#parse">parse error</a>, ignore the token.</p>
|
||
|
||
</dd><dt>An end tag token whose tag name is "option"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is an
|
||
<code>option</code> element, then pop that node from the <a href="#stack">stack of open elements</a>. Otherwise, this is a <a href="section-parsing.html#parse">parse error</a>, ignore the token.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is "select"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#stack">stack of open elements</a> does not <a href="#have-an0" title="has an element in table scope">have an
|
||
element in table scope</a> with the same tag name as the token, this
|
||
is a <a href="section-parsing.html#parse">parse error</a>. Ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise:</p>
|
||
|
||
<p>Pop elements from the <a href="#stack">stack of open elements</a>
|
||
until a <code>select</code> element has been popped from the stack.</p>
|
||
|
||
<p><a href="#reset">Reset the insertion mode appropriately</a>.</p>
|
||
|
||
</dd><dt>A start tag whose tag name is "select"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Act as if the token had been an
|
||
end tag with the tag name "select" instead.</p>
|
||
|
||
</dd><dt>An end tag whose tag name is one of: "caption", "table", "tbody",
|
||
"tfoot", "thead", "tr", "td", "th"
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>.</p>
|
||
|
||
<p>If the <a href="#stack">stack of open elements</a> <a href="#have-an0">has an element in table scope</a> with the same tag
|
||
name as that of the token, then act as if an end tag with the tag
|
||
name "select" had been seen, and reprocess the token. Otherwise,
|
||
ignore the token.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-afterbody">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="after2" title="insertion mode: after body">after
|
||
body</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p>Process the token as it would be processed if the <a href="#insertion0">insertion mode</a> was "<a href="#in-body" title="insertion mode: in body">in body</a>".</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the first element in the <a href="#stack">stack of open elements</a> (the <code><a href="section-the-root.html#html">html</a></code> element), with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>If the parser was originally created in order to handle the
|
||
setting of <em>an element</em>'s <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code> attribute, this is a <a href="section-parsing.html#parse">parse error</a>; ignore the token. (The element will
|
||
be an <code><a href="section-the-root.html#html">html</a></code> element in this case.)
|
||
(<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise, switch to <a href="#the-trailing0">the trailing end
|
||
phase</a>.</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Set the <a href="#insertion0">insertion mode</a> to "<a href="#in-body" title="insertion mode: in body">in body</a>" and reprocess the
|
||
token.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-inframeset">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="in-frameset" title="insertion mode: in frameset">in
|
||
frameset</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "frameset"
|
||
|
||
</dt><dd>
|
||
<p><a href="#insert" title="Insert an HTML element">Insert a
|
||
<code>frameset</code> element</a> for the token.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "frameset"
|
||
|
||
</dt><dd>
|
||
<p>If the <a href="#current4">current node</a> is the root <code><a href="section-the-root.html#html">html</a></code> element, then this is a <a href="section-parsing.html#parse">parse error</a>; ignore the token. (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>)</p>
|
||
|
||
<p>Otherwise, pop the <a href="#current4">current node</a> from the
|
||
<a href="#stack">stack of open elements</a>.</p>
|
||
|
||
<p>If the parser was <em>not</em> originally created in order to
|
||
handle the setting of an element's <code title="dom-innerHTML-HTML"><a href="section-dynamic.html#innerhtml0">innerHTML</a></code> attribute (<a href="section-dynamic.html#innerhtml1"><code>innerHTML</code> case</a>), and the <a href="#current4">current node</a> is no longer a
|
||
<code>frameset</code> element, then change the <a href="#insertion0">insertion mode</a> to "<a href="#after3" title="insertion mode: after frameset">after frameset</a>".</p>
|
||
|
||
</dd><dt>A start tag with the tag name "frame"
|
||
|
||
</dt><dd>
|
||
<p><a href="#insert">Insert an HTML element</a> for the token.
|
||
Immediately pop the <a href="#current4">current node</a> off the <a href="#stack">stack of open elements</a>.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "noframes"
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> had been "<a href="#in-body" title="insertion mode: in
|
||
body">in body</a>".</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
</dd></dl>
|
||
|
||
</dd><dt id="parsing-main-afterframeset">If the <a href="#insertion0">insertion
|
||
mode</a> is "<dfn id="after3" title="insertion mode: after
|
||
frameset">after frameset</dfn>"
|
||
|
||
</dt><dd>
|
||
<p>Handle the token as follows:</p>
|
||
|
||
<dl class="switch">
|
||
<dt>A character token that is one of one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C
|
||
FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p><a href="#append" title="append a character">Append the
|
||
character</a> to the <a href="#current4">current node</a>.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <a href="#current4">current node</a> with the <code title="">data</code> attribute set to the data given in the comment
|
||
token.</p>
|
||
|
||
</dd><dt>An end tag with the tag name "html"
|
||
|
||
</dt><dd>
|
||
<p>Switch to <a href="#the-trailing0">the trailing end phase</a>.</p>
|
||
|
||
</dd><dt>A start tag with the tag name "noframes"
|
||
|
||
</dt><dd>
|
||
<p>Process the token as if the <a href="#insertion0">insertion
|
||
mode</a> had been "<a href="#in-body" title="insertion mode: in
|
||
body">in body</a>".</p>
|
||
|
||
</dd><dt>Anything else
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
</dd></dl>
|
||
</dd></dl>
|
||
</dd></dl>
|
||
|
||
<p class="big-issue">This doesn't handle UAs that don't support frames, or
|
||
that do support frames but want to show the NOFRAMES content. Supporting
|
||
the former is easy; supporting the latter is harder.
|
||
|
||
</p><h5 id="the-trailing"><span class="secno">8.2.4.4. </span><dfn id="the-trailing0">The trailing end phase</dfn></h5>
|
||
|
||
<p>After <a href="#the-main0">the main phase</a>, as each token is emitted
|
||
from the <a href="section-tokenisation.html#tokenisation0">tokenisation</a> stage, it must be
|
||
processed as described in this section.
|
||
|
||
</p><dl class="switch">
|
||
<dt>A DOCTYPE token
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Ignore the token.</p>
|
||
|
||
</dd><dt>A comment token
|
||
|
||
</dt><dd>
|
||
<p>Append a <code>Comment</code> node to the <code>Document</code> object
|
||
with the <code title="">data</code> attribute set to the data given in
|
||
the comment token.</p>
|
||
|
||
</dd><dt>A character token that is one of one of U+0009 CHARACTER TABULATION,
|
||
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
|
||
U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dd>
|
||
<p>Process the token as it would be processed in <a href="#the-main0">the
|
||
main phase</a>.</p>
|
||
|
||
</dd><dt>A character token that is <em>not</em> one of U+0009 CHARACTER
|
||
TABULATION, U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM
|
||
FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
|
||
|
||
</dt><dt>A start tag token
|
||
|
||
</dt><dt>An end tag token
|
||
|
||
</dt><dd>
|
||
<p><a href="section-parsing.html#parse">Parse error</a>. Switch back to <a href="#the-main0">the main phase</a> and reprocess the token.</p>
|
||
|
||
</dd><dt>An end-of-file token
|
||
|
||
</dt><dd>
|
||
<p><a href="#stops">Stop parsing</a>.</p>
|
||
</dd></dl>
|
||
|
||
<h4 id="the-end"><span class="secno">8.2.5. </span>The End</h4>
|
||
|
||
<p>Once the user agent <dfn id="stops" title="stop parsing">stops
|
||
parsing</dfn> the document, the user agent must follow the steps in this
|
||
section.
|
||
|
||
</p><p>First, <!--the user agent must <span title="fire a DOMContentLoaded
|
||
event">fire a <code
|
||
title="event-DOMContentLoaded">DOMContentLoaded</code> event</span>
|
||
at <span>the <code>body</code> element</span>.</p>
|
||
|
||
<p>Then, -->the
|
||
rules for <a href="section-scripting0.html#when-a">when a script completes loading</a> start
|
||
applying (script execution is no longer managed by the parser).
|
||
|
||
</p><p>If any of the scripts in the <a href="section-scripting0.html#list-of1">list of scripts that
|
||
will execute as soon as possible</a> have <span>completed
|
||
loading</span><!-- XXX xref -->, or if the <a href="section-scripting0.html#list-of0">list of
|
||
scripts that will execute asynchronously</a> is not empty and the first
|
||
script in that list has <span>completed loading</span><!-- XXX xref
|
||
-->,
|
||
then the user agent must act as if those scripts just completed loading,
|
||
following the rules given for that in the <code><a href="section-scripting0.html#script0">script</a></code> element definition.
|
||
|
||
</p><p>Then, if the <a href="section-scripting0.html#list-of">list of scripts that will execute when
|
||
the document has finished parsing</a> is not empty, and the first item in
|
||
this list has already <span>completed loading</span><!--XXX
|
||
xref -->,
|
||
then the user agent must act as if that script just finished loading.
|
||
|
||
</p><p>By this point, there will be no scripts that have loaded but have not
|
||
yet been executed.
|
||
|
||
</p><p>The user agent must then <a href="section-scripting.html#firing2">fire a simple event</a>
|
||
called <code title="event-DOMContentLoaded">DOMContentLoaded</code> at the
|
||
<code>Document</code>.
|
||
|
||
</p><p>Once everything that <dfn id="delays" title="delay the load event">delays
|
||
the load event</dfn> has completed, the user agent must <a href="section-scripting.html#firing4" title="fire a load event">fire a <code title="event-load">load</code>
|
||
event</a> at <a href="section-dom-tree.html#the-body0">the <code>body</code> element</a>.</p>
|
||
<!-- XXX make sure things "delay the load event" -->
|
||
<!--XXX need to handle
|
||
http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/CNavDTD.cpp#2354
|
||
2354 // Don't open transient styles if it makes the stack deep, bug 58917.
|
||
-->
|
||
<!--XXX
|
||
http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/nsHTMLTokenizer.cpp#749
|
||
-->
|
||
<!--
|
||
see also CTextToken::ConsumeCharacterData() for CDATA parsing?
|
||
|
||
1212 1 Here's a tricky case from bug 22596: <h5><li><h5>
|
||
1213 How do we know that the 2nd <h5> should close the <LI> rather than nest inside the <LI>?
|
||
1214 (Afterall, the <h5> is a legal child of the <LI>).
|
||
1215
|
||
1216 The way you know is that there is no root between the two, so the <h5> binds more
|
||
1217 tightly to the 1st <h5> than to the <LI>.
|
||
1218 2. Also, bug 6148 shows this case: <SPAN><DIV><SPAN>
|
||
1219 From this case we learned not to execute this logic if the parent is a block.
|
||
1220
|
||
1221 3. Fix for 26583
|
||
1222 Ex. <A href=foo.html><B>foo<A href-bar.html>bar</A></B></A> <- A legal HTML
|
||
1223 In the above example clicking on "foo" or "bar" should link to
|
||
1224 foo.html or bar.html respectively. That is, the inner <A> should be informed
|
||
1225 about the presence of an open <A> above <B>..so that the inner <A> can close out
|
||
1226 the outer <A>. The following code does it for us.
|
||
1227
|
||
1228 4. Fix for 27865 [ similer to 22596 ]. Ex: <DL><DD><LI>one<DD><LI>two
|
||
- http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/CNavDTD.cpp#1211
|
||
|
||
815 // Here's a problem. If theTag is legal in here, we don't move it
|
||
816 // out. So if we're moving stuff out of here, the parent of theTag
|
||
817 // gets closed at this point. But some things are legal
|
||
818 // _everywhere_ and hence would effectively close out misplaced
|
||
819 // content in tables. This is undesirable, so treat them as
|
||
820 // illegal here so they'll be shipped out with their parents and
|
||
821 // siblings. See bug 40855 for an explanation (that bug was for
|
||
822 // comments, but the same issues arise with whitespace, newlines,
|
||
823 // noscript, etc). Script is special, though. Shipping it out
|
||
824 // breaks document.write stuff. See bug 243064.
|
||
- http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/CNavDTD.cpp#825
|
||
|
||
|
||
1326 /**************************************************************************************
|
||
1327 *
|
||
1328 * Now a little code to deal with bug #49687 (crash when layout stack gets too deep)
|
||
1329 * I've also opened this up to any container (not just inlines): re bug 55095
|
||
1330 * Improved to handle bug 55980 (infinite loop caused when DEPTH is exceeded and
|
||
1331 * </P> is encountered by itself (<P>) is continuously produced.
|
||
1332 *
|
||
1333 **************************************************************************************/
|
||
|
||
1912 // Oh boy!! we found a "stray" tag. Nav4.x and IE introduce line break in
|
||
1913 // such cases. So, let's simulate that effect for compatibility.
|
||
1914 // Ex. <html><body>Hello</P>There</body></html>
|
||
http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/CNavDTD.cpp#1912
|
||
|
||
http://lxr.mozilla.org/seamonkey/search?string=nested
|
||
/parser/htmlparser/src/CNavDTD.cpp, line 791 - * 2. <CENTER><DL><DT><A><CENTER> allow nested <CENTER>
|
||
/parser/htmlparser/src/CNavDTD.cpp, line 792 - * 3. <TABLE><TR><TD><TABLE>... allow nested <TABLE>
|
||
/parser/htmlparser/src/CNavDTD.cpp, line 2562 - // Discard nested forms - bug 72639
|
||
/parser/htmlparser/src/nsElementTable.cpp, line 1453 - * 2. <CENTER><DL><DT><A><CENTER> allow nested <CENTER>
|
||
/parser/htmlparser/src/nsElementTable.cpp, line 1454 - * 3. <TABLE><TR><TD><TABLE>... allow nested <TABLE>
|
||
/parser/htmlparser/src/nsElementTable.cpp, line 1901 - // Ex: <H1><LI><H1><LI>. Inner LI has the potential of getting nested
|
||
-->
|
||
|
||
<script src="http://status.whatwg.org/annotate-web-apps.js" type="text/javascript"></script></body></html> |