Created
August 4, 2015 16:01
-
-
Save dallonf/4ce15948fea763e6d754 to your computer and use it in GitHub Desktop.
Experiment: render Bootstrap variables to JSON file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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