This repository provides User Manual for setting up a Docker environment tailored for testing DGTD code.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
4.4 KiB

8 months ago
#!/usr/bin/env python
# Copyright (c) 2006-2021 Andrey Golovizin
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
Make a table of character widths to use with bibtex width$ function.
"""
from __future__ import print_function, unicode_literals
import six
def make_table(font_filename, output):
import sys
from datetime import datetime
from freetype import Face
from pprint import pformat
font_face = Face(font_filename)
date = datetime.now().strftime('%Y-%m-%d')
cmd = ' '.join(sys.argv)
charwidths = extract_widths(font_face)
print('# vim:fileencoding=utf8', file=output)
print(file=output)
print('# GENERATED FILE - DO NOT EDIT.', file=output)
print('# Generated by {0}'.format(cmd), file=output)
print('# Date: {0}'.format(date), file=output)
print('# Font family: {0}'.format(font_face.family_name), file=output)
print('# Font style: {0}'.format(font_face.style_name), file=output)
print('# Font version: {0}'.format(get_font_version(font_face)), file=output)
print(file=output)
print('charwidths = {0}'.format(pformat(charwidths)), file=output)
def get_font_version(font_face):
from freetype import TT_NAME_ID_VERSION_STRING
for i in range(font_face.sfnt_name_count):
name = font_face.get_sfnt_name(i)
if name.name_id == TT_NAME_ID_VERSION_STRING:
return name.string
return 'unknown'
def extract_widths(font_face):
widths = dict(iter_charwidths(font_face))
widths.update(bibtex_widths)
return widths
def iter_charwidths(font_face):
from freetype import FT_LOAD_NO_SCALE
font_face.set_char_size(10*64)
charcode, gindex = font_face.get_first_char()
while gindex:
font_face.load_glyph(gindex, FT_LOAD_NO_SCALE)
yield six.unichr(charcode), font_face.glyph.metrics.horiAdvance
charcode, gindex = font_face.get_next_char(charcode, gindex)
bibtex_widths = {
' ': 278,
'!': 278,
'"': 500,
'#': 833,
'$': 500,
'%': 833,
'&': 778,
"'": 278,
'(': 389,
')': 389,
'*': 500,
'+': 778,
',': 278,
'-': 333,
'.': 278,
'/': 500,
'0': 500,
'1': 500,
'2': 500,
'3': 500,
'4': 500,
'5': 500,
'6': 500,
'7': 500,
'8': 500,
'9': 500,
':': 278,
';': 278,
'<': 278,
'=': 778,
'>': 472,
'?': 472,
'@': 778,
'A': 750,
'B': 708,
'C': 722,
'D': 764,
'E': 681,
'F': 653,
'G': 785,
'H': 750,
'I': 361,
'J': 514,
'K': 778,
'L': 625,
'M': 917,
'N': 750,
'O': 778,
'P': 681,
'Q': 778,
'R': 736,
'S': 556,
'T': 722,
'U': 750,
'V': 750,
'W': 1028,
'X': 750,
'Y': 750,
'Z': 611,
'[': 278,
'\\': 500,
']': 278,
'^': 500,
'_': 278,
'`': 278,
'a': 500,
'b': 556,
'c': 444,
'd': 556,
'e': 444,
'f': 306,
'g': 500,
'h': 556,
'i': 278,
'j': 306,
'k': 528,
'l': 278,
'm': 833,
'n': 556,
'o': 500,
'p': 556,
'q': 528,
'r': 392,
's': 394,
't': 389,
'u': 556,
'v': 528,
'w': 722,
'x': 528,
'y': 528,
'z': 444,
'{': 500,
'|': 1000,
'}': 500,
'~': 500,
}
if __name__ == '__main__':
import sys
if len(sys.argv) != 2:
print('Usage: {0} `kpsewhich cmunrm.otf`'.format(sys.argv[0]), file=sys.stderr)
sys.exit(1)
make_table(sys.argv[1], sys.stdout)