123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- let postcss = require('postcss')
- let IMPORTANT = /\s*!important\s*$/i
- let UNITLESS = {
- 'box-flex': true,
- 'box-flex-group': true,
- 'column-count': true,
- 'flex': true,
- 'flex-grow': true,
- 'flex-positive': true,
- 'flex-shrink': true,
- 'flex-negative': true,
- 'font-weight': true,
- 'line-clamp': true,
- 'line-height': true,
- 'opacity': true,
- 'order': true,
- 'orphans': true,
- 'tab-size': true,
- 'widows': true,
- 'z-index': true,
- 'zoom': true,
- 'fill-opacity': true,
- 'stroke-dashoffset': true,
- 'stroke-opacity': true,
- 'stroke-width': true
- }
- function dashify(str) {
- return str
- .replace(/([A-Z])/g, '-$1')
- .replace(/^ms-/, '-ms-')
- .toLowerCase()
- }
- function decl(parent, name, value) {
- if (value === false || value === null) return
- if (!name.startsWith('--')) {
- name = dashify(name)
- }
- if (typeof value === 'number') {
- if (value === 0 || UNITLESS[name]) {
- value = value.toString()
- } else {
- value += 'px'
- }
- }
- if (name === 'css-float') name = 'float'
- if (IMPORTANT.test(value)) {
- value = value.replace(IMPORTANT, '')
- parent.push(postcss.decl({ prop: name, value, important: true }))
- } else {
- parent.push(postcss.decl({ prop: name, value }))
- }
- }
- function atRule(parent, parts, value) {
- let node = postcss.atRule({ name: parts[1], params: parts[3] || '' })
- if (typeof value === 'object') {
- node.nodes = []
- parse(value, node)
- }
- parent.push(node)
- }
- function parse(obj, parent) {
- let name, value, node
- for (name in obj) {
- value = obj[name]
- if (value === null || typeof value === 'undefined') {
- continue
- } else if (name[0] === '@') {
- let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/)
- if (Array.isArray(value)) {
- for (let i of value) {
- atRule(parent, parts, i)
- }
- } else {
- atRule(parent, parts, value)
- }
- } else if (Array.isArray(value)) {
- for (let i of value) {
- decl(parent, name, i)
- }
- } else if (typeof value === 'object') {
- node = postcss.rule({ selector: name })
- parse(value, node)
- parent.push(node)
- } else {
- decl(parent, name, value)
- }
- }
- }
- module.exports = function (obj) {
- let root = postcss.root()
- parse(obj, root)
- return root
- }
|