| /** |
| * 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/ |
| * |
| * MIT license: |
| * http://www.opensource.org/licenses/mit-license.php |
| * |
| * 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 = '\t'; // 4 spaces |
| this.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]; |
| } 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(/ 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]; |
| } 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, "") |
| .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(); |
| |
| })(); |
| |