Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Scripts/emoji_ranges.py
1 views
1
#!/usr/bin/env python3
2
import sys
3
import os
4
import re
5
import io
6
7
8
def fail(message):
9
print(message)
10
sys.exit(1)
11
12
13
# For simplicity and compactness, we pre-define the
14
# emoji code planes to ensure that all of the currently-used
15
# emoji ranges within them are combined.
16
big_ranges = [
17
(
18
0x1F600,
19
0x1F64F,
20
),
21
(
22
0x1F300,
23
0x1F5FF,
24
),
25
(
26
0x1F680,
27
0x1F6FF,
28
),
29
(
30
0x2600,
31
0x26FF,
32
),
33
(
34
0x2700,
35
0x27BF,
36
),
37
(
38
0xFE00,
39
0xFE0F,
40
),
41
(
42
0x1F900,
43
0x1F9FF,
44
),
45
(
46
65024,
47
65039,
48
),
49
(
50
8400,
51
8447,
52
),
53
]
54
55
if __name__ == "__main__":
56
src_filename = "emoji-data.txt"
57
src_dir_path = os.path.dirname(__file__)
58
src_file_path = os.path.join(src_dir_path, src_filename)
59
print("src_file_path", src_file_path)
60
if not os.path.exists(src_file_path):
61
fail("Could not find input file")
62
63
with io.open(src_file_path, "r", encoding="utf-8") as f:
64
text = f.read()
65
66
lines = text.split("\n")
67
raw_ranges = []
68
for line in lines:
69
if "#" in line:
70
line = line[: line.index("#")].strip()
71
if ";" not in line:
72
continue
73
print("line:", line)
74
range_text = line[: line.index(";")]
75
print("\t:", range_text)
76
if ".." in range_text:
77
range_start_hex_string, range_end_hex_string = range_text.split("..")
78
else:
79
range_start_hex_string = range_end_hex_string = range_text.strip()
80
range_start = int(range_start_hex_string.strip(), 16)
81
range_end = int(range_end_hex_string.strip(), 16)
82
print("\t", range_start, range_end)
83
84
raw_ranges.append(
85
(
86
range_start,
87
range_end,
88
)
89
)
90
91
raw_ranges += big_ranges
92
93
raw_ranges.sort(key=lambda a: a[0])
94
95
new_ranges = []
96
for range_start, range_end in raw_ranges:
97
if len(new_ranges) > 0:
98
last_range = new_ranges[-1]
99
# print 'last_range', last_range
100
last_range_start, last_range_end = last_range
101
if range_start >= last_range_start and range_start <= last_range_end + 1:
102
# if last_range_end + 1 == range_start:
103
new_ranges = new_ranges[:-1]
104
print(
105
"merging",
106
last_range_start,
107
last_range_end,
108
"and",
109
range_start,
110
range_end,
111
)
112
new_ranges.append(
113
(
114
last_range_start,
115
max(range_end, last_range_end),
116
)
117
)
118
continue
119
120
new_ranges.append(
121
(
122
range_start,
123
range_end,
124
)
125
)
126
127
print()
128
for range_start, range_end in new_ranges:
129
# print '0x%X...0x%X, // %d Emotions' % (range_start, range_end, (1 + range_end - range_start), )
130
print(
131
"EmojiRange(rangeStart:0x%X, rangeEnd:0x%X),"
132
% (
133
range_start,
134
range_end,
135
)
136
)
137
print("new_ranges:", len(new_ranges))
138
print()
139
print("Copy and paste the code above into DisplayableText.swift")
140
print()
141
142