Files
forked-Hershey-TTF/ocxparser.py
2020-02-10 21:26:57 -03:00

62 lines
1.7 KiB
Python

import os
import re
from dataclasses import Glyph
offset = ord('R')
def generate_glyphs():
"""Translates the .ocX files to a dictionary containing every glyph's information.
The file extension begins with .oc1 and goes up to .oc4.
Returns a dictionary where the key is the Hershey number and the value is the glyph information.
"""
print('\nReading .ocX files')
folder = 'modsources'
result = {}
for filename in os.listdir(folder):
if not (re.match(r'.+\.oc\d', filename)):
continue
with open(os.path.join(folder, filename)) as file:
print(f'Reading {filename}')
for line in _iterate_file(file):
glyph = _generate_glyph(line)
result[glyph.number] = glyph
return result
def _iterate_file(file):
# Some glyphs use more than one line.
# Buffer the lines until the next glyph begins
glyph = []
for line in file:
# Each glyph begins with a number left padded with spaces
if re.match(r'^[ \d]{5}', line) and glyph:
# Last glyph finished. Yield it.
yield _remove_line_breaks(''.join(glyph))
glyph = []
glyph.append(line)
def _remove_line_breaks(string):
return string.replace('\n', '').replace('\r', '')
def _generate_glyph(line):
number = int(line[0:5].strip())
start = ord(line[8]) - offset
end = ord(line[9]) - offset
coordinates = []
for x, y in zip(line[10::2], line[11::2]):
if x == ' ' and y == 'R':
# Space + R is a pen up operation
coordinates.append(None)
else:
coordinates.append((ord(x) - offset, ord(y) - offset))
return Glyph(number, start, end, coordinates)