This repository was archived by the owner on Dec 31, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathattr.js
69 lines (59 loc) · 1.46 KB
/
attr.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
const identifier = require('../tools/identifier');
const optional = require('../tools/optional');
const match = require('../tools/match');
const fn = require('../tools/function');
const typeAndUnits = [
[
['string'], require('./string')
],
[
['color'], require('./color')
],
[
['url'], require('./url')
],
[
['integer'], require('./integer')
],
[
['number'], require('./number')
],
[
['length', 'cap', 'ch', 'em', 'ex', 'ic', 'lh', 'rlh', 'rem', 'vb', 'vi', 'vw', 'vh', 'vmin', 'vmax', 'mm', 'Q', 'cm', 'in', 'pt', 'pc', 'px'],
require('./length')
],
[
['angle', 'deg', 'grad', 'rad', 'turn'], require('./angle')
],
[
['time', 'ms', 's'], require('./time')
],
[
['frequency', 'Hz', 'kHz'], require('./frequency')
],
[
['%'], require('./percentage')
]
];
module.exports = fn('attribute', ['attr'], stream => {
const attribute = identifier(stream);
if (!attribute) {
return null;
}
let typeOrUnit = null;
let fallback = null;
for (const [types, parser] of typeAndUnits) {
typeOrUnit = match(stream, ...types);
if (typeOrUnit) {
if (optional(stream, 'punc', ',') && !(fallback = parser(stream))) {
return null;
}
break;
}
}
return {
attribute,
typeOrUnit,
fallback
};
});