-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
65 lines (55 loc) · 1.79 KB
/
index.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const css = require('css');
const cssjanus = require('cssjanus');
function stringify(cssRule) {
let rule = {
type: 'stylesheet',
stylesheet: { source: undefined, rules: [{ ...cssRule }] }
};
return css.stringify(rule);
}
let convertedRules = '';
function convert(cssObj) {
for (const rule of cssObj.rules) {
switch (rule.type) {
case 'rule':
let strRule = stringify(rule);
let rtlStrRule = cssjanus.transform(strRule);
//if css need rtl support find all rules and write on allRtlRuleStr
if (rtlStrRule !== strRule) {
let rtlDeclarations = [];
let ltrDeclarations = [];
rule.declarations = rule.declarations.filter((dec, i) => {
let decStr = `${dec.property}: ${dec.value}`;
let rtlDecRuleStr = cssjanus.transform(decStr);
if (decStr !== rtlDecRuleStr) {
rtlDeclarations.push(rtlDecRuleStr);
ltrDeclarations.push(decStr);
return false;
}
return true;
});
let rtlSelectors = rule.selectors.map(selector => {
return '.rtl ' + selector;
});
let ltrSelectors = rule.selectors.map(selector => {
return '.ltr ' + selector;
});
let rtlParsableRule =
rtlSelectors.join(',') + '{' + rtlDeclarations.join(';') + ';}\n';
let ltrParsableRule =
ltrSelectors.join(',') + '{' + ltrDeclarations.join(';') + ';}\n';
convertedRules += rtlParsableRule + ltrParsableRule;
}
break;
case 'media':
convert(rule);
break;
default:
}
}
}
module.exports = cssStr => {
var cssObj = css.parse(cssStr);
convert(cssObj.stylesheet);
return cssRules + '\n' + convertedRules;
};