-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.js
More file actions
94 lines (81 loc) · 1.94 KB
/
index.js
File metadata and controls
94 lines (81 loc) · 1.94 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import postcss from 'postcss'
import safe from 'postcss-safe-parser'
import postcssSafeCss from './postcssSafeCss.js'
import getClassCandidates from './getClassCandidates.js'
const plugin = (options = {}) => tree => {
options.ignored = options.ignored || [
{
heads: '{{',
tails: '}}',
},
{
heads: '{{{',
tails: '}}}',
},
]
options.replacements = {
':': '-',
'/': '-',
'%': 'pc',
'.': '_',
',': '_',
'#': '_',
'[': '',
']': '',
'(': '',
')': '',
'{': '',
'}': '',
'!': 'i-',
'&': 'and-',
'<': 'lt-',
'=': 'eq-',
'>': 'gt-',
'|': 'or-',
'@': 'at-',
'?': 'q-',
'\\': '-',
'"': '-',
'\'': '-',
'*': '-',
'+': '-',
';': '-',
'^': '-',
'`': '-',
'~': '-',
$: '-',
...options.replacements,
}
const classAttrRegex = needle => new RegExp(`\\${needle}`, 'g')
const process = node => {
if (node.tag === 'style' && node.content) {
const content = Array.isArray(node.content) ? node.content.join('') : node.content
node.content = postcss([
postcssSafeCss({
replacements: options.replacements,
}),
])
.process(content, { parser: safe })
.css
}
if (node.attrs?.class) {
const classes = getClassCandidates(node.attrs.class, options.ignored)
const safeClasses = []
for (let cls of classes) {
// If class starts or ends with one if the heads/tails, skip it
if (options.ignored.some(({heads, tails}) => cls.startsWith(heads) || cls.endsWith(tails))) {
safeClasses.push(cls)
continue
}
for (const [from, to] of Object.entries(options.replacements)) {
cls = cls.replace(classAttrRegex(from), to)
}
safeClasses.push(cls)
}
node.attrs.class = safeClasses.join(' ')
}
return node
}
return tree.walk(process)
}
export default plugin