Index: node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/simple_api/tokenizer_proxy.js |
diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/simple_api/tokenizer_proxy.js b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/simple_api/tokenizer_proxy.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a3add571676e973a25ae8e4839c6bce8bca779c2 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/simple_api/tokenizer_proxy.js |
@@ -0,0 +1,121 @@ |
+'use strict'; |
+ |
+var Tokenizer = require('../tokenization/tokenizer'), |
+ ForeignContent = require('../common/foreign_content'), |
+ UNICODE = require('../common/unicode'), |
+ HTML = require('../common/html'); |
+ |
+//Aliases |
+var $ = HTML.TAG_NAMES, |
+ NS = HTML.NAMESPACES; |
+ |
+ |
+//Tokenizer proxy |
+//NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction. |
+var TokenizerProxy = module.exports = function (html) { |
+ this.tokenizer = new Tokenizer(html); |
+ |
+ this.namespaceStack = []; |
+ this.namespaceStackTop = -1; |
+ this.currentNamespace = null; |
+ this.inForeignContent = false; |
+}; |
+ |
+//API |
+TokenizerProxy.prototype.getNextToken = function () { |
+ var token = this.tokenizer.getNextToken(); |
+ |
+ if (token.type === Tokenizer.START_TAG_TOKEN) |
+ this._handleStartTagToken(token); |
+ |
+ else if (token.type === Tokenizer.END_TAG_TOKEN) |
+ this._handleEndTagToken(token); |
+ |
+ else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) { |
+ token.type = Tokenizer.CHARACTER_TOKEN; |
+ token.chars = UNICODE.REPLACEMENT_CHARACTER; |
+ } |
+ |
+ return token; |
+}; |
+ |
+//Namespace stack mutations |
+TokenizerProxy.prototype._enterNamespace = function (namespace) { |
+ this.namespaceStackTop++; |
+ this.namespaceStack.push(namespace); |
+ |
+ this.inForeignContent = namespace !== NS.HTML; |
+ this.currentNamespace = namespace; |
+ this.tokenizer.allowCDATA = this.inForeignContent; |
+}; |
+ |
+TokenizerProxy.prototype._leaveCurrentNamespace = function () { |
+ this.namespaceStackTop--; |
+ this.namespaceStack.pop(); |
+ |
+ this.currentNamespace = this.namespaceStack[this.namespaceStackTop]; |
+ this.inForeignContent = this.currentNamespace !== NS.HTML; |
+ this.tokenizer.allowCDATA = this.inForeignContent; |
+}; |
+ |
+//Token handlers |
+TokenizerProxy.prototype._ensureTokenizerState = function (tn) { |
+ if (tn === $.TEXTAREA || tn === $.TITLE) |
+ this.tokenizer.state = Tokenizer.RCDATA_STATE; |
+ |
+ else if (tn === $.PLAINTEXT) |
+ this.tokenizer.state = Tokenizer.PLAINTEXT_STATE; |
+ |
+ else if (tn === $.SCRIPT) |
+ this.tokenizer.state = Tokenizer.SCRIPT_DATA_STATE; |
+ |
+ else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP || |
+ tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) { |
+ this.tokenizer.state = Tokenizer.RAWTEXT_STATE; |
+ } |
+}; |
+ |
+TokenizerProxy.prototype._handleStartTagToken = function (token) { |
+ var tn = token.tagName; |
+ |
+ if (tn === $.SVG) |
+ this._enterNamespace(NS.SVG); |
+ |
+ else if (tn === $.MATH) |
+ this._enterNamespace(NS.MATHML); |
+ |
+ else { |
+ if (this.inForeignContent) { |
+ if (ForeignContent.causesExit(token)) |
+ this._leaveCurrentNamespace(); |
+ |
+ else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) || |
+ ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) { |
+ this._enterNamespace(NS.HTML); |
+ } |
+ } |
+ |
+ else |
+ this._ensureTokenizerState(tn); |
+ } |
+}; |
+ |
+TokenizerProxy.prototype._handleEndTagToken = function (token) { |
+ var tn = token.tagName; |
+ |
+ if (!this.inForeignContent) { |
+ var previousNs = this.namespaceStack[this.namespaceStackTop - 1]; |
+ |
+ //NOTE: check for exit from integration point |
+ if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) || |
+ ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) { |
+ this._leaveCurrentNamespace(); |
+ } |
+ |
+ else if (tn === $.SCRIPT) |
+ this.tokenizer.state = Tokenizer.DATA_STATE; |
+ } |
+ |
+ else if ((tn === $.SVG && this.currentNamespace === NS.SVG) || (tn === $.MATH && this.currentNamespace === NS.MATHML)) |
+ this._leaveCurrentNamespace(); |
+}; |