source: frontend/node_modules/postcss-js/parser.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 11 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[9af201e]1let postcss = require('postcss')
2
3let IMPORTANT = /\s*!important\s*$/i
4
5let UNITLESS = {
6 'box-flex': true,
7 'box-flex-group': true,
8 'column-count': true,
9 'flex': true,
10 'flex-grow': true,
11 'flex-positive': true,
12 'flex-shrink': true,
13 'flex-negative': true,
14 'font-weight': true,
15 'line-clamp': true,
16 'line-height': true,
17 'opacity': true,
18 'order': true,
19 'orphans': true,
20 'tab-size': true,
21 'widows': true,
22 'z-index': true,
23 'zoom': true,
24 'fill-opacity': true,
25 'stroke-dashoffset': true,
26 'stroke-opacity': true,
27 'stroke-width': true
28}
29
30function dashify(str) {
31 return str
32 .replace(/([A-Z])/g, '-$1')
33 .replace(/^ms-/, '-ms-')
34 .toLowerCase()
35}
36
37function decl(parent, name, value) {
38 if (value === false || value === null) return
39
40 if (!name.startsWith('--')) {
41 name = dashify(name)
42 }
43
44 if (typeof value === 'number') {
45 if (value === 0 || UNITLESS[name]) {
46 value = value.toString()
47 } else {
48 value += 'px'
49 }
50 }
51
52 if (name === 'css-float') name = 'float'
53
54 if (IMPORTANT.test(value)) {
55 value = value.replace(IMPORTANT, '')
56 parent.push(postcss.decl({ prop: name, value, important: true }))
57 } else {
58 parent.push(postcss.decl({ prop: name, value }))
59 }
60}
61
62function atRule(parent, parts, value) {
63 let node = postcss.atRule({ name: parts[1], params: parts[3] || '' })
64 if (typeof value === 'object') {
65 node.nodes = []
66 parse(value, node)
67 }
68 parent.push(node)
69}
70
71function parse(obj, parent) {
72 let name, node, value
73 for (name in obj) {
74 value = obj[name]
75 if (value === null || typeof value === 'undefined') {
76 continue
77 } else if (name[0] === '@') {
78 let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/)
79 if (Array.isArray(value)) {
80 for (let i of value) {
81 atRule(parent, parts, i)
82 }
83 } else {
84 atRule(parent, parts, value)
85 }
86 } else if (Array.isArray(value)) {
87 for (let i of value) {
88 decl(parent, name, i)
89 }
90 } else if (typeof value === 'object') {
91 node = postcss.rule({ selector: name })
92 parse(value, node)
93 parent.push(node)
94 } else {
95 decl(parent, name, value)
96 }
97 }
98}
99
100module.exports = function (obj) {
101 let root = postcss.root()
102 parse(obj, root)
103 return root
104}
Note: See TracBrowser for help on using the repository browser.