Skip to content

Commit 775dd45

Browse files
committed
support a transform callback for complex prefixing
1 parent 81aab02 commit 775dd45

File tree

5 files changed

+92
-5
lines changed

5 files changed

+92
-5
lines changed

README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,26 @@ var css = fs.readFileSync("input.css", "utf8")
2727

2828
var out = postcss().use(prefix({
2929
prefix: '.some-selector ', // <--- notice the traililng space!
30-
exclude: ['.c']
30+
exclude: ['.c'],
31+
32+
// Optional transform callback for case-by-case overrides
33+
transform: function (prefix, selector, prefixAndSelector) {
34+
if (selector === 'body') {
35+
return 'body.' + prefix;
36+
} else {
37+
return prefixAndSelector
38+
}
39+
}
3140
})).process(css).css
3241
```
3342

3443
Using this `input.css`:
3544

3645
```css
46+
body {
47+
background: red;
48+
}
49+
3750
.a, .b {
3851
color: aqua;
3952
}
@@ -46,6 +59,10 @@ Using this `input.css`:
4659
you will get:
4760

4861
```css
62+
body.some-selector {
63+
background: red;
64+
}
65+
4966
.some-selector .a, .some-selector .b {
5067
color: aqua;
5168
}

index.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ var assert = require('assert')
33

44
module.exports = function (options) {
55
assert(options)
6-
var prefix = options.prefix
6+
var prefix = options.prefix
77
assert(prefix)
8-
if (!/\s+$/.test(prefix)) prefix += ' '
8+
9+
var prefixWithSpace = /\s+$/.test(prefix) ? prefix : prefix + ' '
10+
var transform = options.transform || function(prefix, selector, both) {
11+
return both
12+
}
13+
914
return function (root) {
1015
root.walkRules(function (rule) {
1116
if (rule.parent && rule.parent.name == 'keyframes') {
@@ -16,7 +21,7 @@ module.exports = function (options) {
1621
if (options.exclude && excludeSelector(selector, options.exclude)) {
1722
return selector
1823
}
19-
return prefix + selector
24+
return transform(prefix, selector, prefixWithSpace + selector)
2025
})
2126
})
2227
}
@@ -29,5 +34,5 @@ function excludeSelector(selector, excludeArr) {
2934
} else {
3035
return selector === excludeRule
3136
}
32-
});
37+
})
3338
}

test/fixtures/transform.css

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
body {
2+
margin: 0;
3+
padding: 0;
4+
}
5+
6+
.a, .b {
7+
color: red;
8+
}
9+
10+
.a *:not(.b) {
11+
text-transform: uppercase;
12+
}
13+
14+
.c {
15+
font-size: 10px;
16+
}
17+
18+
.class-a {
19+
color: coral;
20+
}
21+
22+
.class-b {
23+
color: deepskyblue;
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
body.body-picker {
2+
margin: 0;
3+
padding: 0;
4+
}
5+
6+
.hello .a, .hello .b {
7+
color: red;
8+
}
9+
10+
.hello .a *:not(.b) {
11+
text-transform: uppercase;
12+
}
13+
14+
.hello .c {
15+
font-size: 10px;
16+
}
17+
18+
.hello .class-a {
19+
color: coral;
20+
}
21+
22+
.hello .class-b {
23+
color: deepskyblue;
24+
}

test/test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,23 @@ it('should skip @keyframes selectors', function () {
4646
assert.equal(out, expected)
4747
})
4848

49+
it('should support an additional callback for prefix transformation', function () {
50+
var out = postcss().use(prefix({
51+
prefix: '.hello',
52+
transform: function (prefix, selector, prefixAndSelector) {
53+
if (selector === 'body') {
54+
return 'body.body-picker'
55+
} else {
56+
return prefixAndSelector
57+
}
58+
}
59+
})).process(getFixtureContents('transform.css')).css
60+
61+
var expected = getFixtureContents('transform.expected.css')
62+
63+
assert.equal(out, expected)
64+
})
65+
4966
function getFixtureContents(name) {
5067
return fs.readFileSync('test/fixtures/' + name, 'utf8').trim()
5168
}

0 commit comments

Comments
 (0)