1*c8dee2aaSAndroid Build Coastguard Worker#! /usr/bin/env python 2*c8dee2aaSAndroid Build Coastguard Worker 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2016 Google Inc. 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Workerimport array, zlib, base64, sys 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker# import array, zlib, base64, sys, unicodedata 11*c8dee2aaSAndroid Build Coastguard Worker# def codepoints(): 12*c8dee2aaSAndroid Build Coastguard Worker# for i in range(0x110000): 13*c8dee2aaSAndroid Build Coastguard Worker# try: 14*c8dee2aaSAndroid Build Coastguard Worker# u = ('\\U%08x' % i).decode('unicode-escape') 15*c8dee2aaSAndroid Build Coastguard Worker# n = unicodedata.name(u) 16*c8dee2aaSAndroid Build Coastguard Worker# c = unicodedata.category(u) 17*c8dee2aaSAndroid Build Coastguard Worker# if c[0] == 'C' or n.startswith('VARIATION '): 18*c8dee2aaSAndroid Build Coastguard Worker# continue 19*c8dee2aaSAndroid Build Coastguard Worker# yield i 20*c8dee2aaSAndroid Build Coastguard Worker# except ValueError: 21*c8dee2aaSAndroid Build Coastguard Worker# pass 22*c8dee2aaSAndroid Build Coastguard Worker# def make_unicode_data(): 23*c8dee2aaSAndroid Build Coastguard Worker# last = 0 24*c8dee2aaSAndroid Build Coastguard Worker# a = array.array('I') 25*c8dee2aaSAndroid Build Coastguard Worker# for i in codepoints(): 26*c8dee2aaSAndroid Build Coastguard Worker# a.append(i - last - 1) 27*c8dee2aaSAndroid Build Coastguard Worker# last = i 28*c8dee2aaSAndroid Build Coastguard Worker# return base64.b64encode(zlib.compress(a.tostring(), 9)) 29*c8dee2aaSAndroid Build Coastguard Worker# if __name__ == '__main__': 30*c8dee2aaSAndroid Build Coastguard Worker# b = make_unicode_data() 31*c8dee2aaSAndroid Build Coastguard Worker# for i in range(0, len(b), 76): 32*c8dee2aaSAndroid Build Coastguard Worker# print ' %s' % b[i:i+76] 33*c8dee2aaSAndroid Build Coastguard Workervalid_codepoint_data = ''' 34*c8dee2aaSAndroid Build Coastguard Worker eNrt3LmOHEUYAOCt7p5jL89iAbZJwJY4ExKTIiJChAh4CgSvgIgREjEJEa+ARAQxEW/gR4GRbDGa 35*c8dee2aaSAndroid Build Coastguard Worker 7Z4+pq+q/j5p5fVMd3XVX3fPTr99wVSedjgnCBsAANyTlby2qllX9722tlYH4DqieTKG+etV3tYJ 36*c8dee2aaSAndroid Build Coastguard Worker t5ntiNcqWxu9NnCbW+r6yLpQnaewn1rS3pFpPVhQWVcL7Dd/GVt6m1PGHL/WDfMXGsZlqLyHmvfy 37*c8dee2aaSAndroid Build Coastguard Worker DjGsyvN+3V6cuG42wrhRVd5i4jiX/ZtVnFeW1309bUrS3fS4Pw8tyxlmEMsu7auqDPvzd2ekuYuo 38*c8dee2aaSAndroid Build Coastguard Worker 358Tw7K8b4/abh/9/66mLPmJ8uYHr4ej1/KKNJooWuYjezlXDLGOW7dob2P02zZph5o4ti3D5uj1 39*c8dee2aaSAndroid Build Coastguard Worker dce2t23Y9lOId9byvKqYbyrafZt87SKN60WDsaltOS5L2mE2YH76vi+ZXwyr6Tolq8ljceLcums8 40*c8dee2aaSAndroid Build Coastguard Worker PPj9ZiF7uGKCa75bUp/hYF5tu+Y5rN9z2n2o6Zuhh33qq+OeXTDkWB1zPykii00Y6dz3dQu45yrC 41*c8dee2aaSAndroid Build Coastguard Worker POeqDaDx2qju79u63q+JpYxLiHvQrhetmOi6Y63H1qq4d9dCAABAIvuFlO162DuPtQ+47Dm9mzPL 42*c8dee2aaSAndroid Build Coastguard Worker Hs5IZ86yRPK37vm4tn2hr2tQbxtRXleqq9QUnyH38XfadcfHsk7JRp7PhzDWvev1gG3MOiIdYeZx 43*c8dee2aaSAndroid Build Coastguard Worker H3qN9JUmMMvxa6n78LZ5/Tzx9pYvpN7rfDmjvNwaBmGW3hQCYIL9W5ZYfsPRz9zyH7MwwbnZAHk5 44*c8dee2aaSAndroid Build Coastguard Worker dY3Qc1nGui+fwv3/uwn6TlldjnF/+tEM4r27gHo+ZwYASHM/UOVJi2PfUJUAAFEIPadVjJzfqZ+9 45*c8dee2aaSAndroid Build Coastguard Worker EmZWl1XPmD8ltc8s85nWeWh5rO+kAgAApKvpnu+3iMsY5J2F20SY56tE62L/LLC7gdPvMp6k8B7N 46*c8dee2aaSAndroid Build Coastguard Worker fWEOS8aNEEDv3mp5fLHweBnrh+F5ZPMVw3difbZvPCwzt2fP3qhrQN8DAAAAAAAAAAAAAAAAAAAA 47*c8dee2aaSAndroid Build Coastguard Worker AAAAAAAAAAAAAKCDKyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 48*c8dee2aaSAndroid Build Coastguard Worker AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIwnMhAAAAAOBInnDZLlUvwChe 49*c8dee2aaSAndroid Build Coastguard Worker n/j6WU/pbEfO91bTEV9m5dsEylA0PG6t/y9O273ReqZtl2auJ7puLvSdhA595R3jVec9QTZx+Yx3 50*c8dee2aaSAndroid Build Coastguard Worker /3tc8tqLSMvStF2tVTsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA 51*c8dee2aaSAndroid Build Coastguard Worker JzcDpl0kEJ/iqTYCxCVTbmbsvZZrktVI+QoVr4Wj94MqjIplHEA87qzhk/RBx/MeNjxufeK9yxnF 52*c8dee2aaSAndroid Build Coastguard Worker IQyYVjHw9UhLIQQsUN5y7m3yet5xzL/tOO+PNa4PMV+dk2bX9dEzzX4xVpHPcbkqHKw9NPE80nL+ 53*c8dee2aaSAndroid Build Coastguard Worker oK128vGM9oM3I177kwT2wFPvhT4yvDKBpuvgr/Pq82O7NxQO5pxshOuc8mvC8+x+vfRnRUxWLWI3 54*c8dee2aaSAndroid Build Coastguard Worker ZvsqWo7l2wbHbCZu798nOnZNsWbMRu4/S6zXPj2a8IOwsMA/KDseqz/daYMAAABz97MQzMbt0f9/ 55*c8dee2aaSAndroid Build Coastguard Worker vBYTAAAAYL7++UUMIDVXM86bZ3s1sxWC2fBd03J/CMFg+nrGyU9C2TvPYKmPTXYw12dnxi/UnKM+ 56*c8dee2aaSAndroid Build Coastguard Worker 7scgO6MNh4nzXvX8zlwbALBPB4xHsXkcV3Y9U3Jevmlx7Gri/nr9cl+Wvdy7le3f9ve5989leHJ0 57*c8dee2aaSAndroid Build Coastguard Worker 7+CqJL3v/vuZy9eYHzQ45vdb7RUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58*c8dee2aaSAndroid Build Coastguard Worker AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59*c8dee2aaSAndroid Build Coastguard Worker AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60*c8dee2aaSAndroid Build Coastguard Worker AAAAAAAAAAAAAAAAAIB2PhQCAAAAAAAAAAAAAAAAAAAAYAB/fyYGAMA4/gXQcRfM 61*c8dee2aaSAndroid Build Coastguard Worker''' 62*c8dee2aaSAndroid Build Coastguard Workerdef codepoints(): 63*c8dee2aaSAndroid Build Coastguard Worker i = 0 64*c8dee2aaSAndroid Build Coastguard Worker for increment in array.array('I', zlib.decompress( 65*c8dee2aaSAndroid Build Coastguard Worker base64.b64decode(valid_codepoint_data))).tolist(): 66*c8dee2aaSAndroid Build Coastguard Worker i += increment + 1 67*c8dee2aaSAndroid Build Coastguard Worker yield i 68*c8dee2aaSAndroid Build Coastguard Workerif sys.version_info[0] < 3: 69*c8dee2aaSAndroid Build Coastguard Worker def to_unicode(i): 70*c8dee2aaSAndroid Build Coastguard Worker return ('\\U%08x' % i).decode('unicode-escape').encode('UTF-8') 71*c8dee2aaSAndroid Build Coastguard Workerelse: 72*c8dee2aaSAndroid Build Coastguard Worker def to_unicode(i): 73*c8dee2aaSAndroid Build Coastguard Worker return chr(i) 74*c8dee2aaSAndroid Build Coastguard Workerif __name__ == '__main__': 75*c8dee2aaSAndroid Build Coastguard Worker o = sys.stdout 76*c8dee2aaSAndroid Build Coastguard Worker o.write(to_unicode(0xFEFF)) 77*c8dee2aaSAndroid Build Coastguard Worker last_row = -1 78*c8dee2aaSAndroid Build Coastguard Worker for i in codepoints(): 79*c8dee2aaSAndroid Build Coastguard Worker row = i - (i & 63) 80*c8dee2aaSAndroid Build Coastguard Worker if last_row != row: 81*c8dee2aaSAndroid Build Coastguard Worker if row: 82*c8dee2aaSAndroid Build Coastguard Worker o.write('\n' if row % 1024 else '\n\n') 83*c8dee2aaSAndroid Build Coastguard Worker o.write('U+%06x ' % row) 84*c8dee2aaSAndroid Build Coastguard Worker last_row = row 85*c8dee2aaSAndroid Build Coastguard Worker o.write(' ' + to_unicode(i)) 86*c8dee2aaSAndroid Build Coastguard Worker o.write('\n') 87