Skip to content

Instantly share code, notes, and snippets.

@dallonf
Created August 4, 2015 16:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dallonf/4ce15948fea763e6d754 to your computer and use it in GitHub Desktop.
Save dallonf/4ce15948fea763e6d754 to your computer and use it in GitHub Desktop.
Experiment: render Bootstrap variables to JSON file
let fs = require('fs');
let path = require('path');
let less = require('less');
let bluebird = require('bluebird');
let css = require('css');
async function execute() {
let variablesLess = await bluebird.fromNode(cb => fs.readFile(path.join(__dirname, 'less/variables.less'), 'utf-8', cb));
let [parseResult] = await bluebird.fromNode(cb => less.parse(variablesLess, cb));
let varNames = parseResult.rules
.map(r => r.name)
.filter(r => r);
let hackLess = varNames
.map(n => `.${n.slice(1)} { background-color: ${n}; }`)
.join('\n');
hackLess = '@import "less/variables";\n' + hackLess;
let hackCss = (await less.render(hackLess)).css;
await bluebird.fromNode(cb => fs.writeFile('testoutput.css', hackCss, cb));
let cssAst = css.parse(hackCss);
let jsVars = cssAst.stylesheet.rules.map(rule => {
let varName = rule.selectors[0].slice(1);
let jsName = [...varName].reduce((obj, nextChar) => {
if (nextChar === '-') {
obj.nextIsCap = true;
return obj;
}
if (obj.nextIsCap) {
obj.nextIsCap = false;
nextChar = nextChar.toUpperCase();
}
obj.name += nextChar;
return obj;
}, {
nextIsCap: false,
name: ''
}).name;
let value = rule.declarations[0].value;
return {key: jsName, value};
});
let jsonVars = jsVars.reduce((obj, next) => {
obj[next.key] = next.value;
return obj;
}, {});
await bluebird.fromNode(cb => fs.writeFile('variables.json', JSON.stringify(jsonVars, null, 2), cb));
}
execute()
.catch(err => {
console.error(err);
process.exit(1);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment