Blame | Last modification | View Log | RSS feed
/*** vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats.** Version - 0.99.00.beta* Copyright (c) 2012 Vadim Kiryukhin* vkiryukhin @ gmail.com* http://www.eslinstructor.net/vkbeautify/** Dual licensed under the MIT and GPL licenses:* http://www.opensource.org/licenses/mit-license.php* http://www.gnu.org/licenses/gpl.html** Pretty print** vkbeautify.xml(text [,indent_pattern]);* vkbeautify.json(text [,indent_pattern]);* vkbeautify.css(text [,indent_pattern]);* vkbeautify.sql(text [,indent_pattern]);** @text - String; text to beatufy;* @indent_pattern - Integer | String;* Integer: number of white spaces;* String: character string to visualize indentation ( can also be a set of white spaces )* Minify** vkbeautify.xmlmin(text [,preserve_comments]);* vkbeautify.jsonmin(text);* vkbeautify.cssmin(text [,preserve_comments]);* vkbeautify.sqlmin(text);** @text - String; text to minify;* @preserve_comments - Bool; [optional];* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. )** Examples:* vkbeautify.xml(text); // pretty print XML* vkbeautify.json(text, 4 ); // pretty print JSON* vkbeautify.css(text, '. . . .'); // pretty print CSS* vkbeautify.sql(text, '----'); // pretty print SQL** vkbeautify.xmlmin(text, true);// minify XML, preserve comments* vkbeautify.jsonmin(text);// minify JSON* vkbeautify.cssmin(text);// minify CSS, remove comments ( default )* vkbeautify.sqlmin(text);// minify SQL**/(function() {function createShiftArr(step) {var space = ' ';if ( isNaN(parseInt(step)) ) { // argument is stringspace = step;} else { // argument is integerswitch(step) {case 1: space = ' '; break;case 2: space = ' '; break;case 3: space = ' '; break;case 4: space = ' '; break;case 5: space = ' '; break;case 6: space = ' '; break;case 7: space = ' '; break;case 8: space = ' '; break;case 9: space = ' '; break;case 10: space = ' '; break;case 11: space = ' '; break;case 12: space = ' '; break;}}var shift = ['\n']; // array of shiftsfor(ix=0;ix<100;ix++){shift.push(shift[ix]+space);}return shift;}function vkbeautify(){this.step = ' '; // 4 spacesthis.shift = createShiftArr(this.step);};vkbeautify.prototype.xml = function(text,step) {var ar = text.replace(/>\s{0,}</g,"><").replace(/</g,"~::~<").replace(/\s*xmlns\:/g,"~::~xmlns:").replace(/\s*xmlns\=/g,"~::~xmlns=").split('~::~'),len = ar.length,inComment = false,deep = 0,str = '',ix = 0,shift = step ? createShiftArr(step) : this.shift;for(ix=0;ix<len;ix++) {// start comment or <![CDATA[...]]> or <!DOCTYPE //if(ar[ix].search(/<!/) > -1) {str += 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 += shift[deep++]+ar[ix] : str += ar[ix];} else// <elm>...</elm> //if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) {str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix];} else// </elm> //if(ar[ix].search(/<\//) > -1) {str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix];} else// <elm/> //if(ar[ix].search(/\/>/) > -1 ) {str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix];} else// <? xml ... ?> //if(ar[ix].search(/<\?/) > -1) {str += shift[deep]+ar[ix];} else// xmlns //if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) {str += shift[deep]+ar[ix];}else {str += ar[ix];}}return (str[0] == '\n') ? str.slice(1) : str;}vkbeautify.prototype.json = function(text,step) {var step = step ? step : this.step;if (typeof JSON === 'undefined' ) return text;if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step);if ( typeof text === "object" ) return JSON.stringify(text, null, step);return text; // text is not string nor object}vkbeautify.prototype.css = function(text, step) {var ar = text.replace(/\s{1,}/g,' ').replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split('~::~'),len = ar.length,deep = 0,str = '',ix = 0,shift = step ? createShiftArr(step) : this.shift;for(ix=0;ix<len;ix++) {if( /\{/.exec(ar[ix])) {str += shift[deep++]+ar[ix];} elseif( /\}/.exec(ar[ix])) {str += shift[--deep]+ar[ix];} elseif( /\*\\/.exec(ar[ix])) {str += shift[deep]+ar[ix];}else {str += shift[deep]+ar[ix];}}return str.replace(/^\n{1,}/,'');}//----------------------------------------------------------------------------function isSubquery(str, parenthesisLevel) {return parenthesisLevel - (str.replace(/\(/g,'').length - str.replace(/\)/g,'').length )}function split_sql(str, tab) {return str.replace(/\s{1,}/g," ").replace(/ AND /ig,"~::~"+tab+tab+"AND ").replace(/ BETWEEN /ig,"~::~"+tab+"BETWEEN ").replace(/ CASE /ig,"~::~"+tab+"CASE ").replace(/ ELSE /ig,"~::~"+tab+"ELSE ").replace(/ END /ig,"~::~"+tab+"END ").replace(/ FROM /ig,"~::~FROM ").replace(/ GROUP\s{1,}BY/ig,"~::~GROUP BY ").replace(/ HAVING /ig,"~::~HAVING ")//.replace(/ SET /ig," SET~::~").replace(/ IN /ig," IN ").replace(/ JOIN /ig,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /ig,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /ig,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /ig,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /ig,"~::~RIGHT JOIN ").replace(/ ON /ig,"~::~"+tab+"ON ").replace(/ OR /ig,"~::~"+tab+tab+"OR ").replace(/ ORDER\s{1,}BY/ig,"~::~ORDER BY ").replace(/ OVER /ig,"~::~"+tab+"OVER ").replace(/\(\s{0,}SELECT /ig,"~::~(SELECT ").replace(/\)\s{0,}SELECT /ig,")~::~SELECT ").replace(/ THEN /ig," THEN~::~"+tab+"").replace(/ UNION /ig,"~::~UNION~::~").replace(/ USING /ig,"~::~USING ").replace(/ WHEN /ig,"~::~"+tab+"WHEN ").replace(/ WHERE /ig,"~::~WHERE ").replace(/ WITH /ig,"~::~WITH ")//.replace(/\,\s{0,}\(/ig,",~::~( ")//.replace(/\,/ig,",~::~"+tab+tab+"").replace(/ ALL /ig," ALL ").replace(/ AS /ig," AS ").replace(/ ASC /ig," ASC ").replace(/ DESC /ig," DESC ").replace(/ DISTINCT /ig," DISTINCT ").replace(/ EXISTS /ig," EXISTS ").replace(/ NOT /ig," NOT ").replace(/ NULL /ig," NULL ").replace(/ LIKE /ig," LIKE ").replace(/\s{0,}SELECT /ig,"SELECT ").replace(/\s{0,}UPDATE /ig,"UPDATE ").replace(/ SET /ig," SET ").replace(/~::~{1,}/g,"~::~").split('~::~');}vkbeautify.prototype.sql = function(text,step) {var ar_by_quote = text.replace(/\s{1,}/g," ").replace(/\'/ig,"~::~\'").split('~::~'),len = ar_by_quote.length,ar = [],deep = 0,tab = this.step,//+this.step,inComment = true,inQuote = false,parenthesisLevel = 0,str = '',ix = 0,shift = step ? createShiftArr(step) : this.shift;;for(ix=0;ix<len;ix++) {if(ix%2) {ar = ar.concat(ar_by_quote[ix]);} else {ar = ar.concat(split_sql(ar_by_quote[ix], tab) );}}len = ar.length;for(ix=0;ix<len;ix++) {parenthesisLevel = isSubquery(ar[ix], parenthesisLevel);if( /\s{0,}\s{0,}SELECT\s{0,}/.exec(ar[ix])) {ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"")}if( /\s{0,}\s{0,}SET\s{0,}/.exec(ar[ix])) {ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"")}if( /\s{0,}\(\s{0,}SELECT\s{0,}/.exec(ar[ix])) {deep++;str += shift[deep]+ar[ix];} elseif( /\'/.exec(ar[ix]) ) {if(parenthesisLevel<1 && deep) {deep--;}str += ar[ix];}else {str += shift[deep]+ar[ix];if(parenthesisLevel<1 && deep) {deep--;}}var junk = 0;}str = str.replace(/^\n{1,}/,'').replace(/\n{1,}/g,"\n");return str;}vkbeautify.prototype.xmlmin = function(text, preserveComments) {var str = preserveComments ? text: text.replace(/\<![ \r\n\t]*(--([^\-]|[\r\n]|-[^\-])*--[ \r\n\t]*)\>/g,"").replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns');return str.replace(/>\s{0,}</g,"><");}vkbeautify.prototype.jsonmin = function(text) {if (typeof JSON === 'undefined' ) return text;return JSON.stringify(JSON.parse(text), null, 0);}vkbeautify.prototype.cssmin = function(text, preserveComments) {var str = preserveComments ? text: text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ;return str.replace(/\s{1,}/g,' ').replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/");}vkbeautify.prototype.sqlmin = function(text) {return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")");}window.vkbeautify = new vkbeautify();})();