summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js')
-rw-r--r--bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js153
1 files changed, 153 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js b/bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js
new file mode 100644
index 00000000..db51623e
--- /dev/null
+++ b/bin/wiki/ImportarDesdeURL/node_modules/parse5/lib/sax/parser_feedback_simulator.js
@@ -0,0 +1,153 @@
+'use strict';
+
+var Tokenizer = require('../tokenizer'),
+ foreignContent = require('../common/foreign_content'),
+ UNICODE = require('../common/unicode'),
+ HTML = require('../common/html');
+
+
+//Aliases
+var $ = HTML.TAG_NAMES,
+ NS = HTML.NAMESPACES;
+
+
+//ParserFeedbackSimulator
+//Simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
+var ParserFeedbackSimulator = module.exports = function (tokenizer) {
+ this.tokenizer = tokenizer;
+
+ this.namespaceStack = [];
+ this.namespaceStackTop = -1;
+ this._enterNamespace(NS.HTML);
+};
+
+ParserFeedbackSimulator.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;
+ }
+
+ else if (this.skipNextNewLine) {
+ if (token.type !== Tokenizer.HIBERNATION_TOKEN)
+ this.skipNextNewLine = false;
+
+ if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
+ if (token.chars.length === 1)
+ return this.getNextToken();
+
+ token.chars = token.chars.substr(1);
+ }
+ }
+
+ return token;
+};
+
+//Namespace stack mutations
+ParserFeedbackSimulator.prototype._enterNamespace = function (namespace) {
+ this.namespaceStackTop++;
+ this.namespaceStack.push(namespace);
+
+ this.inForeignContent = namespace !== NS.HTML;
+ this.currentNamespace = namespace;
+ this.tokenizer.allowCDATA = this.inForeignContent;
+};
+
+ParserFeedbackSimulator.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
+ParserFeedbackSimulator.prototype._ensureTokenizerMode = function (tn) {
+ if (tn === $.TEXTAREA || tn === $.TITLE)
+ this.tokenizer.state = Tokenizer.MODE.RCDATA;
+
+ else if (tn === $.PLAINTEXT)
+ this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+
+ else if (tn === $.SCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
+
+ else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP ||
+ tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
+};
+
+ParserFeedbackSimulator.prototype._handleStartTagToken = function (token) {
+ var tn = token.tagName;
+
+ if (tn === $.SVG)
+ this._enterNamespace(NS.SVG);
+
+ else if (tn === $.MATH)
+ this._enterNamespace(NS.MATHML);
+
+ if (this.inForeignContent) {
+ if (foreignContent.causesExit(token)) {
+ this._leaveCurrentNamespace();
+ return;
+ }
+
+ var currentNs = this.currentNamespace;
+
+ if (currentNs === NS.MATHML)
+ foreignContent.adjustTokenMathMLAttrs(token);
+
+ else if (currentNs === NS.SVG) {
+ foreignContent.adjustTokenSVGTagName(token);
+ foreignContent.adjustTokenSVGAttrs(token);
+ }
+
+ foreignContent.adjustTokenXMLAttrs(token);
+
+ tn = token.tagName;
+
+ if (!token.selfClosing && foreignContent.isIntegrationPoint(tn, currentNs, token.attrs))
+ this._enterNamespace(NS.HTML);
+ }
+
+ else {
+ if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING)
+ this.skipNextNewLine = true;
+
+ else if (tn === $.IMAGE)
+ token.tagName = $.IMG;
+
+ this._ensureTokenizerMode(tn);
+ }
+};
+
+ParserFeedbackSimulator.prototype._handleEndTagToken = function (token) {
+ var tn = token.tagName;
+
+ if (!this.inForeignContent) {
+ var previousNs = this.namespaceStack[this.namespaceStackTop - 1];
+
+ if (previousNs === NS.SVG && foreignContent.SVG_TAG_NAMES_ADJUSTMENT_MAP[tn])
+ tn = foreignContent.SVG_TAG_NAMES_ADJUSTMENT_MAP[tn];
+
+ //NOTE: check for exit from integration point
+ if (foreignContent.isIntegrationPoint(tn, previousNs, token.attrs))
+ this._leaveCurrentNamespace();
+ }
+
+ else if (tn === $.SVG && this.currentNamespace === NS.SVG ||
+ tn === $.MATH && this.currentNamespace === NS.MATHML)
+ this._leaveCurrentNamespace();
+
+ // NOTE: adjust end tag name as well for consistency
+ if (this.currentNamespace === NS.SVG)
+ foreignContent.adjustTokenSVGTagName(token);
+};