-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathcss-extract-extends.js
51 lines (40 loc) · 1.29 KB
/
css-extract-extends.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
'use strict';
var makeComposition = require('./composition').makeComposition;
var regex = /\.([^\s]+)(\s+)(extends\s+)(\.[^{]+)/g;
module.exports = function extractExtends(css, hashed) {
var found, matches = [];
while (found = regex.exec(css)) {
matches.unshift(found);
}
function extractCompositions(acc, match) {
var extendee = getClassName(match[1]);
var keyword = match[3];
var extended = match[4];
// remove from output css
var index = match.index + match[1].length + match[2].length;
var len = keyword.length + extended.length;
acc.css = acc.css.slice(0, index) + " " + acc.css.slice(index + len + 1);
var extendedClasses = splitter(extended);
extendedClasses.forEach(function(className) {
if (!acc.compositions[extendee]) {
acc.compositions[extendee] = {};
}
if (!acc.compositions[className]) {
acc.compositions[className] = {};
}
acc.compositions[extendee][className] = acc.compositions[className];
});
return acc;
}
return matches.reduce(extractCompositions, {
css: css,
compositions: {}
});
};
function splitter(match) {
return match.split(',').map(getClassName);
}
function getClassName(str) {
var trimmed = str.trim();
return trimmed[0] === '.' ? trimmed.substr(1) : trimmed;
}