This repository was archived by the owner on May 30, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcreatePseudoCSS.js
More file actions
69 lines (63 loc) · 2.14 KB
/
createPseudoCSS.js
File metadata and controls
69 lines (63 loc) · 2.14 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
const pseudo = require('./conf/pseudo');
const parseUtilities = require('./parseUtilities');
const getPotentialStyles = require('./getPotentialStyles');
const formatClassName = require('./utils/formatClassName');
const createCss = require('./createCss');
const getPseudoLabel = (property) => {
for(let [type, labels] of Object.entries(pseudo)) {
for(let [i, label] of Object.entries(labels)) {
if(label === property) {
return type === 'classes' ? `:${label}` : `::${label}`;
}
else if(typeof label === 'object') {
if(label[property] !== undefined) {
return type === 'classes' ? `:${label[property]}` : `::${label[property]}`;
}
}
}
}
return false;
}
const getPseudoClasses = (content, existingClassess = {}) => {
let potentialStyles = existingClassess;
getPotentialStyles(content,
[...pseudo.classes, ...pseudo.elements].map(i => typeof i === 'object' ? Object.keys(i)[0] : i)
).forEach(k => {
let match = k.match(/^(?<pseudo>[a-zA-Z\d\-]+)[\:]{1}(?<class>.*)$/)['groups'] || {};
if(match.pseudo !== undefined && match.class !== undefined) {
potentialStyles[match.pseudo] = [
...new Set([...potentialStyles[match.pseudo] || [], ...[match.class.replace('\\', '')]])
]
}
});
return potentialStyles;
}
const createPseudoCSS = (pseudoClasses) => {
let utilityClasses = parseUtilities(require('./conf/utilityClasses'));
let css = {};
for(let [label, classes] of Object.entries(pseudoClasses)) {
let property = getPseudoLabel(label);
let styles = Object.fromEntries(Object.entries(utilityClasses).filter(
([k]) => [...classes].includes(formatClassName(k).replace('\\', ''))
));
if(styles.length < 1) {
continue;
}
css = {...css, ...createCss({
rules: Object.fromEntries(
Object.entries(styles)
.map(([key, value]) => {
if(['before', 'after'].includes(label)) {
value = {...value, 'content': '""'};
}
return [`${label}\\:${key}${property}`, value];
})
)
})};
}
return css;
};
module.exports = {
createPseudoCSS,
getPseudoClasses
};