#!/usr/bin/env python3 """usage: ./gen-arabic-joining-table.py ArabicShaping.txt Scripts.txt Input files: * https://unicode.org/Public/UCD/latest/ucd/ArabicShaping.txt * https://unicode.org/Public/UCD/latest/ucd/Scripts.txt """ import os.path, sys if len (sys.argv) != 3: sys.exit (__doc__) files = [open (x, encoding='utf-8') for x in sys.argv[1:]] headers = [[f.readline (), f.readline ()] for f in files] while files[0].readline ().find ('##################') < 0: pass def read (f): mapping = {} for line in f: j = line.find ('#') if j >= 0: line = line[:j] fields = [x.strip () for x in line.split (';')] if len (fields) == 1: continue uu = fields[0].split ('..') start = int (uu[0], 16) if len (uu) == 1: end = start else: end = int (uu[1], 16) t = fields[1] for u in range (start, end + 1): mapping[u] = t return mapping def read_joining_uu (f): values = set () for line in f: if line[0] == '#': continue fields = [x.strip () for x in line.split (';')] if len (fields) == 1: continue if fields[2] in {'T', 'U'}: continue values.add (int (fields[0], 16)) return sorted (values) def print_has_arabic_joining (scripts, joining_uu): print ("static bool") print ("has_arabic_joining (hb_script_t script)") print ("{") print (" /* List of scripts that have data in arabic-table. */") print (" switch ((int) script)") print (" {") for script in sorted ({scripts[u] for u in joining_uu if scripts[u] not in {'Common', 'Inherited'}}): print (" case HB_SCRIPT_{}:".format (script.upper ())) print (" return true;") print () print (" default:") print (" return false;") print (" }") print ("}") print () print ("/* == Start of generated function == */") print ("/*") print (" * The following function is generated by running:") print (" *") print (" * ./gen-arabic-joining-list.py ArabicShaping.txt Scripts.txt") print (" *") print (" * on files with these headers:") print (" *") for h in headers: for l in h: print (" * %s" % (l.strip ())) print (" */") print () print ("#ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH") print ("#define HB_OT_SHAPER_ARABIC_JOINING_LIST_HH") print () print_has_arabic_joining (read (files[1]), read_joining_uu (files[0])) print () print ("#endif /* HB_OT_SHAPER_ARABIC_JOINING_LIST_HH */") print () print ("/* == End of generated function == */")