@sctg/fontminify
Version:
Minify font seamlessly, font subsetter, webfont (eot, woff, svg) converter.
73 lines (72 loc) • 1.78 kB
JavaScript
/**
* @file ttf2woff
* @author junmer eltorio
*/
/* eslint-env node */
import isTtf from 'is-ttf';
import through from 'through2';
import fe from 'fonteditor-core';
import { b2ab } from 'b3b';
import { ab2b } from 'b3b';
import replaceExt from 'replace-ext';
import { deflate } from 'pako';
import _ from 'lodash';
const ttf2woff = fe.ttf2woff;
function compileTtf(buffer, options, cb) {
let output;
const ttf2woffOpts = {};
if (options.deflate) {
ttf2woffOpts.deflate = input => {
return deflate(Uint8Array.from(input));
};
}
try {
output = ab2b(
// fix: have problem in some android device, close deflate
ttf2woff(b2ab(buffer), ttf2woffOpts));
}
catch (ex) {
cb(ex);
}
output && cb(null, output);
}
/**
* ttf2woff fontmin plugin
* @api public
*/
export default (_opts) => {
const opts = _.extend({ clone: true }, _opts);
return through.ctor({
objectMode: true
}, function (file, enc, cb) {
// check null
if (file.isNull()) {
cb(null, file);
return;
}
// check stream
if (file.isStream()) {
cb(new Error('Streaming is not supported'));
return;
}
// check ttf
if (!isTtf(file.contents)) {
cb(null, file);
return;
}
// clone
if (opts.clone) {
this.push(file.clone(false));
}
// replace ext
file.path = replaceExt(file.path, '.woff');
compileTtf(file.contents, opts, (err, buffer) => {
if (err) {
cb(err);
return;
}
file.contents = buffer;
cb(null, file);
});
});
};