Javascript:如何更正HTML字符串中的缩进?

时间:2014-10-14 12:04:55

标签: javascript html

给出这样的字符串:

' \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>'

实现这一目标的最优雅方式是什么?是否有任何已知的库可以做到这一点?

注意:

  • 我不是在寻找HTML语法高亮,只是缩进修正
  • 我不打算支持整个HTML规范,如上例所示更正基本HTML就足够了

3 个答案:

答案 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>

演示:http://jsfiddle.net/1gf07wap/

答案 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 ......它非常简单。