source: proto/charsetcompiler/UCD/UCD_properties.py @ 4146

Last change on this file since 4146 was 4146, checked in by cameron, 5 years ago

Parse various UCD files and generate header files

File size: 2.6 KB
Line 
1#
2# Licensed under Open Software License 3.0.
3import re
4from unicode_set import *
5
6UCD_dir = "7.0.0"
7#
8#  Processing files of the UCD
9#
10
11UCD_skip = re.compile("^#.*$|^\s*$")
12UCD_point_name_regexp = re.compile("^([0-9A-F]{4,6})\s*;\s*((?:[-A-Za-z0-9_]+\s+)*[-A-Za-z0-9_]+)\s*(?:[;#]|$)")
13UCD_range_name_regexp = re.compile("^([0-9A-F]{4,6})[.][.]([0-9A-F]{4,6})\s*;\s*((?:[-A-Za-z0-9_]+\s+)*[-A-Za-z0-9_]+)\s*(?:[;#]|$)")
14
15def parse_UCD_codepoint_name_map(mapfile):
16   name_map = {}
17   name_list_order = []
18   f = open(UCD_dir + "/" + mapfile)
19   lines = f.readlines()
20   for t in lines:
21      if UCD_skip.match(t): continue  # skip comment and blank lines
22      m = UCD_point_name_regexp.match(t)
23      if m:
24        (codepoint, name) = (int(m.group(1), 16), m.group(2))
25        newset = singleton_set(codepoint)
26      else: 
27        m = UCD_range_name_regexp.match(t)
28        if not m: raise Exception("Unkown syntax: %s" % t)
29        (cp_lo, cp_hi, name) = (int(m.group(1), 16), int(m.group(2), 16), m.group(3))
30        newset = make_range_set(cp_lo, cp_hi)
31      if not name_map.has_key(name):
32        name_map[name] = newset
33        name_list_order.append(name)
34      else: name_map[name] = union(name_map[name], newset)
35   return (name_list_order, name_map)
36
37def generate_PropList_h():
38   (props, prop_map) = parse_UCD_codepoint_name_map('PropList.txt')
39   f = open('PropList.h', 'w')
40   for k in props:
41     f.write(prop_map[k].showC(k))
42   f.close()
43
44def generate_Blocks_h():
45   (blocks, block_map) = parse_UCD_codepoint_name_map('Blocks.txt')
46   f = open('Blocks.h', 'w')
47   for k in blocks:
48     f.write(block_map[k].showC('block["%s"]' % k))
49   f.close()
50
51def generate_Scripts_h():
52   (scripts, script_map) = parse_UCD_codepoint_name_map('Scripts.txt')
53   f = open('Scripts.h', 'w')
54   for k in scripts:
55     f.write(script_map[k].showC('script["%s"]' % k))
56   f.close()
57   
58def generate_ScriptExtensions_h():
59   (scx_sets, scx_map) = parse_UCD_codepoint_name_map('ScriptExtensions.txt')
60   map2 = {}
61   f = open('ScriptExtensions.h', 'w')
62   for scx_list in scx_sets:
63     scx_items = scx_list.split(" ")
64     for scx in scx_items:
65        if map2.has_key(scx): 
66           map2[scx] = union(map2[scx], scx_map[scx_list])
67        else: map2[scx] = scx_map[scx_list]
68   for k in sorted(map2.keys()):
69     f.write(map2[k].showC('scx["%s"]' % k))
70   f.close()
71
72def generate_General_Categories_h():
73   (categories, cat_map) = parse_UCD_codepoint_name_map('extracted/DerivedGeneralCategory.txt')
74   f = open('General_Categories.h', 'w')
75   for k in categories:
76     f.write(cat_map[k].showC('GC["%s"]' % k))
77   f.close()
78
79
Note: See TracBrowser for help on using the repository browser.