Why isn't CSS nested?
I guess it's not supposed to be used as a nested style system really, otherwise it would already be like that... Wouldn't it?, but I like the idea of it being nested, so now it can be!
This script parses JSON of nested CSS and returns or applies CSS to the page.
For example:
JSS({ '.underline': { 'text-decoration': 'underline' }, '.bold': { 'font-weight': 'bold' }, 'html': { 'body': { 'include': '.underline, .bold', 'background': '#fff', 'h1': { 'background': '#fcf', 'include': '.non-existant' }, 'div#footer': { 'include': '.underline', 'height': '40px', 'span#copyright': { 'color': '#0f0', 'background': '#f00' }, 'span#testing': { 'include': '.bold', 'color': 'black', 'background': '#eeccff' } } }, 'width': '800px' } })
would become:
or by passing an option of minify: false
, this:
When 'minify
' is set to true
, the script replaces 6 digit hex codes with 3 digit codes where applicable and strips out any excess whitespace and semicolons. This could be useful for preparing stylesheets using server-side javascript for smaller downloads by users. Minify is true
by default.
To use, first add jss-0.2.js (or jss-0.2-min.js) to your document, preferably in the <head/>
and then add another <script/>
tag linking to a .js file that contains your JSS data for example:
JSS({ 'html': { 'body': { 'font-family': 'sans-serif', 'color': '#000', 'h1:hover': { 'color': '#f00' } } } });
I thought it might be a bit more useful if there was a widely used server-side conversion tool for JSS, so I've converted the Javascript to a PHP5 class which currently either accepts a PHP associative array or (with a JSON decoder) a JSON string:
<?php require('jss-0.2.php'); print new JSS(array( 'html' => array( 'body' => array( 'font-family' => 'sans-serif', 'color' => '#000000', 'h1:hover' => array( 'color' => '#f00' ) ) ) ));
or
<?php require('jss-0.2.php'); require('JSON.php'); print new JSS('{ "html": { "body": { "font-family": "sans-serif", "color": "#000", "h1:hover": { "color": "#f00" } } } }', array( // a static class method 'jsonDecoder' => array('JSON', 'decode') // or a standard function // 'jsonDecoder' => 'json_decode' ));
I might work on other server-side language parsers too...