UNPKG

sweet-data

Version:

plugin to pretty-print or minify XML, JSON, CSS and SQL files

95 lines (85 loc) 2.87 kB
var Promise = require('promise-polyfill'); var setAsap = require('setasap'); Promise._immediateFn = setAsap; function xml(text) { var that = this; return new Promise(function(resolve, reject) { try { var ar = text.replace(/>\s{0,}</g,"><") .replace(/</g,"~::~<") .replace(/xmlns\:/g,"~::~xmlns:") .replace(/xmlns\=/g,"~::~xmlns=") .split('~::~'), len = ar.length, inComment = false, deep = 0, str = '', ix = 0; for(ix=0;ix<len;ix++) { // start comment or <![CDATA[...]]> or <!DOCTYPE // if(ar[ix].search(/<!/) > -1) { str += that.shift[deep]+ar[ix]; inComment = true; // end comment or <![CDATA[...]]> // if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { inComment = false; } } else // end comment or <![CDATA[...]]> // if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { str += ar[ix]; inComment = false; } else // <elm></elm> // if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { str += ar[ix]; if(!inComment) deep--; } else // <elm> // if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { str = !inComment ? str += that.shift[deep++]+ar[ix] : str += ar[ix]; } else // <elm>...</elm> // if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { str = !inComment ? str += that.shift[deep]+ar[ix] : str += ar[ix]; } else // </elm> // if(ar[ix].search(/<\//) > -1) { str = !inComment ? str += that.shift[--deep]+ar[ix] : str += ar[ix]; } else // <elm/> // if(ar[ix].search(/\/>/) > -1 ) { str = !inComment ? str += that.shift[deep]+ar[ix] : str += ar[ix]; } else // <? xml ... ?> // if(ar[ix].search(/<\?/) > -1) { str += that.shift[deep]+ar[ix]; } else // xmlns // if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { str += that.shift[deep]+ar[ix]; } else { str += ar[ix]; } } resolve((str[0] == '\n') ? str.slice(1) : str); } catch (e) { reject(e); } }); } function xmlmin(text, preserveComments) { return new Promise(function(resolve, reject) { try { var str = preserveComments ? text : text.replace(/\<![ \r\n\t]*(--([^\-]|[\r\n]|-[^\-])*--[ \r\n\t]*)\>/g,""); resolve(str.replace(/>\s{0,}</g,"><")); } catch (e) { reject(e); } }); } exports.xml = xml; exports.xmlmin = xmlmin;