Skip to content

Commit 9a4c83a

Browse files
committed
allow for user namespacing
The prefixer will detect if the user has already prefixed the css rule using the module name. If a proper namespacing is found, then no parent class is applied. closes #1
1 parent 97ca2a7 commit 9a4c83a

File tree

4 files changed

+81
-16
lines changed

4 files changed

+81
-16
lines changed

index.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ var path = require('path');
44

55
// vendor
66
var resolve = require('resolve');
7-
var cssprefix = require('css-prefix');
7+
8+
// local
9+
var prefix = require('./lib/prefix');
810

911
module.exports = npmcss;
1012

@@ -35,15 +37,8 @@ function npmcss(file) {
3537
}
3638
});
3739

38-
var prefix_opt = {
39-
parentClass: name,
40-
prefix: ''
41-
};
42-
43-
var cssstr = cssprefix(prefix_opt, npmcss(res));
44-
4540
// run resolution on the required css file
46-
return '*/\n' + cssstr + '\n/*';
41+
return '*/\n' + prefix(name, npmcss(res)) + '\n/*';
4742
});
4843

4944
return src;

lib/prefix.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// vendor
2+
var cssp = require('cssp');
3+
var traverse = require('traverse');
4+
5+
module.exports = function (name, src) {
6+
if (typeof opts === 'string') {
7+
opts = { prefix : opts };
8+
}
9+
10+
var tree = cssp.parse(src);
11+
12+
traverse(tree).forEach(function (node) {
13+
if (node !== 'simpleselector') {
14+
return;
15+
}
16+
17+
var nodes = this.parent.node;
18+
19+
// don't prefix if any of the following conditions are met:
20+
// .module exists as a parent then ok
21+
// .module exists in a set of classes right after an element
22+
// .module exists in the first set of classes
23+
for (var i=1 ; i<nodes.length ; ++i) {
24+
var node = nodes[i];
25+
26+
// first space exists search
27+
if (node[0] === 's') {
28+
break;
29+
}
30+
31+
if (node[0] === 'clazz' && node[1][0] === 'ident' &&
32+
node[1][1] === name) {
33+
return;
34+
}
35+
}
36+
37+
// prefix the css rule
38+
this.parent.node.splice(1, 0,
39+
[ 'clazz', [ 'ident', name ] ],
40+
[ 's', ' ' ]
41+
);
42+
});
43+
44+
return cssp.translate(tree);
45+
};
46+

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
"email": "raynos2@gmail.com"
1818
},
1919
"dependencies": {
20-
"resolve": "0.2.3"
20+
"resolve": "0.2.3",
21+
"traverse": "0.6.3",
22+
"cssp": "1.0.6"
2123
},
2224
"devDependencies": {
2325
"tap": "~0.3.1",

test/expected/input.css

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,35 @@
77
/* */
88
/* foobar stuff */
99

10-
.foobar p {
11-
color: blue;
12-
}
10+
/* .foobar */
11+
.foobar {}
1312

14-
.foobar .bar {
15-
color: white;
16-
}
13+
/* p.foobar */
14+
p.foobar {}
15+
16+
/* .foobar p .foobar */
17+
.foobar p .foobar {}
18+
19+
/* .foorbar p */
20+
.foobar p {}
21+
22+
/* .foobar p */
23+
.foobar p {}
24+
25+
/* .foobar.baz */
26+
.foobar.baz {}
27+
28+
/* .foobar .baz */
29+
.foobar .baz {}
30+
31+
/* .foobar .baz */
32+
.foobar .baz {}
33+
34+
/* .baz.foobar */
35+
.baz.foobar {}
36+
37+
/* .foobar .baz .foobar */
38+
.foobar .baz .foobar {}
1739

1840
/**/
1941

0 commit comments

Comments
 (0)