1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | function parseCss() {
|
35 | var cssText = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : '';
|
36 | var cleaned = cleanCss(cssText);
|
37 | return parseLexed(lex(cleaned), cleaned);
|
38 | }
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | var ruleTypes = {
|
45 | style: 1,
|
46 | keyframes: 7,
|
47 | media: 4
|
48 | };
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | function cleanCss() {
|
57 | var text = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : '';
|
58 |
|
59 | return text.replace(/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, '').replace(/@import[^;]*;/gim, '');
|
60 | }
|
61 |
|
62 | function lex(text) {
|
63 | var rootNode = {
|
64 | start: 0,
|
65 | end: text.length
|
66 | };
|
67 | var node = rootNode;
|
68 | var chars = text.split('');
|
69 | chars.forEach(function (char, i) {
|
70 | switch (char) {
|
71 | case '{':
|
72 | {
|
73 | if (!node.rules) {
|
74 | node.rules = [];
|
75 | }
|
76 |
|
77 | var parent = node;
|
78 | var previous = parent.rules[parent.rules.length - 1];
|
79 | node = {
|
80 | start: i + 1,
|
81 | parent: parent,
|
82 | previous: previous
|
83 | };
|
84 | parent.rules.push(node);
|
85 | break;
|
86 | }
|
87 |
|
88 | case '}':
|
89 | {
|
90 | node.end = i + 1;
|
91 | node = node.parent || rootNode;
|
92 | break;
|
93 | }
|
94 |
|
95 | default:
|
96 | {
|
97 | break;
|
98 | }
|
99 | }
|
100 | });
|
101 | return rootNode;
|
102 | }
|
103 |
|
104 | function parseSelector(node, text) {
|
105 | var start = node.previous ? node.previous.end : node.parent.start;
|
106 | var end = node.start - 1;
|
107 | var selector = text.substring(start, end);
|
108 | selector = selector.replace(/\s+/g, ' ');
|
109 | selector = selector.substring(selector.lastIndexOf(';') + 1);
|
110 | return selector.trim();
|
111 | }
|
112 |
|
113 | function parseRuleType(selector) {
|
114 | if (selector.indexOf('@') === 0) {
|
115 | if (selector.indexOf('@media') === 0) {
|
116 | return ruleTypes.media;
|
117 | } else if (selector.match(/^@[^\s]*keyframes/)) {
|
118 | return ruleTypes.keyframes;
|
119 | }
|
120 | } else {
|
121 | return ruleTypes.style;
|
122 | }
|
123 | }
|
124 |
|
125 | function parseLexed(node) {
|
126 | var text = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : '';
|
127 |
|
128 |
|
129 | if (node.parent) {
|
130 | node.selector = parseSelector(node, text);
|
131 | node.type = parseRuleType(node.selector);
|
132 | }
|
133 |
|
134 | node.cssText = text.substring(node.start, node.end - 1).trim();
|
135 |
|
136 | if (node.rules && node.rules.length > 0) {
|
137 | node.rules = node.rules.map(function (rule) {
|
138 | return parseLexed(rule, text);
|
139 | });
|
140 | }
|
141 |
|
142 |
|
143 |
|
144 | return node;
|
145 | }
|
146 |
|
147 | export default parseCss;
|
148 | export { parseCss, cleanCss, ruleTypes }; |
\ | No newline at end of file |