-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththemeReader.js
72 lines (62 loc) · 1.91 KB
/
themeReader.js
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const fs = require('fs');
const csstree = require('css-tree');
const declarationsWeCareAbout = ['font-weight', 'font-style', 'color'];
class ThemeReader {
constructor(themeFileName) {
let file = fs.readFileSync(themeFileName, 'utf8');
this.ast = csstree.parse(file);
this.classToStylesMap = Object.create(null);
let curClasses = [],
curDeclaration = null,
isValue = false;
csstree.walk(this.ast, (node) => {
if (isValue) {
let value;
if (node.type === 'Identifier') {
value = node.name;
}
else if (node.type === 'HexColor') {
value = '#' + node.value;
}
if (value && curClasses.length && curDeclaration) {
curClasses.forEach((className) => {
this.classToStylesMap[className] = this.classToStylesMap[className] || {};
this.classToStylesMap[className][curDeclaration.property] = value;
});
}
isValue = false;
}
if (node.type === 'ClassSelector') {
curClasses.push(node.name);
}
else if (node.type === 'SelectorList') {
curClasses = [];
}
else if (node.type === 'Declaration') {
if (declarationsWeCareAbout.indexOf(node.property) !== -1) {
curDeclaration = node;
}
else {
curDeclaration = null;
}
}
else if (node.type === 'Value' &&
curDeclaration && curDeclaration.value.type === 'Value') {
isValue = true;
}
});
console.log(this.classToStylesMap);
}
match(classNames, defaultClass) {
var value = {};
if (Array.isArray(classNames)) {
classNames.forEach((className) => {
Object.assign(value, this.classToStylesMap[className] || {});
})
return value;
}
return this.classToStylesMap[classNames] ||
this.classToStylesMap[defaultClass];
}
}
module.exports = ThemeReader