-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathselectors.js
50 lines (44 loc) · 1.49 KB
/
selectors.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
const generatePrefixes = require('./prefixes-config');
const isSelectorHasDir = (selector = '', options) => !!selector.match(generatePrefixes(options)[options.prefixType].regex);
const isHtmlSelector = (selector = '') => !!selector.match(/^html/);
const isRootSelector = (selector = '') => !!selector.match(/:root/);
const addDirToSelectors = (selectors = '', dir, options = {}) => {
const {addPrefixToSelector, prefixType} = options;
// we swap direction prefixes if we are converting rtl styles to ltr
if (options.fromRTL) {
switch (dir) {
case 'rtl':
dir = 'ltr';
break;
case 'ltr':
dir = 'rtl';
break;
default:
}
}
const prefix = generatePrefixes(options)[prefixType].prefixes[dir];
if (!prefix) return selectors;
return selectors
.split(/\s*,\s*/)
.map((selector) => {
if (addPrefixToSelector) {
selector = addPrefixToSelector(selector, prefix);
} else if (isHtmlSelector(selector)) {
// only replace `html` at the beginning of selector
selector = selector.replace(/^html/ig, `html${prefix}`);
} else if (isRootSelector(selector)) {
selector = selector.replace(/:root/ig, `${prefix}:root`);
} else {
// add prefix without html for least change of the priority level
selector = `${prefix} ${selector}`;
}
return selector;
})
.join(', ');
};
module.exports = {
isSelectorHasDir,
isHtmlSelector,
isRootSelector,
addDirToSelectors,
};