77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
# Convert MES-2 (or WGL4) character set to list of glyphs for font subsetting.
|
||
|
# Also add small-caps glyph names for small letters and ligatures.
|
||
|
|
||
|
import sys
|
||
|
|
||
|
glyphs = {}
|
||
|
for line in open("scripts/glyphlist.txt").readlines():
|
||
|
if len(line) > 0 and line[0] != '#':
|
||
|
n, u = line.rstrip().split(';')
|
||
|
if len(u) == 4:
|
||
|
u = int(u, base=16)
|
||
|
if u >= 0x0000 and u <= 0x001F: continue # control block 1
|
||
|
if u >= 0x007F and u <= 0x009F: continue # control block 2
|
||
|
if u >= 0x2500 and u <= 0x25FF: continue # Box Drawing, Block Elements, Geometric Shapes
|
||
|
if u not in glyphs:
|
||
|
glyphs[u] = [n]
|
||
|
else:
|
||
|
glyphs[u].append(n)
|
||
|
|
||
|
# Ligatures are mapped to 'fi' and 'fl'; we also want them using the 'f_i' convention.
|
||
|
|
||
|
table = {}
|
||
|
do_small = False
|
||
|
|
||
|
def load_table(fn):
|
||
|
for line in open(fn).readlines():
|
||
|
is_small = ('SMALL LETTER' in line) or ('SMALL LIGATURE' in line)
|
||
|
u = int(line.split()[0], 16)
|
||
|
if u in glyphs:
|
||
|
for n in glyphs[u]:
|
||
|
table[n] = u
|
||
|
if do_small and is_small:
|
||
|
table[n+'.sc'] = u
|
||
|
if u >= 128:
|
||
|
table['uni%04X'%u] = u
|
||
|
if do_small and is_small:
|
||
|
table['uni%04X.sc'%u] = u
|
||
|
|
||
|
def load_ligs():
|
||
|
table['ff'] = 0xFB00
|
||
|
table['fi'] = 0xFB01
|
||
|
table['fl'] = 0xFB02
|
||
|
table['ffi'] = 0xFB03
|
||
|
table['ffl'] = 0xFB04
|
||
|
if do_small:
|
||
|
table['f_f.sc'] = 0xFB00
|
||
|
table['f_i.sc'] = 0xFB01
|
||
|
table['f_l.sc'] = 0xFB02
|
||
|
table['f_f_i.sc'] = 0xFB03
|
||
|
table['f_f_l.sc'] = 0xFB04
|
||
|
|
||
|
if len(sys.argv) < 2:
|
||
|
print('usage: python scripts/makesubset.py scripts/MES-2.TXT', file=sys.stderr)
|
||
|
else:
|
||
|
for input in sys.argv[1:]:
|
||
|
if input == '-sc':
|
||
|
do_small = True
|
||
|
elif input == '-lig':
|
||
|
load_ligs()
|
||
|
else:
|
||
|
load_table(input)
|
||
|
|
||
|
if len(sys.argv) > 2 and sys.argv[2] == '-scdump':
|
||
|
smcp = []
|
||
|
for n in list(table.keys()):
|
||
|
u = table[n]
|
||
|
if u > 0 and n.endswith('.sc') and not n.startswith('uni'):
|
||
|
smcp.append('{0x%04X, "%s"},' % (u,n))
|
||
|
smcp.sort()
|
||
|
print('\n\t'.join(smcp))
|
||
|
else:
|
||
|
list = list(table.keys())
|
||
|
list.sort()
|
||
|
print(','.join(list))
|