170 lines
3.1 KiB
JavaScript
170 lines
3.1 KiB
JavaScript
/**
|
|
* @file fontmin
|
|
* @author junmer
|
|
*/
|
|
|
|
/* eslint-env node */
|
|
|
|
var combine = require('stream-combiner');
|
|
var concat = require('concat-stream');
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var inherits = require('util').inherits;
|
|
var bufferToVinyl = require('buffer-to-vinyl');
|
|
var vfs = require('vinyl-fs');
|
|
|
|
/**
|
|
* Initialize Fontmin
|
|
*
|
|
* @constructor
|
|
* @api public
|
|
*/
|
|
function Fontmin() {
|
|
if (!(this instanceof Fontmin)) {
|
|
return new Fontmin();
|
|
}
|
|
|
|
EventEmitter.call(this);
|
|
this.streams = [];
|
|
}
|
|
|
|
/**
|
|
* Inherit from `EventEmitter`
|
|
* @type {Class}
|
|
*/
|
|
inherits(Fontmin, EventEmitter);
|
|
|
|
/**
|
|
* Get or set the source files
|
|
*
|
|
* @param {Array|Buffer|string} file files to be optimized
|
|
* @return {Object} fontmin
|
|
* @api public
|
|
*/
|
|
Fontmin.prototype.src = function (file) {
|
|
if (!arguments.length) {
|
|
return this._src;
|
|
}
|
|
|
|
this._src = arguments;
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Get or set the destination folder
|
|
*
|
|
* @param {string} dir folder to written
|
|
* @return {Object} fontmin
|
|
* @api public
|
|
*/
|
|
Fontmin.prototype.dest = function (dir) {
|
|
if (!arguments.length) {
|
|
return this._dest;
|
|
}
|
|
|
|
this._dest = arguments;
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Add a plugin to the middleware stack
|
|
*
|
|
* @param {Function} plugin plugin
|
|
* @return {Object} fontmin
|
|
* @api public
|
|
*/
|
|
Fontmin.prototype.use = function (plugin) {
|
|
this.streams.push(typeof plugin === 'function' ? plugin() : plugin);
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Optimize files
|
|
*
|
|
* @param {Function} cb callback
|
|
* @return {Stream} file stream
|
|
* @api public
|
|
*/
|
|
Fontmin.prototype.run = function (cb) {
|
|
cb = cb || function () {};
|
|
|
|
var stream = this.createStream();
|
|
|
|
stream.on('error', cb);
|
|
stream.pipe(concat(cb.bind(null, null)));
|
|
|
|
return stream;
|
|
};
|
|
|
|
/**
|
|
* Create stream
|
|
*
|
|
* @return {Stream} file stream
|
|
* @api private
|
|
*/
|
|
Fontmin.prototype.createStream = function () {
|
|
this.streams.unshift(this.getFiles());
|
|
|
|
if (this.streams.length === 1) {
|
|
this.use(Fontmin.otf2ttf());
|
|
this.use(Fontmin.ttf2eot());
|
|
this.use(Fontmin.ttf2woff());
|
|
this.use(Fontmin.ttf2woff2());
|
|
this.use(Fontmin.ttf2svg());
|
|
this.use(Fontmin.css());
|
|
}
|
|
|
|
if (this.dest()) {
|
|
this.streams.push(
|
|
vfs.dest.apply(vfs, this.dest())
|
|
);
|
|
}
|
|
|
|
return combine(this.streams);
|
|
};
|
|
|
|
/**
|
|
* Get files
|
|
*
|
|
* @return {Stream} file stream
|
|
* @api private
|
|
*/
|
|
Fontmin.prototype.getFiles = function () {
|
|
|
|
if (Buffer.isBuffer(this._src[0])) {
|
|
return bufferToVinyl.stream(this._src[0]);
|
|
}
|
|
|
|
return vfs.src.apply(vfs, this.src());
|
|
};
|
|
|
|
/**
|
|
* plugins
|
|
*
|
|
* @type {Array}
|
|
*/
|
|
Fontmin.plugins = [
|
|
'glyph',
|
|
'ttf2eot',
|
|
'ttf2woff',
|
|
'ttf2woff2',
|
|
'ttf2svg',
|
|
'css',
|
|
'svg2ttf',
|
|
'svgs2ttf',
|
|
'otf2ttf'
|
|
];
|
|
|
|
// export pkged plugins
|
|
Fontmin.plugins.forEach(function (plugin) {
|
|
Fontmin[plugin] = require('./plugins/' + plugin);
|
|
});
|
|
|
|
/**
|
|
* Module exports
|
|
*/
|
|
module.exports = Fontmin;
|
|
|
|
// exports util, mime
|
|
module.exports.util = exports.util = require('./lib/util');
|
|
module.exports.mime = exports.mime = require('./lib/mime-types');
|