aboutsummaryrefslogtreecommitdiff
path: root/bin/otb1cli.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/otb1cli.js')
-rw-r--r--bin/otb1cli.js129
1 files changed, 129 insertions, 0 deletions
diff --git a/bin/otb1cli.js b/bin/otb1cli.js
new file mode 100644
index 000000000000..bc96d6fd91f4
--- /dev/null
+++ b/bin/otb1cli.js
@@ -0,0 +1,129 @@
+/*
+ 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.
+*/
+
+'use strict';
+
+const fnutil = require('./fnutil.js');
+const fncli = require('./fncli.js');
+const fnio = require('./fnio.js');
+const otb1exp = require('./otb1exp.js');
+
+// -- Params --
+class Params extends otb1exp.Params {
+ constructor() {
+ super();
+ this.output = null;
+ this.encoding = 'utf-8';
+ this.realTime = true;
+ }
+}
+
+// -- Options --
+const 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');
+
+const VERSION = 'otb1cli 0.22, Copyright (C) 2018-2020 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE;
+
+class Options extends otb1exp.Options {
+ constructor() {
+ super(['-o', '-E'], HELP, VERSION);
+ }
+
+ parse(name, value, params) {
+ switch (name) {
+ case '-o':
+ params.output = value;
+ break;
+ case '-E':
+ params.encoding = value;
+ break;
+ case '-T':
+ params.realTime = false;
+ break;
+ default:
+ super.parse(name, value, params);
+ }
+ }
+}
+
+// -- Main --
+function mainProgram(nonopt, parsed) {
+ if (nonopt.length > 1) {
+ throw new Error('invalid number of arguments, try --help');
+ }
+
+ // READ INPUT
+ let ifs = new fnio.InputFileStream(nonopt[0], parsed.encoding);
+
+ try {
+ if (parsed.realTime) {
+ try {
+ const stat = ifs.fstat();
+
+ if (stat != null) {
+ parsed.created = stat.birthtime;
+ parsed.modified = stat.mtime;
+ }
+ } catch (e) {
+ fnutil.warning(ifs.location(), e.message);
+ }
+ }
+
+ var font = otb1exp.Font.read(ifs, parsed);
+ ifs.close();
+ } catch (e) {
+ e.message = ifs.location() + e.message;
+ throw e;
+ }
+
+ // WRITE OUTPUT
+ let ofs = new fnio.OutputFileStream(parsed.output, null);
+
+ try {
+ const table = new otb1exp.SFNT(font);
+
+ ofs.write(table.data.slice(0, table.size));
+ ofs.close();
+ } catch (e) {
+ e.message = ofs.location() + e.message + ofs.destroy();
+ throw e;
+ }
+}
+
+if (require.main === module) {
+ fncli.start('otb1cli.js', new Options(), new Params(), mainProgram);
+}