-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathparse-emoji-sequences.js
102 lines (97 loc) · 2.7 KB
/
parse-emoji-sequences.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
90
91
92
93
94
95
96
97
98
99
100
101
102
'use strict';
const utils = require('./utils.js');
const parseEmojiSequencesWithId = ({ version, id }) => {
const source = utils.readDataFile(version, id);
if (!source) {
return;
}
const propertyMap = new Map();
const lines = source.split('\n');
lines.forEach((line) => {
if (!line || /^#/.test(line)) {
return;
}
const data = line.trim().split('; ');
const charRange = data[0].replace('..', '-').trim();
const rangeParts = charRange.split('-');
const property = data[1].split('#')[0].trim();
if (rangeParts.length == 2) {
utils.range(
parseInt(rangeParts[0], 16),
parseInt(rangeParts[1], 16)
).forEach((codePoint) => {
const symbol = String.fromCodePoint(codePoint);
if (propertyMap.has(property)) {
propertyMap.get(property).add(symbol);
} else {
propertyMap.set(property, new Set([symbol]));
}
});
} else {
const codePoints = data[0].trim().split(' ').map((hex) => {
return parseInt(hex, 16);
});
const sequence = String.fromCodePoint(...codePoints);
if (propertyMap.has(property)) {
propertyMap.get(property).add(sequence);
} else {
propertyMap.set(property, new Set([sequence]));
}
}
});
const plainObject = {};
for (const [property, codePoints] of propertyMap) {
plainObject[property] = [...codePoints].sort((a, b) => a - b);
}
return plainObject;
};
const parseEmojiTestData = ({ version }) => {
const source = utils.readDataFile(version, 'emoji-test');
if (!source) {
return;
}
const sequences = [];
const lines = source.split('\n');
lines.forEach((line) => {
if (!line || /^#/.test(line)) {
return;
}
const data = line.trim().split('; ');
const codePoints = data[0].trim().split(' ').map((hex) => {
return parseInt(hex, 16);
});
const sequence = String.fromCodePoint(...codePoints);
sequences.push(sequence);
});
const plainObject = {
'Emoji_Test': sequences.sort((a, b) => a - b),
};
return plainObject;
};
const parseEmojiSequences = (version) => {
const props = {
...parseEmojiSequencesWithId({ version, id: 'emoji-sequences' }),
...parseEmojiSequencesWithId({ version, id: 'emoji-zwj-sequences' }),
...parseEmojiTestData({ version }),
};
// Older Unicode versions that lack RGI_Emoji_* properties should not
// get RGI_Emoji either.
if (props.RGI_Emoji_ZWJ_Sequence) {
// https://unicode.org/reports/tr51/#def_rgi_set
const RGI_Emoji = [
...props.Basic_Emoji,
...props.Emoji_Keycap_Sequence,
...props.RGI_Emoji_Modifier_Sequence,
...props.RGI_Emoji_Flag_Sequence,
...props.RGI_Emoji_Tag_Sequence,
...props.RGI_Emoji_ZWJ_Sequence,
].sort();
const result = {
RGI_Emoji,
...props,
};
return result;
}
return props;
};
module.exports = parseEmojiSequences;