-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.js
98 lines (81 loc) · 2.96 KB
/
parser.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
var fs = require('fs');
var _ = require('lodash');
var minimist = require('minimist');
var argv = minimist(process.argv);
if (!argv.f || !argv.n || !argv.c) {
console.log('Usage: node parser.js -f <fileName.css> -n <newFileName.css> -c <colors> (colors in hex format and comma separated)');
console.log('Example: node parser.js -f theme.css -n colors.css -c #FFFFFF,#F2F2F2,#000000');
process.exit()
}
var cssFile = argv.f;
var newCssFile = argv.n;
var cssFileContent = '';
let colors = _.split(argv.c, ',');
const regexMedia = /(@[^{]+{)([\s\S]+?})\s*}/gi;
const regexSelectors = '((.|,\n)*\{)([^\}|\{]*)\}';
const regexColors = '(^([^\\n]*)(' + _.join(colors, '|') + ')([^\\n]*)$)';
fs.readFile(cssFile, 'utf8', function (err, content) {
// get media queryies and other modifiers
var medias = content.match(regexMedia);
content = content.replace(regexMedia, '');
cssFileContent += processSelectors(content);
cssFileContent += processMedias(medias);
fs.writeFile(newCssFile, cssFileContent, function (err) {
if (err) console.error(err);
console.log('=========== DONE =========== ');
});
});
var processSelectors = function (content) {
var selectorsContent = '';
const matches = content.match(new RegExp(regexSelectors, 'gim'));
_.each(matches, function (match) {
var regexSelector = new RegExp(regexSelectors, 'gim');
var match = (regexSelector).exec(match);
if (match) {
var toWrite = writeable({selector: match[1], content: match[3]});
if (toWrite !== false) selectorsContent += toWrite;
}
});
return (selectorsContent !== '') ? selectorsContent : false;
};
var processMedias = function (medias) {
var mediaContent = '';
_.each(medias, function (media) {
var media = (regexMedia).exec(media);
var mediaWrite = '';
if (media) {
var selectorsWrite = processSelectors(media[0]);
if (selectorsWrite && media[1]) {
mediaWrite += media[1] + '\n';
mediaWrite += selectorsWrite;
mediaWrite += '\n}\n';
}
}
if (mediaWrite !== '') mediaContent += mediaWrite;
});
return mediaContent;
};
var writeable = function (selector) {
var content = '';
if (selector.selector) {
var toWrite = filterColors(selector.content);
if (toWrite !== false) {
content = selector.selector + '\n';
content += toWrite;
content += '\n}\n';
}
}
return (content !== '') ? content : false;
};
var filterColors = function (content) {
var colorsContent = '';
const matches = content.match(RegExp(regexColors, 'gmi'));
_.each(matches, function (match) {
var regexColor = new RegExp(regexColors, 'gmi');
var match = (regexColor).exec(match);
if (match) {
colorsContent += match[0];
}
});
return (colorsContent !== '') ? colorsContent : false;
};