-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
parsers.js
123 lines (117 loc) · 3.42 KB
/
parsers.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* Results on node 7.10.0, Fedora 25, Intel Core i7-6500U, 8 GB RAM and SSD:
CSSTree: 6 ms (4.9 times faster)
PostCSS: 29 ms
CSSOM: 29 ms (1.0 times slower)
Mensch: 31 ms (1.1 times slower)
Rework: 49 ms (1.7 times slower)
PostCSS Full: 75 ms (2.6 times slower)
Gonzales: 116 ms (4.0 times slower)
Stylecow: 140 ms (4.8 times slower)
Gonzales PE: 150 ms (5.1 times slower)
ParserLib: 316 ms (10.8 times slower)
*/
var path = require('path');
var fs = require('fs');
var example = path.join(__dirname, 'cache', 'bootstrap.css');
var css = fs.readFileSync(example).toString();
var CSSOM = require('cssom');
var rework = require('rework');
var mensch = require('mensch');
var postcss = require('postcss');
var postcssSP = require('postcss-selector-parser')();
var postcssVP = require('postcss-value-parser');
var stylecow = require('stylecow-core');
var gonzales = require('gonzales');
var parserlib = require('parserlib');
var gonzalesPe = require('gonzales-pe');
var csstree = require('css-tree');
module.exports = {
name: 'Bootstrap',
maxTime: 15,
tests: [
{
name: 'Rework',
fn: function () {
rework(css).toString();
}
},
{
name: 'PostCSS',
defer: true,
fn: function (done) {
postcss.parse(css, { from: example }).toResult();
done.resolve();
}
},
{
name: 'PostCSS Full',
defer: true,
fn: function (done) {
let root = postcss.parse(css, { from: example });
root.walk(node => {
if ( node.type === 'rule' ) {
node.selector = postcssSP.process(node.selector);
} else if ( node.type === 'decl' ) {
node.value = postcssVP(node.value);
}
});
root.toResult();
done.resolve();
}
},
{
name: 'CSSOM',
fn: function () {
CSSOM.parse(css).toString();
}
},
{
name: 'Mensch',
fn: function () {
mensch.stringify( mensch.parse(css) );
}
},
{
name: 'Gonzales',
fn: function () {
gonzales.csspToSrc( gonzales.srcToCSSP(css) );
}
},
{
name: 'Gonzales PE',
fn: function () {
gonzalesPe.parse(css).toString();
}
},
{
name: 'CSSTree',
fn: function () {
csstree.translate(csstree.parse(css));
}
},
{
name: 'ParserLib',
fn: function () {
(new parserlib.css.Parser()).parse(css);
}
},
{
name: 'Stylecow',
fn: function () {
stylecow.parse(css).toString();
}
}
]
};
var devPath = path.join(__dirname, '../postcss/build/lib/postcss.js');
if ( fs.existsSync(devPath) ) {
var devPostcss = require(devPath);
module.exports.tests.splice(1, 0, {
name: 'PostCSS dev',
defer: true,
fn: function (done) {
devPostcss.parse(css, { from: example }).toResult();
done.resolve();
}
});
}