diff options
Diffstat (limited to 'bin/otb1cli.py')
-rw-r--r-- | bin/otb1cli.py | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/bin/otb1cli.py b/bin/otb1cli.py new file mode 100644 index 000000000000..92ab07b937db --- /dev/null +++ b/bin/otb1cli.py @@ -0,0 +1,99 @@ +# +# Copyright (C) 2018-2020 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +from datetime import datetime, timezone + +import fnutil +import fncli +import fnio +import otb1exp + +# -- Params -- +class Params(otb1exp.Params): + def __init__(self): + otb1exp.Params.__init__(self) + self.output_name = None + self.real_time = True + + +# -- Options -- +HELP = ('' + + 'usage: otb1cli [options] [INPUT]\n' + + 'Convert a BDF font to OTB\n' + + '\n' + + ' -o OUTPUT output file (default = stdout, may not be a terminal)\n' + + ' -d DIR-HINT set font direction hint (default = 0)\n' + + ' -e EM-SIZE set em size (default = 1024)\n' + + ' -g LINE-GAP set line gap (default = 0)\n' + + ' -l LOW-PPEM set lowest recorded PPEM (default = font height)\n' + + ' -E ENCODING BDF string properties encoding (default = utf-8)\n' + + ' -W WLANG-ID set Windows name-s language ID (default = 0x0409)\n' + + ' -T use the current date and time for created/modified\n' + + ' (default = get them from INPUT if not stdin/terminal)\n' + + ' -X set xMaxExtent = 0 (default = max character width)\n' + + ' -L write a single loca entry (default = CHARS entries)\n' + + ' -P write PostScript glyph names (default = no names)\n' + + '\n' + + 'Notes:\n' + + ' The input must be a BDF 2.1 font with unicode encoding.\n' + + ' All bitmaps are expanded first. Bitmap widths are used.\n' + + ' Overlapping characters are not supported.\n') + +VERSION = 'otb1cli 0.24, Copyright (C) 2018-2020 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE + +class Options(otb1exp.Options): + def __init__(self): + otb1exp.Options.__init__(self, ['-o'], HELP, VERSION) + + + def parse(self, name, value, params): + if name == '-o': + params.output_name = value + elif name == '-T': + params.real_time = False + else: + otb1exp.Options.parse(self, name, value, params) + + +# -- Main -- +def main_program(nonopt, parsed): + if len(nonopt) > 1: + raise Exception('invalid number of arguments, try --help') + + # READ INPUT + def read_otb(ifs): + if parsed.real_time: + try: + stat = ifs.fstat() + if stat: + parsed.created = datetime.fromtimestamp(stat.st_ctime, timezone.utc) + parsed.modified = datetime.fromtimestamp(stat.st_mtime, timezone.utc) + except Exception as ex: + fnutil.warning(ifs.location(), str(ex)) + + return otb1exp.Font.read(ifs, parsed) + + font = fnio.read_file(nonopt[0] if nonopt else None, read_otb) + + # WRITE OUTPUT + sfnt = otb1exp.SFNT(font) + fnio.write_file(parsed.output_name, lambda ofs: ofs.write(sfnt.data), encoding=None) + + +if __name__ == '__main__': + fncli.start('otb1cli.py', Options(), Params(), main_program) |