Spaces:
Running
Running
let camelcase = require('camelcase-css') | |
let UNITLESS = { | |
boxFlex: true, | |
boxFlexGroup: true, | |
columnCount: true, | |
flex: true, | |
flexGrow: true, | |
flexPositive: true, | |
flexShrink: true, | |
flexNegative: true, | |
fontWeight: true, | |
lineClamp: true, | |
lineHeight: true, | |
opacity: true, | |
order: true, | |
orphans: true, | |
tabSize: true, | |
widows: true, | |
zIndex: true, | |
zoom: true, | |
fillOpacity: true, | |
strokeDashoffset: true, | |
strokeOpacity: true, | |
strokeWidth: true | |
} | |
function atRule(node) { | |
if (typeof node.nodes === 'undefined') { | |
return true | |
} else { | |
return process(node) | |
} | |
} | |
function process(node) { | |
let name | |
let result = {} | |
node.each(child => { | |
if (child.type === 'atrule') { | |
name = '@' + child.name | |
if (child.params) name += ' ' + child.params | |
if (typeof result[name] === 'undefined') { | |
result[name] = atRule(child) | |
} else if (Array.isArray(result[name])) { | |
result[name].push(atRule(child)) | |
} else { | |
result[name] = [result[name], atRule(child)] | |
} | |
} else if (child.type === 'rule') { | |
let body = process(child) | |
if (result[child.selector]) { | |
for (let i in body) { | |
result[child.selector][i] = body[i] | |
} | |
} else { | |
result[child.selector] = body | |
} | |
} else if (child.type === 'decl') { | |
if (child.prop[0] === '-' && child.prop[1] === '-') { | |
name = child.prop | |
} else { | |
name = camelcase(child.prop) | |
} | |
let value = child.value | |
if (!isNaN(child.value) && UNITLESS[name]) { | |
value = parseFloat(child.value) | |
} | |
if (child.important) value += ' !important' | |
if (typeof result[name] === 'undefined') { | |
result[name] = value | |
} else if (Array.isArray(result[name])) { | |
result[name].push(value) | |
} else { | |
result[name] = [result[name], value] | |
} | |
} | |
}) | |
return result | |
} | |
module.exports = process | |