-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprinter.js
89 lines (79 loc) · 1.81 KB
/
printer.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'use strict';
function orderClassNames(classNames) {
return classNames
.split(' ')
.sort((className1, className2) =>
className1.localeCompare(className2, undefined, { numeric: true })
)
.join(' ');
}
function sortAttributes(attr1, attr2) {
if (!attr1.name) {
return 0;
}
if (
attr1.name.slice(0, 5) === 'data-' &&
attr2.name.slice(0, 5) !== 'data-'
) {
return -1;
} else if (
attr2.name.slice(0, 5) === 'data-' &&
attr1.name.slice(0, 5) !== 'data-'
) {
return 1;
}
if (attr1.name[0] !== '@' && attr2.name[0] === '@') {
return -1;
} else if (attr2.name[0] !== '@' && attr1.name[0] === '@') {
return 1;
}
return attr1.name.localeCompare(attr2.name, undefined, { numeric: true });
}
function print(path, options, print) {
const n = path.getValue();
/* istanbul ignore if*/
if (!n) {
return '';
}
// order classnames
if (
(n.name === 'class' || n.name === '@class') &&
n.value &&
n.value.type === 'TextNode' &&
n.value.chars
) {
n.value.chars = orderClassNames(n.value.chars);
}
if (
n.type === 'HashPair' &&
(n.key === 'class' || n.key === '@class') &&
n.value.type === 'StringLiteral' &&
n.value.value
) {
n.value.value = orderClassNames(n.value.value);
}
// order attributes
if (n.type === 'ElementNode' && n.attributes) {
n.attributes = n.attributes.sort(sortAttributes);
}
if (
(n.type === 'MustacheStatement' || n.type === 'BlockStatement') &&
n.hash &&
n.hash.pairs
) {
n.hash.pairs = n.hash.pairs
.map(n => {
n.name = n.key;
return n;
})
.sort(sortAttributes)
.map(n => {
n.name = undefined;
return JSON.parse(JSON.stringify(n));
});
}
}
module.exports = {
print,
massageAstNode: clean
};