'use strict'; var runtimeHtmlHelpers = require('marko/runtime/html/helpers'); var escapeXml = runtimeHtmlHelpers.x; var escapeXmlAttr = runtimeHtmlHelpers.xa; var openTagOnly = {}; [ 'base', 'br', 'col', 'hr', 'embed', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr' ].forEach(function(tagName) { openTagOnly[tagName] = true; }); function getNodeValue(node) { return node.___nodeValue || node.nodeValue; } function getFirstChild(node) { return node.___firstChild || node.firstChild; } function getNextSibling(node) { return node.___nextSibling || node.nextSibling; } function vdomToHTML(node, options) { // NOTE: We don't use XMLSerializer because we need to sort the attributes to correctly compare output HTML strings // BAD: return (new XMLSerializer()).serializeToString(node); var html = ''; function serializeHelper(node) { var nodeType = node.nodeType || node.___nodeType; if (nodeType === 1) { serializeElHelper(node); } else if (nodeType === 3) { serializeTextHelper(node); } else if (nodeType === 8) { serializeCommentHelper(node); } else { console.log('Invalid node:', node); html += `INVALID NODE TYPE ${nodeType}\n`; } } function serializeElHelper(el) { var tagName = el.nodeName; html += '<' + tagName; var attributes = el.attributes; var attributesArray = []; var attrName; if (typeof attributes.length === 'number') { for (var i=0; i'; } } function serializeTextHelper(node, escape) { html += escape !== false ? escapeXml(getNodeValue(node)) : getNodeValue(node); } function serializeCommentHelper(node) { html += ''; } let nodeType = node.nodeType || node.___nodeType; if (nodeType === 11 /* DocumentFragment */ || (options && options.childrenOnly)) { var curChild = getFirstChild(node); while(curChild) { serializeHelper(curChild); curChild = getNextSibling(curChild); } } else { serializeHelper(node); } return html; } module.exports = vdomToHTML;