kopia lustrzana https://github.com/inkstitch/inkstitch
77 wiersze
3.3 KiB
Python
77 wiersze
3.3 KiB
Python
import json
|
|
import os
|
|
import sys
|
|
|
|
from inkex import Boolean
|
|
|
|
from ..i18n import _
|
|
from ..lettering.kerning import FontKerning
|
|
from .base import InkstitchExtension
|
|
|
|
|
|
class LetteringGenerateJson(InkstitchExtension):
|
|
'''
|
|
This extension helps font creators to generate the json file for the lettering tool
|
|
'''
|
|
def __init__(self, *args, **kwargs):
|
|
InkstitchExtension.__init__(self, *args, **kwargs)
|
|
self.arg_parser.add_argument("-n", "--font-name", type=str, default="Font", dest="font_name")
|
|
self.arg_parser.add_argument("-d", "--font-description", type=str, default="Description", dest="font_description")
|
|
self.arg_parser.add_argument("-s", "--auto-satin", type=Boolean, default="true", dest="auto_satin")
|
|
self.arg_parser.add_argument("-r", "--reversible", type=Boolean, default="true", dest="reversible")
|
|
self.arg_parser.add_argument("-g", "--default-glyph", type=str, default="", dest="default_glyph")
|
|
self.arg_parser.add_argument("-i", "--min-scale", type=float, default=1, dest="min_scale")
|
|
self.arg_parser.add_argument("-a", "--max-scale", type=float, default=1, dest="max_scale")
|
|
self.arg_parser.add_argument("-l", "--leading", type=int, default=0, dest="leading")
|
|
self.arg_parser.add_argument("-p", "--font-file", type=str, default="", dest="path")
|
|
|
|
def effect(self):
|
|
# file paths
|
|
path = self.options.path
|
|
if not os.path.isfile(path):
|
|
print(_("Please specify a font file."), file=sys.stderr)
|
|
return
|
|
output_path = os.path.join(os.path.dirname(path), 'font.json')
|
|
|
|
# kerning
|
|
kerning = FontKerning(path)
|
|
|
|
horiz_adv_x = kerning.horiz_adv_x()
|
|
hkern = kerning.hkern()
|
|
word_spacing = kerning.word_spacing()
|
|
letter_spacing = kerning.letter_spacing()
|
|
units_per_em = kerning.units_per_em()
|
|
# missing_glyph_spacing = kerning.missing_glyph_spacing()
|
|
|
|
# if letter spacing returns 0, it hasn't been specified in the font file
|
|
# Ink/Stitch will calculate the width of each letter automatically
|
|
if letter_spacing == 0:
|
|
letter_spacing = None
|
|
|
|
# if leading (line height) is set to 0, the font author wants Ink/Stitch to use units_per_em
|
|
# if units_per_em is not defined in the font file a default value will be returned
|
|
if self.options.leading == 0:
|
|
leading = units_per_em
|
|
else:
|
|
leading = self.options.leading
|
|
|
|
# collect data
|
|
data = {'name': self.options.font_name,
|
|
'description': self.options.font_description,
|
|
'leading': leading,
|
|
'auto_satin': self.options.auto_satin,
|
|
'reversible': self.options.reversible,
|
|
'default_glyph': self.options.default_glyph,
|
|
'min_scale': self.options.min_scale,
|
|
'max_scale': self.options.max_scale,
|
|
'horiz_adv_x_default': letter_spacing,
|
|
'horiz_adv_x_space': word_spacing,
|
|
'units_per_em': units_per_em,
|
|
'horiz_adv_x': horiz_adv_x,
|
|
'kerning_pairs': hkern
|
|
}
|
|
|
|
# write data to font.json into the same directory as the font file
|
|
with open(output_path, 'w', encoding="utf8") as font_data:
|
|
json.dump(data, font_data, indent=4, ensure_ascii=False)
|