Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

add basic css beautifier

  • Loading branch information...
commit 5b98d75de4bafd85d60e1882cc5e7e0b5f55a5c2 1 parent 177dfa1
@nightwing authored
Showing with 207 additions and 0 deletions.
  1. +206 −0 beautify-css.js
  2. +1 −0  index.html
View
206 beautify-css.js
@@ -0,0 +1,206 @@
+/*
+
+ CSS Beautifier
+---------------
+
+ Written by Harutyun Amirjanyan, (amirjanyan@gmail.com)
+
+ Based on code initially developed by: Einar Lielmanis, <elfz@laacz.lv>
+ http://jsbeautifier.org/
+
+
+ You are free to use this in any way you want, in case you find this useful or working for you.
+
+ Usage:
+ css_beautify(source_text);
+ css_beautify(source_text, options);
+
+ The options are:
+ indent_size (default 4) — indentation size,
+ indent_char (default space) — character to indent with,
+
+ e.g
+
+ css_beautify(css_source_text, {
+ 'indent_size': 1,
+ 'indent_char': '\t'
+ });
+*/
+
+// http://www.w3.org/TR/CSS21/syndata.html#tokenization
+// http://www.w3.org/TR/css3-syntax/#SUBTOK-nl
+function css_beautify(source_text, options) {
+ options = options || {};
+ var indentSize = options.indent_size || 4;
+ var indentCharacter = options.indent_char || ' ';
+
+ // compatibility
+ if (typeof indentSize == "string")
+ indentSize = parseInt(indentSize);
+
+
+ // tokenizer
+ var spaceRe = /^[\t ]+$/;
+ var whiteRe = /^\s+$/;
+ var wordRe = /[\w$\-_]/;
+
+ var pos = -1, ch;
+ function next() {
+ return ch = source_text.charAt(++pos)
+ }
+ function peek() {
+ return source_text.charAt(pos+1)
+ }
+ function eatString(comma) {
+ var start = pos
+ while(next()){
+ if (ch=="\\"){
+ next();
+ next()
+ } else if (ch == comma) {
+ break
+ } else if (ch == "\n") {
+ break
+ }
+ }
+ return source_text.substring(start, pos + 1)
+ };
+
+ function eatWord() {
+ while(next() && rx.test(ch));
+ return ch
+ }
+ function eatSpace() {
+ while(next() == ' ');
+ return ch
+ }
+ function eatWhile(rx) {
+ while(next() && rx.test(ch));
+ return ch
+ }
+
+ function eatWhitespace() {
+ var start = pos
+ while (whiteRe.test(peek()))
+ pos++
+ return pos != start
+ }
+
+ function eatComment() {
+ var start = pos;
+ next()
+ while (next()) {
+ if (ch == "*" && peek() == "/") {
+ pos ++
+ break;
+ }
+ }
+
+ return source_text.substring(start, pos + 1)
+ }
+
+
+ function lookBack(str, index) {
+ return output.slice(-str.length + (index||0), index).join("").toLowerCase() == str
+ }
+
+ // printer
+ var indentString = source_text.match(/^[\r\n]*[\t ]*/)[0];
+ var singleIndent = Array(indentSize + 1).join(indentCharacter);
+ var indentLevel = 0;
+ function indent() {
+ indentLevel++
+ indentString += singleIndent
+ }
+ function outdent() {
+ indentLevel--
+ indentString = indentString.slice(0, -indentSize)
+ }
+
+ print = {}
+ print["{"] = function(ch) {
+ print.singleSpace()
+ output.push(ch)
+ print.newLine()
+ }
+ print["}"] = function(ch) {
+ print.newLine()
+ output.push(ch)
+ print.newLine()
+ }
+
+ print.newLine = function(keepWhitespace) {
+ if (!keepWhitespace)
+ while (whiteRe.test(output[output.length - 1]))
+ output.pop()
+
+ if (output.length)
+ output.push("\n", indentString)
+ else
+ output.push(indentString)
+ }
+ print.singleSpace = function() {
+ if (output.length && !whiteRe.test(output[output.length - 1]))
+ output.push(" ")
+ }
+ var output = [];
+ if (indentString)
+ output.push(indentString)
+ /*_____________________--------------------_____________________*/
+
+ while(true) {
+ var afterSpace = eatWhitespace()
+ next()
+
+ if (!ch)
+ break;
+
+ if (ch == '{') {
+ indent()
+ print["{"](ch)
+ } else if (ch == '}') {
+ outdent()
+ print["}"](ch)
+ } else if (ch == '"' || ch == '\'') {
+ output.push(eatString(ch))
+ } else if (ch == ';') {
+ output.push(ch, "\n", indentString)
+ } else if (ch == '/' && peek() == "*") { // comment
+ print.newLine()
+ output.push(eatComment(), "\n", indentString)
+ } else if (ch == '(') { // uri
+ output.push(ch)
+ afterSpace = eatWhitespace()
+ if (lookBack("url", -1) && next()) {
+ if (ch != ')' && ch != '"' && ch != '\'')
+ output.push(eatString(')'))
+ else
+ pos--
+ }
+ } else if (ch == ')') {
+ output.push(ch)
+ } else if (ch == ',') {
+ eatWhitespace()
+ output.push(ch)
+ print.singleSpace()
+ } else if (ch == ']') {
+ output.push(ch)
+ } else if (ch == '[') {
+ eatWhitespace()
+ output.push(ch)
+ } else {
+ if (afterSpace)
+ print.singleSpace()
+
+ output.push(ch)
+ }
+ }
+
+
+ var sweetCode = output.join('').replace(/[\n ]+$/, '');
+ return sweetCode;
+}
+
+
+if (typeof exports !== "undefined")
+ exports.css_beautify = css_beautify;
View
1  index.html
@@ -179,6 +179,7 @@
<script src="jquery/jquery.cookie.js"></script>
<script src="beautify.js"></script>
+<script src="beautify-css.js"></script>
<script src="beautify-html.js"></script>
<script src="tests/sanitytest.js"></script>
<script src="tests/beautify-tests.js"></script>
Please sign in to comment.
Something went wrong with that request. Please try again.