diff --git a/lib/jsdom/browser/domtohtml.js b/lib/jsdom/browser/domtohtml.js index 8fd77f64bb..b3467b54a6 100644 --- a/lib/jsdom/browser/domtohtml.js +++ b/lib/jsdom/browser/domtohtml.js @@ -23,9 +23,6 @@ var singleTags = { var expr = { upperCaseChars: /([A-Z])/g, breakBetweenTags: /(<(\/?\w+).*?>)(?=<(?!\/\2))/gi, - endsWithEndTag: /.+<\/\w[^>]*>$/, - startsWithEndTag: /^<\/\w/, - startsWithStartTag: /^<\w[^>]*[^\/]>.*$/, singleTag: (function() { var tags = []; for (var i in singleTags) { @@ -104,39 +101,6 @@ exports.stringifyElement = function stringifyElement(element) { return ret; }; -exports.formatHTML = function formatHTML(html) { - var formatted = '', - pad = 0; - - html = html.replace(expr.breakBetweenTags, '$1\r\n'); - html.split('\r\n').forEach(function(node, index) { - var indent = 0, padding = '', i; - - if (node.match(expr.endsWithEndTag)) { - indent = 0; - } else if (node.match(expr.startsWithEndTag)) { - if (pad != 0) { - pad -= 1; - } - } else if (node.match(expr.startsWithStartTag)) { - if (!expr.singleTag.exec(node)) { - indent = 1; - } - } else { - indent = 0; - } - - for (i = 0; i < pad; i++) { - padding += ' '; - } - - formatted += padding + node + '\r\n'; - pad += indent; - }); - - return formatted; -}; - var rawTextElements = /SCRIPT|STYLE/i; function stringifyDoctype (doctype) { @@ -164,72 +128,86 @@ function stringifyDoctype (doctype) { return dt; } -exports.generateHtmlRecursive = function generateHtmlRecursive(node, rawText) { - var ret = "", parent, current, i; - if (node) { - if (node.nodeType && - node.nodeType === node.ENTITY_REFERENCE_NODE) - { - node = node._entity; - } - - if (!rawText && node._parentNode) { - rawText = rawTextElements.test(node._parentNode.nodeName); - } +exports.makeHtmlGenerator = function makeHtmlGenerator(indentUnit, eol) { + indentUnit = indentUnit || ""; + eol = eol || ""; + + return function generateHtmlRecursive(node, rawText, curIndent) { + var ret = "", parent, current, i; + curIndent = curIndent || ""; + if (node) { + if (node.nodeType && + node.nodeType === node.ENTITY_REFERENCE_NODE) + { + node = node._entity; + } - switch (node.nodeType) { - case node.ELEMENT_NODE: - current = exports.stringifyElement(node); - ret += current.start; + var childNodesRawText = rawText || rawTextElements.test(node.nodeName); - if (node._childNodes.length > 0) { - for (i=0; i 0) { + if (node._childNodes[0].nodeType !== node.TEXT_NODE) { + ret += eol; + } + for (i=0; i'; - break; - case node.DOCUMENT_NODE: - for (i=0; i' + eol; + break; + case node.DOCUMENT_NODE: + for (i=0; i