--- markup/html/scripting-parser/parser.html 2008/04/29 03:29:41 1.15 +++ markup/html/scripting-parser/parser.html 2008/05/16 10:29:25 1.17 @@ -83,6 +83,7 @@ doc = new JSDocument (this); doc.manakaiIsHTML = true; } + this.nextToken = []; this.doc = doc; this.openElements = [doc]; this.input = i; @@ -92,6 +93,10 @@ } // Parser Parser.prototype.getNextToken = function () { + if (this.nextToken.length) { + return this.nextToken.shift (); + } + var p = this; var i = this.input; if (this.parseMode == 'cdata') { @@ -146,7 +151,7 @@ i.s = i.s.replace (/^<\/([^>]+)(?:>|$)/, function (s, e) { if (p.insertionPoint < s.length || (p.insertionPoint <= s.length && - s.substring (s.length - 1, 1) != '>')) { + s.substring (s.length - 1, s.length) != '>')) { token = {type: 'abort'}; return s; } @@ -158,7 +163,7 @@ i.s = i.s.replace (/^<([^>]+)(?:>|$)/, function (s, e) { if (p.insertionPoint < s.length || (p.insertionPoint <= s.length && - s.substring (s.length - 1, 1) != '>')) { + s.substring (s.length - 1, s.length) != '>')) { token = {type: 'abort'}; return s; } @@ -221,6 +226,24 @@ var token = this.getNextToken (); log ('token: ' + token.type + ' "' + token.value + '"'); + if (this.cdataEndTagRequired) { + // Generic CDATA parsing algorithm + + if (token.type != 'abort') { + // 7. + if (token.type == 'end-tag' && token.value == this.endTagName) { + // 7.1. Ignores it. + // + } else { + // 7.2. Parse error. + log ('Parse error: no '); + this.nextToken.unshift (token); + } + this.cdataEndTagRequired = false; + continue; + } + } + if (token.type == 'start-tag') { if (token.value == 'script') { // 1. Create an element for the token in the HTML namespace. @@ -257,6 +280,7 @@ if (!(token.type == 'end-tag' && token.value == 'script')) { // 7.2. This is a parse error. log ('Parse error: no '); + this.nextToken.unshift (token); // 7.3. Mark the script element as "already executed". el.manakaiAlreadyExecuted = true; @@ -348,11 +372,17 @@ // 6. Switched back to the PCDATA state. this.parseMode = 'pcdata'; + if (token.type == 'abort') { + this.cdataEndTagRequired = true; + break; + } + // 7.1. If the next token is not an end tag token with ... if (!(token.type == 'end-tag' && token.value == this.endTagName)) { // 7.2. This is a parse error. log ('Parse error: no '); + this.nextToken.unshift (token); // 7.3. Mark the script element as "already executed". el.manakaiAlreadyExecuted = true; @@ -568,7 +598,6 @@ } // If the load was successful - log ('load event fired at the script element'); if (true) { // Scripting is enabled, Document.designMode is disabled, @@ -577,6 +606,8 @@ parseAndRunScript (doc, s); } + log ('load event fired at the script element'); + log ('executing a script block: end'); } // executeScript @@ -866,11 +897,12 @@ algorithm, and so on.
  • Does not raise parse errors for invalid attribute specifications in start or end tags. -
  • Does not support PCDATA elements (title and +
  • Does not support RCDATA elements (title and textarea). -
  • Does not strip the first newline in pre elements. +
  • Does not strip the first newline in pre, +listing, and textarea elements.
  • Does not support <!--..--> parsing rule -in script element. +in CDATA/RCDATA elements.
  • Does not support foreign (SVG or MathML) elements.
  • Only supports script type text/javascript. type and language @@ -914,7 +946,7 @@ - +