|  |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | import commands | 
					
						
							|  |  |  | import subprocess | 
					
						
							|  |  |  | import io | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def fail(message): | 
					
						
							|  |  |  |     print message | 
					
						
							|  |  |  |     sys.exit(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # For simplicity and compactness, we pre-define the  | 
					
						
							|  |  |  | # emoji code planes to ensure that all of the currently-used | 
					
						
							|  |  |  | # emoji ranges within them are combined. | 
					
						
							|  |  |  | big_ranges = [ | 
					
						
							|  |  |  |         (0x1F600,0x1F64F, ), | 
					
						
							|  |  |  |         (0x1F300,0x1F5FF, ), | 
					
						
							|  |  |  |         (0x1F680,0x1F6FF, ), | 
					
						
							|  |  |  |         (0x2600,0x26FF,   ), | 
					
						
							|  |  |  |         (0x2700,0x27BF,   ), | 
					
						
							|  |  |  |         (0xFE00,0xFE0F,   ), | 
					
						
							|  |  |  |         (0x1F900,0x1F9FF,  ), | 
					
						
							|  |  |  |         (65024,65039,),  | 
					
						
							|  |  |  |         (8400, 8447,) | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     src_filename = "emoji-data.txt" | 
					
						
							|  |  |  |     src_dir_path = os.path.dirname(__file__) | 
					
						
							|  |  |  |     src_file_path = os.path.join(src_dir_path, src_filename) | 
					
						
							|  |  |  |     print 'src_file_path', src_file_path | 
					
						
							|  |  |  |     if not os.path.exists(src_file_path): | 
					
						
							|  |  |  |         fail("Could not find input file") | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     with io.open(src_file_path, "r", encoding="utf-8") as f: | 
					
						
							|  |  |  |         text = f.read() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     lines = text.split('\n') | 
					
						
							|  |  |  |     raw_ranges = [] | 
					
						
							|  |  |  |     for line in lines: | 
					
						
							|  |  |  |         if '#' in line: | 
					
						
							|  |  |  |             line = line[:line.index('#')].strip() | 
					
						
							|  |  |  |         if ';' not in line: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         print 'line:', line | 
					
						
							|  |  |  |         range_text = line[:line.index(';')] | 
					
						
							|  |  |  |         print '\t:', range_text | 
					
						
							|  |  |  |         if '..' in range_text: | 
					
						
							|  |  |  |             range_start_hex_string, range_end_hex_string = range_text.split('..') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             range_start_hex_string = range_end_hex_string = range_text.strip() | 
					
						
							|  |  |  |         range_start = int(range_start_hex_string.strip(), 16) | 
					
						
							|  |  |  |         range_end = int(range_end_hex_string.strip(), 16) | 
					
						
							|  |  |  |         print '\t', range_start, range_end | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         raw_ranges.append((range_start, range_end,)) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |     raw_ranges += big_ranges | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |     raw_ranges.sort(key=lambda a:a[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     new_ranges = [] | 
					
						
							|  |  |  |     for range_start, range_end in raw_ranges: | 
					
						
							|  |  |  |         if len(new_ranges) > 0: | 
					
						
							|  |  |  |             last_range = new_ranges[-1] | 
					
						
							|  |  |  |             # print 'last_range', last_range | 
					
						
							|  |  |  |             last_range_start, last_range_end = last_range | 
					
						
							|  |  |  |             if range_start >= last_range_start and range_start <= last_range_end + 1: | 
					
						
							|  |  |  |             # if last_range_end + 1 == range_start: | 
					
						
							|  |  |  |                 new_ranges = new_ranges[:-1] | 
					
						
							|  |  |  |                 print 'merging', last_range_start, last_range_end, 'and', range_start, range_end | 
					
						
							|  |  |  |                 new_ranges.append((last_range_start, max(range_end, last_range_end),)) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         new_ranges.append((range_start, range_end,)) | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     print | 
					
						
							|  |  |  |     for range_start, range_end in new_ranges: | 
					
						
							|  |  |  |         # print '0x%X...0x%X, // %d Emotions' % (range_start, range_end, (1 + range_end - range_start), ) | 
					
						
							|  |  |  |         print 'EmojiRange(rangeStart:0x%X, rangeEnd:0x%X),' % (range_start, range_end, ) | 
					
						
							|  |  |  |     print 'new_ranges:', len(new_ranges) | 
					
						
							|  |  |  |     print | 
					
						
							|  |  |  |     print 'Copy and paste the code above into DisplayableText.swift' | 
					
						
							|  |  |  |     print  | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |          |