diff options
Diffstat (limited to 'text/unicode.py')
| -rw-r--r-- | text/unicode.py | 26 |
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'] |
