How to format/tidy/beautify in JavaScript
Solution 1:
I use this method to format HTML. Simple, but does the job:
function format(html) {
var tab = '\t';
var result = '';
var indent= '';
html.split(/>\s*</).forEach(function(element) {
if (element.match( /^\/\w/ )) {
indent = indent.substring(tab.length);
}
result += indent + '<' + element + '>\r\n';
if (element.match( /^<?\w[^>]*[^\/]$/ ) && !element.startsWith("input") ) {
indent += tab;
}
});
return result.substring(1, result.length-3);
}
Solution 2:
@lovasoa How to format/tidy/beautify in JavaScript is an excellent solution.
rock-solid, much better than vkBeautify or even CodeMirror (hard to use AMD) and VERY easy
<script src='http://lovasoa.github.io/tidy-html5/tidy.js'></script>
<script>
options = {
"indent":"auto",
"indent-spaces":2,
"wrap":80,
"markup":true,
"output-xml":false,
"numeric-entities":true,
"quote-marks":true,
"quote-nbsp":false,
"show-body-only":true,
"quote-ampersand":false,
"break-before-br":true,
"uppercase-tags":false,
"uppercase-attributes":false,
"drop-font-tags":true,
"tidy-mark":false
}
var html = document.querySelector("body").outerHTML;
var result = tidy_html5(html, options);
console.log(result);
</script>
Solution 3:
I needed something similar and here is my solution, inspired by method provided by michal.jakubeczy. It is slightly complicated in order to preserve formatting within <pre>
tags. Hope this will help someone.
function formatHTML(html) {
var indent = '\n';
var tab = '\t';
var i = 0;
var pre = [];
html = html
.replace(new RegExp('<pre>((.|\\t|\\n|\\r)+)?</pre>'), function (x) {
pre.push({ indent: '', tag: x });
return '<--TEMPPRE' + i++ + '/-->'
})
.replace(new RegExp('<[^<>]+>[^<]?', 'g'), function (x) {
var ret;
var tag = /<\/?([^\s/>]+)/.exec(x)[1];
var p = new RegExp('<--TEMPPRE(\\d+)/-->').exec(x);
if (p)
pre[p[1]].indent = indent;
if (['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr'].indexOf(tag) >= 0) // self closing tag
ret = indent + x;
else {
if (x.indexOf('</') < 0) { //open tag
if (x.charAt(x.length - 1) !== '>')
ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
else
ret = indent + x;
!p && (indent += tab);
}
else {//close tag
indent = indent.substr(0, indent.length - 1);
if (x.charAt(x.length - 1) !== '>')
ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
else
ret = indent + x;
}
}
return ret;
});
for (i = pre.length; i--;) {
html = html.replace('<--TEMPPRE' + i + '/-->', pre[i].tag.replace('<pre>', '<pre>\n').replace('</pre>', pre[i].indent + '</pre>'));
}
return html.charAt(0) === '\n' ? html.substr(1, html.length - 1) : html;
}
function unformatHTML(html) {
var i = 0;
var pre = [];
html = html.replace(new RegExp('<pre>((.|\\t|\\n|\\r)+)?</pre>'), function (x) {
pre.push(x);
return '<--TEMPPRE' + i++ + '/-->'
}).replace(/\n/g, '').replace(/\t/g, '');
for (i = pre.length; i--;) {
html = html.replace('<--TEMPPRE' + i + '/-->', pre[i]);
}
html = html.replace(new RegExp('<pre>\\n'), '<pre>').replace(new RegExp('\\n\\t*</pre>'), '</pre>');
return html;
}
Solution 4:
I find js-beautify far superior to any solution posted so far.
Add the script to your lib folder:
Bring inside header as usual:
<script src="libs/beautify.js"></script>
Target code wherever it is on your page (e.g. pre
or code
tag) and use the js_beautify
function to format as needed:
$(".my_class").text(js_beautify($(".my_class").text()))
This will format as needed. All kinds of config options available on the repo.