Mercurial > eldonilo > lightstring
diff lib/vkbeautify.0.97.00.beta.js @ 106:c06ec02217ee
many changes
author | Sonny Piers <sonny@fastmail.net> |
---|---|
date | Tue, 26 Jun 2012 12:02:14 +0200 |
parents | |
children |
line wrap: on
line diff
new file mode 100755 --- /dev/null +++ b/lib/vkbeautify.0.97.00.beta.js @@ -0,0 +1,376 @@ +/** +* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON and CSS formats. +* +* Version - 0.97.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 string + space = step; + } else { // argument is integer + switch(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 shifts + for(ix=0;ix<100;ix++){ + shift.push(shift[ix]+space); + } + return shift; +} + +function vkbeautify(){ + this.step = ' '; // 4 spaces + this.shift = createShiftArr(this.step); +}; + +vkbeautify.prototype.xml = function(text,step) { + + var ar = text.replace(/>\s{0,}</g,"><").replace(/</g,"~::~<").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 { + str += ar[ix]; + } + } + + return (str[0] == '\n') ? str.slice(1) : str; +} + +vkbeautify.prototype.json = function(text,step) { + + var ar = this.jsonmin(text).replace(/\{/g,"~::~{~::~") + .replace(/\[/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]; + } else + if( /\[/.exec(ar[ix])) { + str += shift[deep++]+ar[ix]; + } else + if( /\]/.exec(ar[ix])) { + str += shift[--deep]+ar[ix]; + } else + if( /\}/.exec(ar[ix])) { + str += shift[--deep]+ar[ix]; + } else { + str += shift[deep]+ar[ix]; + } + } + return str.replace(/^\n{1,}/,''); +} + +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]; + } else + if( /\}/.exec(ar[ix])) { + str += shift[--deep]+ar[ix]; + } else + if( /\*\\/.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(/ IN /ig,"~::~"+tab+"IN ") + .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(/~::~{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,}SELECT\s{0,}/.exec(ar[ix])) { + deep++; + str += shift[deep]+ar[ix]; + } else + if( /\'/.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,""); + return str.replace(/>\s{0,}</g,"><"); +} + +vkbeautify.prototype.jsonmin = function(text) { + + return text.replace(/\s{0,}\{\s{0,}/g,"{") + .replace(/\s{0,}\[$/g,"[") + .replace(/\[\s{0,}/g,"[") + .replace(/:\s{0,}\[/g,':[') + .replace(/\s{0,}\}\s{0,}/g,"}") + .replace(/\s{0,}\]\s{0,}/g,"]") + .replace(/\"\s{0,}\,/g,'",') + .replace(/\,\s{0,}\"/g,',"') + .replace(/\"\s{0,}:/g,'":') + .replace(/:\s{0,}\"/g,':"') + .replace(/:\s{0,}\[/g,':[') + .replace(/\,\s{0,}\[/g,',[') + .replace(/\,\s{2,}/g,', ') + .replace(/\]\s{0,},\s{0,}\[/g,'],['); +} + +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(); + +})(); +