ShenNong/packages/字体精简工具/node_modules/fontmin/index.js
2024-06-21 18:44:06 +08:00

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');