@sctg/fontminify
Version:
Minify font seamlessly, font subsetter, webfont (eot, woff, svg) converter.
152 lines (151 loc) • 4.2 kB
JavaScript
#!/usr/bin/env node
/**
* @file cli
* @author junmer eltorio
*/
/* eslint-env node */
'use strict';
import fs from 'fs';
import meow from 'meow';
import path from 'path';
import stdin from 'get-stdin';
import Fontmin from './index.js';
import _ from 'lodash';
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const isDist = (__dirname.match(/([^\/]*)*$/) || ['', ''])[1] === 'dist';
let { version } = JSON.parse(fs.readFileSync(new URL(path.join(__dirname, (isDist ? '..' : '') + "/package.json"), import.meta.url)).toString());
const cli = meow([
'Usage',
' $ fontmin <file> [<output>]',
' $ fontmin <directory> [<output>]',
' $ fontmin <file> > <output>',
' $ cat <file> | fontmin > <output>',
'',
'Example',
' $ fontmin fonts/* build',
' $ fontmin fonts build',
' $ fontmin foo.ttf > foo-optimized.ttf',
' $ cat foo.ttf | fontmin > foo-optimized.ttf',
'',
'Options',
' -t, --text require glyphs by text',
' -b, --basic-text require glyphs with base chars',
' -d, --deflate-woff deflate woff',
' --font-family font-family for @font-face CSS',
' --css-glyph generate class for each glyf. default = false',
' -T, --show-time show time fontmin cost'
].join('\n'), {
importMeta: import.meta,
flags: {
version: {
type: 'boolean',
alias: 'v'
},
deflateWoff: {
type: 'boolean',
alias: 'd'
},
help: {
type: 'boolean',
alias: 'h'
},
text: {
type: 'string',
alias: 't'
},
showTime: {
type: 'boolean',
alias: 'T'
},
cssGlyph: {
type: 'boolean',
},
basicText: {
type: 'boolean',
alias: 'b'
},
fontFamily: {
type: 'string'
}
}
});
// version
if (cli.flags.version) {
console.log(version);
process.exit(0);
}
function isFile(path) {
if (/^[^\s]+\.\w*$/.test(path)) {
return true;
}
try {
return fs.statSync(path).isFile();
}
catch (err) {
return false;
}
}
function run(src, dest) {
cli.flags.showTime && console.time('fontmin use');
const pluginOpts = _.extend({}, cli.flags, {
deflate: cli.flags.deflateWoff,
glyph: cli.flags.cssGlyph
});
const fontmin = new Fontmin()
.src(src)
.use(Fontmin.otf2ttf(pluginOpts))
.use(Fontmin.glyph(pluginOpts))
.use(Fontmin.ttf2eot(pluginOpts))
.use(Fontmin.ttf2svg(pluginOpts))
.use(Fontmin.ttf2woff(pluginOpts))
.use(Fontmin.ttf2woff2(pluginOpts))
.use(Fontmin.css(pluginOpts));
if (process.stdout.isTTY) {
fontmin.dest(dest ? dest : 'build');
}
fontmin.run((err, files) => {
if (err) {
console.error(err.stack || err);
process.exit(1);
}
if (!process.stdout.isTTY) {
files.forEach(file => {
process.stdout.write(file.contents);
});
}
cli.flags.showTime && console.timeEnd('fontmin use');
});
}
if (true) {
let src = cli.input;
let dest;
if (!cli.input.length) {
console.error([
'Provide at least one file to optimize',
'',
'Example',
' fontmin font/* build',
' fontmin foo.ttf > foo-optimized.ttf',
' cat foo.ttf | fontmin > foo-optimized.ttf',
'',
'See `fontmin --help` for more information.'
].join('\n'));
process.exit(1);
}
if (src.length > 1 && !isFile(src[src.length - 1])) {
dest = src[src.length - 1];
src.pop();
}
src = src.map(s => {
if (!isFile(s) && fs.existsSync(s)) {
return path.join(s, '**/*');
}
return s;
});
run(src, dest);
}
else {
stdin.buffer();
}