
Summary: Added stacked delimiter support for more delimiters. Split out delimiter functions into its own file, and split out some tree building functions into a common file. Supports the empty `.` delimiter with \left and \right, and doesn't try to produce huge /, \backslash, <, or > delimiters. Depends on D7844 Test input: \left( \left) \left[ \left\lbrack \left] \left\rbrack \left\{ \left\lbrace \left\} \left\rbrace \left\lfloor \left\rfloor \left\lceil \left\rceil \left\langle \left\rangle \left/ \left\backslash \left| \left\vert \left\| \left\Vert \left\uparrow \left\Uparrow \left\downarrow \left\Downarrow \left\updownarrow \left\Updownarrow {x^{x^{x^{x^{x^{x^{x^{x^{x^{x^x}}}}}}}}}} \right.\right.\right.\right.\right.\right.\right.\right.\right.\right. \right.\right.\right.\right.\right.\right.\right.\right.\right.\right. \right.\right.\right.\right.\right.\right.\right.\right. Test Plan: - Run the test input, see that it works - Run the tests, see that they work - Look at huxley screenshots (not here yet :( ) and make sure they look good Reviewers: alpert Reviewed By: alpert Differential Revision: http://phabricator.khanacademy.org/D11602
71 lines
1.8 KiB
Python
Executable File
71 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import collections
|
|
import json
|
|
import parse_tfm
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def find_font_path(font_name):
|
|
try:
|
|
font_path = subprocess.check_output(['kpsewhich', font_name])
|
|
except OSError:
|
|
raise RuntimeError("Couldn't find kpsewhich program, make sure you" +
|
|
" have TeX installed")
|
|
except subprocess.CalledProcessError:
|
|
raise RuntimeError("Couldn't find font metrics: '%s'" % font_name)
|
|
return font_path.strip()
|
|
|
|
|
|
def main():
|
|
mapping = json.load(sys.stdin)
|
|
|
|
fonts = [
|
|
'cmbsy10.tfm',
|
|
'cmbx10.tfm',
|
|
'cmex10.tfm',
|
|
'cmmi10.tfm',
|
|
'cmmib10.tfm',
|
|
'cmr10.tfm',
|
|
'cmsy10.tfm',
|
|
'cmti10.tfm',
|
|
'msam10.tfm',
|
|
'msbm10.tfm'
|
|
]
|
|
|
|
font_name_to_tfm = {}
|
|
|
|
for font_name in fonts:
|
|
font_basename = font_name.split('.')[0]
|
|
font_path = find_font_path(font_name)
|
|
font_name_to_tfm[font_basename] = parse_tfm.read_tfm_file(font_path)
|
|
|
|
families = collections.defaultdict(dict)
|
|
|
|
for family, chars in mapping.iteritems():
|
|
for char, char_data in chars.iteritems():
|
|
char_num = int(char)
|
|
|
|
font = char_data['font']
|
|
tex_char_num = int(char_data['char'])
|
|
yshift = float(char_data['yshift'])
|
|
|
|
tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num)
|
|
|
|
height = round(tfm_char.height + yshift / 1000.0, 5)
|
|
depth = round(tfm_char.depth - yshift / 1000.0, 5)
|
|
italic = round(tfm_char.italic_correction, 5)
|
|
|
|
families[family][char_num] = {
|
|
'height': height,
|
|
'depth': depth,
|
|
'italic': italic
|
|
}
|
|
|
|
sys.stdout.write(
|
|
json.dumps(families, separators=(',', ':'), sort_keys=True))
|
|
|
|
if __name__ == '__main__':
|
|
main()
|