aboutsummaryrefslogtreecommitdiffstats
path: root/text/unicode.py
diff options
context:
space:
mode:
Diffstat (limited to 'text/unicode.py')
-rw-r--r--text/unicode.py26
1 files changed, 17 insertions, 9 deletions
diff --git a/text/unicode.py b/text/unicode.py
index eb123c3..a823658 100644
--- a/text/unicode.py
+++ b/text/unicode.py
@@ -171,7 +171,13 @@ def main():
category = derived('extracted/DerivedGeneralCategory.txt', CATEGORIES)
line = derived('extracted/DerivedLineBreak.txt', LINE, aliases('lb'))
width = derived('extracted/DerivedEastAsianWidth.txt', WIDTHS, aliases('ea'))
- brackets_ea = [c for c in range(LAST + 1) if LINE[line[c]] in ('OP', 'CP') and WIDTHS[width[c]] in ('F', 'W', 'H')]
+ east_asian = [] # ranges of East_Asian_Width F, W or H
+ for c in range(LAST + 1):
+ if WIDTHS[width[c]] in ('F', 'W', 'H'):
+ if east_asian and east_asian[-1][1] == c - 1:
+ east_asian[-1][1] = c
+ else:
+ east_asian.append([c, c])
grapheme = derived('auxiliary/GraphemeBreakProperty.txt', GRAPHEME)
conjunct = [0] * (LAST + 1)
for first, last, fields, missing in ranges('DerivedCoreProperties.txt'):
@@ -197,6 +203,8 @@ def main():
f'{" " + version.group(1) if version else ""}: do not edit. */')
print('#include "text.h"')
print()
+ print('const char *vega_unicode_version(void) { return "' + (version.group(1) if version else '') + '"; }')
+ print()
print(f'/* Bidi_Class ({size} bytes). */')
print(table)
print()
@@ -278,20 +286,20 @@ uint32_t vega_mirror(uint32_t code) {
print(f' return script_codes[(unsigned)script < {len(codes)} ? script : 0];')
print('}')
print()
- print('/* Opening and closing punctuation (OP, CP) of East_Asian_Width F, W or H. */')
- print(f'static const uint32_t east_asian_brackets[{len(brackets_ea)}] = {{')
- for i in range(0, len(brackets_ea), 10):
- print(' ' + ', '.join(f'0x{c:04X}' for c in brackets_ea[i:i + 10]) + ',')
+ print('/* East_Asian_Width F, W or H, as sorted ranges. */')
+ print(f'static const uint32_t east_asian[{len(east_asian)}][2] = {{')
+ for i in range(0, len(east_asian), 6):
+ print(' ' + ', '.join(f'{{0x{a:04X}, 0x{b:04X}}}' for a, b in east_asian[i:i + 6]) + ',')
print('};')
print('''
-bool vega_east_asian_bracket(uint32_t code) {
- size_t low = 0, high = sizeof(east_asian_brackets) / sizeof(*east_asian_brackets);
+bool vega_east_asian(uint32_t code) {
+ size_t low = 0, high = sizeof(east_asian) / sizeof(*east_asian);
while (low < high) {
size_t middle = (low + high) / 2;
- if (east_asian_brackets[middle] < code) low = middle + 1;
+ if (east_asian[middle][1] < code) low = middle + 1;
else high = middle;
}
- return low < sizeof(east_asian_brackets) / sizeof(*east_asian_brackets) && east_asian_brackets[low] == code;
+ return low < sizeof(east_asian) / sizeof(*east_asian) && east_asian[low][0] <= code;
}''')
pictographic = [(first, last) for first, last, fields, missing in ranges('emoji/emoji-data.txt')
if not missing and fields[0] == 'Extended_Pictographic']