You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.9 KiB
83 lines
1.9 KiB
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
|
|
|