Skip to content

Commit a4ed727

Browse files
committed
allow strings or regex in selectorBlackList
1 parent 1a93ca1 commit a4ed727

File tree

4 files changed

+92
-50
lines changed

4 files changed

+92
-50
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ Default:
7272
- Set this to an empty array to disable the white list and enable all properties.
7373
- Values need to be exact matches.
7474
- `selectorBlackList` (Array) The selectors to ignore and leave as px.
75+
- If value is string, it checks to see if selector contains the string.
76+
- `['body']` will match `.body-class`
77+
- If value is regexp, it checks to see if the selector matches the regexp.
78+
- `[/^body$/]` will match `body` but not `.body`
7579
- `replace` (Boolean) replaces rules containing rems instead of adding fallbacks.
7680
- `mediaQuery` (Boolean) Allow px to be converted in media queries.
7781
- `minPixelValue` (Number) Set the minimum pixel value to replace.

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ function declarationExists(decls, prop, value) {
9595
function blacklistedSelector(blacklist, selector) {
9696
if (typeof selector !== 'string') return;
9797
return blacklist.some(function (regex) {
98+
if (typeof regex === 'string') return selector.indexOf(regex) !== -1;
9899
return selector.match(regex);
99100
});
100101
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "postcss-pxtorem",
33
"description": "A CSS post-processor that converts px to rem.",
4-
"version": "3.2.0",
4+
"version": "3.3.0",
55
"author": "cuth",
66
"license": "MIT",
77
"repository": {

spec/pxtorem-spec.js

Lines changed: 86 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
// 1. `npm install -g jasmine-node`
44
// 2. `jasmine-node spec`
55

6-
/*global describe, it, expect */
6+
/* global describe, it, expect */
77

88
'use strict';
99
var postcss = require('postcss');
1010
var pxtorem = require('..');
1111
var basicCSS = '.rule { font-size: 15px }';
1212

1313
describe('pxtorem', function () {
14-
1514
it('should work on the readme example', function () {
1615
var input = 'h1 { margin: 0 0 20px; font-size: 32px; line-height: 1.2; letter-spacing: 1px; }';
1716
var output = 'h1 { margin: 0 0 20px; font-size: 2rem; line-height: 1.2; letter-spacing: 0.0625rem; }';
@@ -27,6 +26,57 @@ describe('pxtorem', function () {
2726
expect(processed).toBe(expected);
2827
});
2928

29+
it('should ignore non px properties', function () {
30+
var expected = '.rule { font-size: 2em }';
31+
var processed = postcss(pxtorem()).process(expected).css;
32+
33+
expect(processed).toBe(expected);
34+
});
35+
36+
it('should handle < 1 values and values without a leading 0', function () {
37+
var rules = '.rule { margin: 0.5rem .5px -0.2px -.2em }';
38+
var expected = '.rule { margin: 0.5rem 0.03125rem -0.0125rem -.2em }';
39+
var options = {
40+
propWhiteList: ['margin']
41+
};
42+
var processed = postcss(pxtorem(options)).process(rules).css;
43+
44+
expect(processed).toBe(expected);
45+
});
46+
47+
it('should not add properties that already exist', function () {
48+
var expected = '.rule { font-size: 16px; font-size: 1rem; }';
49+
var processed = postcss(pxtorem()).process(expected).css;
50+
51+
expect(processed).toBe(expected);
52+
});
53+
});
54+
55+
describe('value parsing', function () {
56+
it('should not replace values in double quotes or single quotes', function () {
57+
var options = {
58+
propWhiteList: []
59+
};
60+
var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
61+
var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 1rem; }';
62+
var processed = postcss(pxtorem(options)).process(rules).css;
63+
64+
expect(processed).toBe(expected);
65+
});
66+
67+
it('should not replace values in `url()`', function () {
68+
var options = {
69+
propWhiteList: []
70+
};
71+
var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
72+
var expected = '.rule { background: url(16px.jpg); font-size: 1rem; }';
73+
var processed = postcss(pxtorem(options)).process(rules).css;
74+
75+
expect(processed).toBe(expected);
76+
});
77+
});
78+
79+
describe('rootValue', function () {
3080
// Deprecate
3181
it('should replace using a root value of 10 - legacy', function () {
3282
var expected = '.rule { font-size: 1.5rem }';
@@ -47,7 +97,9 @@ describe('pxtorem', function () {
4797

4898
expect(processed).toBe(expected);
4999
});
100+
});
50101

102+
describe('unitPrecision', function () {
51103
// Deprecate
52104
it('should replace using a decimal of 2 places - legacy', function () {
53105
var expected = '.rule { font-size: 0.94rem }';
@@ -68,7 +120,9 @@ describe('pxtorem', function () {
68120

69121
expect(processed).toBe(expected);
70122
});
123+
});
71124

125+
describe('propWhiteList', function () {
72126
// Deprecate
73127
it('should only replace properties in the white list - legacy', function () {
74128
var expected = '.rule { font-size: 15px }';
@@ -100,7 +154,9 @@ describe('pxtorem', function () {
100154

101155
expect(processed).toBe(expected);
102156
});
157+
});
103158

159+
describe('selectorBlackList', function () {
104160
// Deprecate
105161
it('should ignore selectors in the selector black list - legacy', function () {
106162
var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
@@ -124,6 +180,30 @@ describe('pxtorem', function () {
124180
expect(processed).toBe(expected);
125181
});
126182

183+
it('should ignore every selector with `body$`', function () {
184+
var rules = 'body { font-size: 16px; } .class-body$ { font-size: 16px; } .simple-class { font-size: 16px; }';
185+
var expected = 'body { font-size: 1rem; } .class-body$ { font-size: 16px; } .simple-class { font-size: 1rem; }';
186+
var options = {
187+
selectorBlackList: ['body$']
188+
};
189+
var processed = postcss(pxtorem(options)).process(rules).css;
190+
191+
expect(processed).toBe(expected);
192+
});
193+
194+
it('should only ignore exactly `body`', function () {
195+
var rules = 'body { font-size: 16px; } .class-body { font-size: 16px; } .simple-class { font-size: 16px; }';
196+
var expected = 'body { font-size: 16px; } .class-body { font-size: 1rem; } .simple-class { font-size: 1rem; }';
197+
var options = {
198+
selectorBlackList: [/^body$/]
199+
};
200+
var processed = postcss(pxtorem(options)).process(rules).css;
201+
202+
expect(processed).toBe(expected);
203+
});
204+
});
205+
206+
describe('replace', function () {
127207
it('should leave fallback pixel unit with root em value', function () {
128208
var options = {
129209
replace: false
@@ -133,7 +213,9 @@ describe('pxtorem', function () {
133213

134214
expect(processed).toBe(expected);
135215
});
216+
});
136217

218+
describe('mediaQuery', function () {
137219
// Deprecate
138220
it('should replace px in media queries', function () {
139221
var options = {
@@ -154,54 +236,9 @@ describe('pxtorem', function () {
154236

155237
expect(processed).toBe(expected);
156238
});
239+
});
157240

158-
it('should ignore non px properties', function () {
159-
var expected = '.rule { font-size: 2em }';
160-
var processed = postcss(pxtorem()).process(expected).css;
161-
162-
expect(processed).toBe(expected);
163-
});
164-
165-
it('should handle < 1 values and values without a leading 0', function () {
166-
var rules = '.rule { margin: 0.5rem .5px -0.2px -.2em }';
167-
var expected = '.rule { margin: 0.5rem 0.03125rem -0.0125rem -.2em }';
168-
var options = {
169-
propWhiteList: ['margin']
170-
};
171-
var processed = postcss(pxtorem(options)).process(rules).css;
172-
173-
expect(processed).toBe(expected);
174-
});
175-
176-
it('should not add properties that already exist', function () {
177-
var expected = '.rule { font-size: 16px; font-size: 1rem; }';
178-
var processed = postcss(pxtorem()).process(expected).css;
179-
180-
expect(processed).toBe(expected);
181-
});
182-
183-
it('should not replace values in double quotes or single quotes', function () {
184-
var options = {
185-
propWhiteList: []
186-
};
187-
var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
188-
var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 1rem; }';
189-
var processed = postcss(pxtorem(options)).process(rules).css;
190-
191-
expect(processed).toBe(expected);
192-
});
193-
194-
it('should not replace values in `url()`', function () {
195-
var options = {
196-
propWhiteList: []
197-
};
198-
var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
199-
var expected = '.rule { background: url(16px.jpg); font-size: 1rem; }';
200-
var processed = postcss(pxtorem(options)).process(rules).css;
201-
202-
expect(processed).toBe(expected);
203-
});
204-
241+
describe('minPixelValue', function () {
205242
it('should not replace values below minPixelValue', function () {
206243
var options = {
207244
propWhiteList: [],

0 commit comments

Comments
 (0)