| Index: node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/serialization/serializer.js
|
| diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/serialization/serializer.js b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/serialization/serializer.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7e60e5c7c04baebb96196477a604d7bedb8756b0
|
| --- /dev/null
|
| +++ b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/lib/serialization/serializer.js
|
| @@ -0,0 +1,184 @@
|
| +'use strict';
|
| +
|
| +var DefaultTreeAdapter = require('../tree_adapters/default'),
|
| + HTML = require('../common/html');
|
| +
|
| +//Aliases
|
| +var $ = HTML.TAG_NAMES,
|
| + NS = HTML.NAMESPACES;
|
| +
|
| +
|
| +//Escaping regexes
|
| +var AMP_REGEX = /&/g,
|
| + NBSP_REGEX = /\u00a0/g,
|
| + DOUBLE_QUOTE_REGEX = /"/g,
|
| + LT_REGEX = /</g,
|
| + GT_REGEX = />/g;
|
| +
|
| +
|
| +//Escape string
|
| +function escapeString(str, attrMode) {
|
| + str = str
|
| + .replace(AMP_REGEX, '&')
|
| + .replace(NBSP_REGEX, ' ');
|
| +
|
| + if (attrMode)
|
| + str = str.replace(DOUBLE_QUOTE_REGEX, '"');
|
| +
|
| + else {
|
| + str = str
|
| + .replace(LT_REGEX, '<')
|
| + .replace(GT_REGEX, '>');
|
| + }
|
| +
|
| + return str;
|
| +}
|
| +
|
| +//Enquote doctype ID
|
| +function enquoteDoctypeId(id) {
|
| + var quote = id.indexOf('"') !== -1 ? '\'' : '"';
|
| +
|
| + return quote + id + quote;
|
| +}
|
| +
|
| +
|
| +//Serializer
|
| +var Serializer = module.exports = function (treeAdapter) {
|
| + this.treeAdapter = treeAdapter || DefaultTreeAdapter;
|
| +};
|
| +
|
| +
|
| +//API
|
| +Serializer.prototype.serialize = function (node) {
|
| + this.html = '';
|
| + this._serializeChildNodes(node);
|
| +
|
| + return this.html;
|
| +};
|
| +
|
| +
|
| +//Internals
|
| +Serializer.prototype._serializeChildNodes = function (parentNode) {
|
| + var childNodes = this.treeAdapter.getChildNodes(parentNode);
|
| +
|
| + if (childNodes) {
|
| + for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) {
|
| + var currentNode = childNodes[i];
|
| +
|
| + if (this.treeAdapter.isElementNode(currentNode))
|
| + this._serializeElement(currentNode);
|
| +
|
| + else if (this.treeAdapter.isTextNode(currentNode))
|
| + this._serializeTextNode(currentNode);
|
| +
|
| + else if (this.treeAdapter.isCommentNode(currentNode))
|
| + this._serializeCommentNode(currentNode);
|
| +
|
| + else if (this.treeAdapter.isDocumentTypeNode(currentNode))
|
| + this._serializeDocumentTypeNode(currentNode);
|
| + }
|
| + }
|
| +};
|
| +
|
| +Serializer.prototype._serializeElement = function (node) {
|
| + var tn = this.treeAdapter.getTagName(node),
|
| + ns = this.treeAdapter.getNamespaceURI(node),
|
| + qualifiedTn = (ns === NS.HTML || ns === NS.SVG || ns === NS.MATHML) ? tn : (ns + ':' + tn);
|
| +
|
| + this.html += '<' + qualifiedTn;
|
| + this._serializeAttributes(node);
|
| + this.html += '>';
|
| +
|
| + if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR &&
|
| + tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT &&
|
| + tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE &&
|
| + tn !== $.TRACK && tn !== $.WBR) {
|
| +
|
| + if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) {
|
| + var firstChild = this.treeAdapter.getFirstChild(node);
|
| +
|
| + if (firstChild && this.treeAdapter.isTextNode(firstChild)) {
|
| + var content = this.treeAdapter.getTextNodeContent(firstChild);
|
| +
|
| + if (content[0] === '\n')
|
| + this.html += '\n';
|
| + }
|
| + }
|
| +
|
| + var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ?
|
| + this.treeAdapter.getChildNodes(node)[0] :
|
| + node;
|
| +
|
| + this._serializeChildNodes(childNodesHolder);
|
| + this.html += '</' + qualifiedTn + '>';
|
| + }
|
| +};
|
| +
|
| +Serializer.prototype._serializeAttributes = function (node) {
|
| + var attrs = this.treeAdapter.getAttrList(node);
|
| +
|
| + for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) {
|
| + var attr = attrs[i];
|
| +
|
| + this.html += ' ';
|
| +
|
| + if (!attr.namespace)
|
| + this.html += attr.name;
|
| +
|
| + else if (attr.namespace === NS.XML)
|
| + this.html += 'xml:' + attr.name;
|
| +
|
| + else if (attr.namespace === NS.XMLNS) {
|
| + if (attr.name !== 'xmlns')
|
| + this.html += 'xmlns:';
|
| +
|
| + this.html += attr.name;
|
| + }
|
| +
|
| + else if (attr.namespace === NS.XLINK)
|
| + this.html += 'xlink:' + attr.name;
|
| +
|
| + else
|
| + this.html += attr.namespace + ':' + attr.name;
|
| +
|
| + this.html += '="' + escapeString(attr.value, true) + '"';
|
| + }
|
| +};
|
| +
|
| +Serializer.prototype._serializeTextNode = function (node) {
|
| + var parent = this.treeAdapter.getParentNode(node),
|
| + parentTn = parent && this.treeAdapter.getTagName(parent),
|
| + content = this.treeAdapter.getTextNodeContent(node);
|
| +
|
| + if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME ||
|
| + parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT) {
|
| + this.html += content;
|
| + }
|
| +
|
| + else
|
| + this.html += escapeString(content, false);
|
| +};
|
| +
|
| +Serializer.prototype._serializeCommentNode = function (node) {
|
| + this.html += '<!--' + this.treeAdapter.getCommentNodeContent(node) + '-->';
|
| +};
|
| +
|
| +Serializer.prototype._serializeDocumentTypeNode = function (node) {
|
| + var name = this.treeAdapter.getDocumentTypeNodeName(node),
|
| + publicId = this.treeAdapter.getDocumentTypeNodePublicId(node),
|
| + systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node);
|
| +
|
| + this.html += '<!DOCTYPE ' + name;
|
| +
|
| + if (publicId !== null)
|
| + this.html += ' PUBLIC ' + enquoteDoctypeId(publicId);
|
| +
|
| + else if (systemId !== null)
|
| + this.html += ' SYSTEM';
|
| +
|
| + if (systemId !== null)
|
| + this.html += ' ' + enquoteDoctypeId(systemId);
|
| +
|
| +
|
| + this.html += '>';
|
| +};
|
|
|