Skip to content

Instantly share code, notes, and snippets.

@schell
Created March 24, 2010 17:31
Show Gist options
  • Save schell/342523 to your computer and use it in GitHub Desktop.
Save schell/342523 to your computer and use it in GitHub Desktop.
Pretty prints xml
/**
* Pretty prints xml
*
* @param String ugly xml
* @return String prettier xml
* @author Schell Scivally
* @since Sun Mar 14 16:16:50 PDT 2010
*/
var formatXml = this.formatXml = function (xml) {
var reg = /(>)(<)(\/*)/g;
var wsexp = / *(.*) +\n/g;
var contexp = /(<.+>)(.+\n)/g;
xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
var pad = 0;
var formatted = '';
var lines = xml.split('\n');
var indent = 0;
var lastType = 'other';
// 4 types of tags - single, closing, opening, other (text, doctype, comment) - 4*4 = 16 transitions
var transitions = {
'single->single' : 0,
'single->closing' : -1,
'single->opening' : 0,
'single->other' : 0,
'closing->single' : 0,
'closing->closing' : -1,
'closing->opening' : 0,
'closing->other' : 0,
'opening->single' : 1,
'opening->closing' : 0, // if there's an open to a close, they probably should have used a single, oh well
'opening->opening' : 1,
'opening->other' : 1,
'other->single' : 0,
'other->closing' : -1,
'other->opening' : 0,
'other->other' : 0
};
for (var i=0; i < lines.length; i++) {
var ln = lines[i];
var single = /<.+\/>/.test(ln); // is this line a single tag? ex. <br />
var closing = /<\/.+>/.test(ln); // is this a closing tag? ex. </a>
var opening = /<[^!].*>/.test(ln); // is this even a tag (that's not <!something>)
var type = single ? 'single' : closing ? 'closing' : opening ? 'opening' : 'other';
var fromTo = lastType + '->' + type;
lastType = type;
var padding = '';
indent += transitions[fromTo];
for (var j = 0; j < indent; j++) {
padding += ' ';
}
formatted += padding + ln + '\n';
}
return formatted;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment