1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*2d1272b8SAndroid Build Coastguard Worker 3*2d1272b8SAndroid Build Coastguard Worker"""usage: ./gen-emoji-table.py emoji-data.txt emoji-test.txt 4*2d1272b8SAndroid Build Coastguard Worker 5*2d1272b8SAndroid Build Coastguard WorkerInput file: 6*2d1272b8SAndroid Build Coastguard Worker* https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt 7*2d1272b8SAndroid Build Coastguard Worker* https://www.unicode.org/Public/emoji/latest/emoji-test.txt 8*2d1272b8SAndroid Build Coastguard Worker""" 9*2d1272b8SAndroid Build Coastguard Worker 10*2d1272b8SAndroid Build Coastguard Workerimport sys 11*2d1272b8SAndroid Build Coastguard Workerfrom collections import OrderedDict 12*2d1272b8SAndroid Build Coastguard Workerimport packTab 13*2d1272b8SAndroid Build Coastguard Worker 14*2d1272b8SAndroid Build Coastguard Workerif len (sys.argv) != 3: 15*2d1272b8SAndroid Build Coastguard Worker sys.exit (__doc__) 16*2d1272b8SAndroid Build Coastguard Worker 17*2d1272b8SAndroid Build Coastguard Workerf = open(sys.argv[1]) 18*2d1272b8SAndroid Build Coastguard Workerheader = [f.readline () for _ in range(10)] 19*2d1272b8SAndroid Build Coastguard Worker 20*2d1272b8SAndroid Build Coastguard Workerranges = OrderedDict() 21*2d1272b8SAndroid Build Coastguard Workerfor line in f.readlines(): 22*2d1272b8SAndroid Build Coastguard Worker line = line.strip() 23*2d1272b8SAndroid Build Coastguard Worker if not line or line[0] == '#': 24*2d1272b8SAndroid Build Coastguard Worker continue 25*2d1272b8SAndroid Build Coastguard Worker rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]] 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker rang = [int(s, 16) for s in rang.split('..')] 28*2d1272b8SAndroid Build Coastguard Worker if len(rang) > 1: 29*2d1272b8SAndroid Build Coastguard Worker start, end = rang 30*2d1272b8SAndroid Build Coastguard Worker else: 31*2d1272b8SAndroid Build Coastguard Worker start = end = rang[0] 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker if typ not in ranges: 34*2d1272b8SAndroid Build Coastguard Worker ranges[typ] = [] 35*2d1272b8SAndroid Build Coastguard Worker if ranges[typ] and ranges[typ][-1][1] == start - 1: 36*2d1272b8SAndroid Build Coastguard Worker ranges[typ][-1] = (ranges[typ][-1][0], end) 37*2d1272b8SAndroid Build Coastguard Worker else: 38*2d1272b8SAndroid Build Coastguard Worker ranges[typ].append((start, end)) 39*2d1272b8SAndroid Build Coastguard Worker 40*2d1272b8SAndroid Build Coastguard Worker 41*2d1272b8SAndroid Build Coastguard Worker 42*2d1272b8SAndroid Build Coastguard Workerprint ("/* == Start of generated table == */") 43*2d1272b8SAndroid Build Coastguard Workerprint ("/*") 44*2d1272b8SAndroid Build Coastguard Workerprint (" * The following tables are generated by running:") 45*2d1272b8SAndroid Build Coastguard Workerprint (" *") 46*2d1272b8SAndroid Build Coastguard Workerprint (" * ./gen-emoji-table.py emoji-data.txt") 47*2d1272b8SAndroid Build Coastguard Workerprint (" *") 48*2d1272b8SAndroid Build Coastguard Workerprint (" * on file with this header:") 49*2d1272b8SAndroid Build Coastguard Workerprint (" *") 50*2d1272b8SAndroid Build Coastguard Workerfor l in header: 51*2d1272b8SAndroid Build Coastguard Worker print (" * %s" % (l.strip())) 52*2d1272b8SAndroid Build Coastguard Workerprint (" */") 53*2d1272b8SAndroid Build Coastguard Workerprint () 54*2d1272b8SAndroid Build Coastguard Workerprint ("#ifndef HB_UNICODE_EMOJI_TABLE_HH") 55*2d1272b8SAndroid Build Coastguard Workerprint ("#define HB_UNICODE_EMOJI_TABLE_HH") 56*2d1272b8SAndroid Build Coastguard Workerprint () 57*2d1272b8SAndroid Build Coastguard Workerprint ('#include "hb-unicode.hh"') 58*2d1272b8SAndroid Build Coastguard Workerprint () 59*2d1272b8SAndroid Build Coastguard Worker 60*2d1272b8SAndroid Build Coastguard Workerfor typ, s in ranges.items(): 61*2d1272b8SAndroid Build Coastguard Worker if typ != "Extended_Pictographic": continue 62*2d1272b8SAndroid Build Coastguard Worker 63*2d1272b8SAndroid Build Coastguard Worker arr = dict() 64*2d1272b8SAndroid Build Coastguard Worker for start,end in s: 65*2d1272b8SAndroid Build Coastguard Worker for i in range(start, end + 1): 66*2d1272b8SAndroid Build Coastguard Worker arr[i] = 1 67*2d1272b8SAndroid Build Coastguard Worker 68*2d1272b8SAndroid Build Coastguard Worker sol = packTab.pack_table(arr, 0, compression=9) 69*2d1272b8SAndroid Build Coastguard Worker code = packTab.Code('_hb_emoji') 70*2d1272b8SAndroid Build Coastguard Worker sol.genCode(code, 'is_'+typ) 71*2d1272b8SAndroid Build Coastguard Worker code.print_c(linkage='static inline') 72*2d1272b8SAndroid Build Coastguard Worker print() 73*2d1272b8SAndroid Build Coastguard Worker 74*2d1272b8SAndroid Build Coastguard Workerprint () 75*2d1272b8SAndroid Build Coastguard Workerprint ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */") 76*2d1272b8SAndroid Build Coastguard Workerprint () 77*2d1272b8SAndroid Build Coastguard Workerprint ("/* == End of generated table == */") 78*2d1272b8SAndroid Build Coastguard Worker 79*2d1272b8SAndroid Build Coastguard Worker 80*2d1272b8SAndroid Build Coastguard Worker# Generate test file. 81*2d1272b8SAndroid Build Coastguard Workersequences = [] 82*2d1272b8SAndroid Build Coastguard Workerwith open(sys.argv[2]) as f: 83*2d1272b8SAndroid Build Coastguard Worker for line in f.readlines(): 84*2d1272b8SAndroid Build Coastguard Worker if "#" in line: 85*2d1272b8SAndroid Build Coastguard Worker line = line[:line.index("#")] 86*2d1272b8SAndroid Build Coastguard Worker if ";" in line: 87*2d1272b8SAndroid Build Coastguard Worker line = line[:line.index(";")] 88*2d1272b8SAndroid Build Coastguard Worker line = line.strip() 89*2d1272b8SAndroid Build Coastguard Worker line = line.split(" ") 90*2d1272b8SAndroid Build Coastguard Worker if len(line) < 2: 91*2d1272b8SAndroid Build Coastguard Worker continue 92*2d1272b8SAndroid Build Coastguard Worker sequences.append(line) 93*2d1272b8SAndroid Build Coastguard Worker 94*2d1272b8SAndroid Build Coastguard Workerwith open("../test/shape/data/in-house/tests/emoji-clusters.tests", "w") as f: 95*2d1272b8SAndroid Build Coastguard Worker for sequence in sequences: 96*2d1272b8SAndroid Build Coastguard Worker f.write("../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot") 97*2d1272b8SAndroid Build Coastguard Worker f.write(";" + ",".join(sequence)) 98*2d1272b8SAndroid Build Coastguard Worker f.write(";[" + "|".join("1=0" for c in sequence) + "]\n") 99