给出这样的字符串:
' \n <div id="a">\n <span class="b">\n<span>Hello</span>\n\n\n</span> <input type="text">\n \n</div>\n '
我想像这样格式化:
<div id="a">
<span class="b">
<span>Hello</span>
</span>
<input type="text">
</div>
即。结果应该是:(假设有2个缩进空格)
'<div id="a">\n <span class="b">\n <span>\n Hello\n </span>\n </span>\n <input type="text">\n</div>'
实现这一目标的最优雅方式是什么?是否有任何已知的库可以做到这一点?
注意:
答案 0 :(得分:16)
这是我写的一个简单的递归函数,我认为它可以帮助你实现你所追求的目标。
function process(str) {
var div = document.createElement('div');
div.innerHTML = str.trim();
return format(div, 0).innerHTML;
}
function format(node, level) {
var indentBefore = new Array(level++ + 1).join(' '),
indentAfter = new Array(level - 1).join(' '),
textNode;
for (var i = 0; i < node.children.length; i++) {
textNode = document.createTextNode('\n' + indentBefore);
node.insertBefore(textNode, node.children[i]);
format(node.children[i], level);
if (node.lastElementChild == node.children[i]) {
textNode = document.createTextNode('\n' + indentAfter);
node.appendChild(textNode);
}
}
return node;
}
然后你会像这样使用它:
process(str);
这是一个演示:
var str = '<div id="a"><span class="b"><span>Hello</span></span><input type="text"><p><b>b <i>italic</i></b></p></div>';
function process(str) {
var div = document.createElement('div');
div.innerHTML = str.trim();
return format(div, 0).innerHTML;
}
function format(node, level) {
var indentBefore = new Array(level++ + 1).join(' '),
indentAfter = new Array(level - 1).join(' '),
textNode;
for (var i = 0; i < node.children.length; i++) {
textNode = document.createTextNode('\n' + indentBefore);
node.insertBefore(textNode, node.children[i]);
format(node.children[i], level);
if (node.lastElementChild == node.children[i]) {
textNode = document.createTextNode('\n' + indentAfter);
node.appendChild(textNode);
}
}
return node;
}
document.querySelector('#out').innerText = process(str);
<pre id="out"></pre>
答案 1 :(得分:1)
js-beautify工具可以使用html,并且有一个api。这可能是做你想做的最简单的方法。
用节点安装后:
var beautify_html = require('js-beautify').html;
result = beautify_html(htmlstring);
要在浏览器中使用它,您需要在this directory中包含所有美化* .js脚本并使用window.html_beautify
。
<强> DEMO 强>
答案 2 :(得分:1)
由于有很多关于js-beautify的抱怨,我发布了这个替代方案:
GIT:https://github.com/maxogden/commonjs-html-prettyprinter
DEMO:http://requirebin.com/?gist=45056f6a9b306a14ea3d
CODE:
var htmlmodule = require('html');
var str = ' \n <div id="a">\n <span class="b"><span>Hello</span></span><input type="text">\n \n</div>\n ';
var pretty = htmlmodule.prettyPrint(str);
如果这不能按预期工作,我建议解析HTML字符串... 对于这项工作,你可以使用这个xmldom parseFromString ......它非常简单。