Skip to content

Commit 60c6410

Browse files
authored
Merge pull request #15 from gucong3000/support_stylelint
support for `stylelint`
2 parents 7fb3783 + c8d35f0 commit 60c6410

File tree

13 files changed

+87
-42
lines changed

13 files changed

+87
-42
lines changed

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
.stylelintrc*
1212
.travis.yml
1313
.vscode
14+
.nyc_output
1415
appveyor.yml
1516
coverage
1617
gulpfile.js

lib/clearAtRule.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ function clearAtRule (atRule) {
2626
return;
2727
}
2828

29-
if (atRule.name === name && !atRuleFixedParams) {
30-
unprefixed = atRule;
31-
} else {
29+
if (atRule.name[0] === '-' || atRuleFixedParams) {
3230
prefixedAtRule.push(atRule);
31+
} else {
32+
unprefixed = atRule;
3333
}
3434
});
3535

lib/clearDecl.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,22 @@
11
'use strict';
22
const postcss = require('postcss');
33
const unprefixDecl = require('./unprefix').decl;
4-
const rePrefix = require('./util').rePrefix;
4+
const util = require('./util');
55
function walkDecl (decl) {
6-
if (rePrefix.test(decl.prop) || /(^|,|\s)-\w+-.+/i.test(decl.value)) {
6+
if (util.rePrefix.test(decl.prop) || /(^|,|\s)-\w+-.+/i.test(decl.value)) {
77
clearDecl(decl);
88
}
99
}
1010

1111
function clearDecl (decl) {
1212
const rule = decl.parent;
1313
const prop = postcss.vendor.unprefixed(decl.prop);
14-
const prefixedDecls = [];
1514
let unprefixed;
1615
let lastUnprefixed;
1716

18-
rule.walkDecls(new RegExp('^-\\w+-' + prop + '$', 'i'), function (decl) {
19-
if (decl.parent !== rule) {
20-
return;
21-
}
22-
prefixedDecls.push(decl);
23-
});
17+
const prefixedDecls = util.getDecls(rule, new RegExp('^-\\w+-' + prop + '$', 'i'));
2418

25-
rule.walkDecls(unprefixDecl(decl).prop || prop, function (decl) {
26-
if (decl.parent !== rule) {
27-
return;
28-
}
19+
util.getDecls(rule, unprefixDecl(decl).prop || prop).forEach(function (decl) {
2920
lastUnprefixed = unprefixDecl(decl);
3021
if (lastUnprefixed.value) {
3122
prefixedDecls.push(decl);

lib/clearRule.js

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,22 @@
11
'use strict';
2-
const PSEUDO_MAP = {
3-
'input-placeholder': '::placeholder',
4-
'placeholder': '::placeholder',
5-
'full-screen': ':fullscreen',
6-
};
7-
8-
function unprefixSelector (selector) {
9-
let fixed;
10-
selector = selector.replace(/(\:+)-\w+-(\w+(-\w+)*)/g, function (s, colon, pseudo) {
11-
fixed = true;
12-
pseudo = pseudo.toLowerCase();
13-
return PSEUDO_MAP[pseudo] || (colon + pseudo);
14-
});
15-
if (fixed) {
16-
return selector;
17-
}
18-
}
2+
const unprefixSelector = require('./unprefixSelector');
193

204
function clearRule (rule) {
21-
const parent = rule.parent;
22-
const selector = unprefixSelector(rule.selector);
23-
if (!selector) {
5+
let selector = unprefixSelector(rule.selector);
6+
if (!selector.fixed) {
247
return;
258
}
269
const prefixedDecls = [];
2710
let unprefixed;
11+
selector = selector.toString();
12+
const parent = rule.parent;
2813
parent.walkRules(function (rule) {
2914
if (rule.parent !== parent) {
3015
return;
3116
}
3217
if (rule.selector === selector) {
3318
unprefixed = rule;
34-
} else if (unprefixSelector(rule.selector) === selector) {
19+
} else if (unprefixSelector(rule.selector).toString() === selector) {
3520
prefixedDecls.push(rule);
3621
}
3722
});

lib/unprefix.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,10 @@ function unprefix (decl) {
249249
function unprefixDecl (decl) {
250250
const result = unprefix (decl);
251251
result.replace = function () {
252-
if (result.prop) {
252+
if (result.prop && decl.prop.toLowerCase() !== result.prop) {
253253
decl.prop = result.prop;
254254
}
255-
if (result.value) {
255+
if (result.value && decl.value.toLowerCase() !== result.value) {
256256
decl.value = result.value;
257257
}
258258
};

lib/unprefixParam.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ function unprefixMedia (params) {
4545
if (!param) {
4646
return true;
4747
}
48-
const prop = /^(?:-\w+-)?(\w+-)?device-pixel-ratio$/i.exec(param[1]);
48+
const prop = /^(?:-\w+-)?((?:\w+-)*?)device-pixel-ratio$/i.exec(param[1]);
4949
if (prop) {
50-
const key = (prop[1] ? prop[1].toLowerCase() : '') + 'resolution';
50+
const key = prop[1].toLowerCase() + 'resolution';
5151
if (!rule[key]) {
5252
rule[key] = null;
5353
}

lib/unprefixSelector.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
const util = require('./util');
3+
const removeExtraSelector = util.removeExtra(/(.+?)(?:\s*,\s*\1)+/gm);
4+
const PSEUDO_MAP = {
5+
'input-placeholder': '::placeholder',
6+
'placeholder': '::placeholder',
7+
'full-screen': ':fullscreen',
8+
};
9+
10+
const parser = require('postcss-selector-parser');
11+
function unprefixSelector (selector) {
12+
let fixed;
13+
selector = parser(function unprefixSelector (selectors) {
14+
selectors.walk(function (selector) {
15+
const value = /^(\:+)-\w+-(\w+(-\w+)*)$/.exec(selector.value);
16+
if (!value) {
17+
return;
18+
}
19+
fixed = true;
20+
const pseudo = value[2].toLowerCase();
21+
selector.value = PSEUDO_MAP[pseudo] || (value[1] + pseudo);
22+
});
23+
}).process(selector);
24+
25+
return {
26+
fixed: fixed,
27+
toString: function () {
28+
return removeExtraSelector(selector.result);
29+
},
30+
};
31+
}
32+
33+
module.exports = unprefixSelector;

lib/util.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ function getDecls (parent, prop) {
6969
if (!parent) {
7070
return result;
7171
}
72+
73+
if (typeof prop === 'string') {
74+
prop = new RegExp('^' + prop + '$', 'i');
75+
}
7276
parent.walkDecls(prop, function (decl) {
7377
if (decl.parent !== parent) {
7478
return;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"nyc": "^10.3.2",
2323
"postcss-less": "^0.16.1",
2424
"postcss-reporter": "^3.0.0",
25+
"postcss-selector-parser": "^2.2.3",
2526
"stylelint": "^7.10.1"
2627
},
2728
"homepage": "https://github.com/gucong3000/postcss-unprefix#readme",
@@ -62,5 +63,5 @@
6263
"pretest": "eslint .",
6364
"test": "mocha --no-timeouts"
6465
},
65-
"version": "2.0.0"
66+
"version": "2.0.1"
6667
}

test/fixtures/selectors.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,11 @@ p::-moz-selection {
4141
color: white;
4242
background: black;
4343
}
44+
45+
input:-moz-placeholder, input::placeholder {
46+
color: pink;
47+
}
48+
49+
a[data-foo=":-webkit-full-screen"] {
50+
51+
}

0 commit comments

Comments
 (0)