forked from enviPath/enviPy
103 lines
2.5 KiB
JavaScript
103 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
var path = require('path');
|
|
var Stream = require('readable-stream');
|
|
var gutil = require('gulp-util');
|
|
var BufferStreams = require('bufferstreams');
|
|
var ttf2woff = require('ttf2woff');
|
|
|
|
var PLUGIN_NAME = 'gulp-ttf2woff';
|
|
|
|
// File level transform function
|
|
function ttf2woffTransform(opt) {
|
|
// Return a callback function handling the buffered content
|
|
return function(err, buf, cb) {
|
|
|
|
// Handle any error
|
|
if(err) {
|
|
cb(new gutil.PluginError(PLUGIN_NAME, err, {showStack: true}));
|
|
}
|
|
|
|
// Use the buffered content
|
|
try {
|
|
buf = new Buffer(ttf2woff(new Uint8Array(buf)).buffer);
|
|
cb(null, buf);
|
|
} catch(err2) {
|
|
cb(new gutil.PluginError(PLUGIN_NAME, err2, {showStack: true}));
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
// Plugin function
|
|
function ttf2woffGulp(options) {
|
|
|
|
options = options || {};
|
|
options.ignoreExt = options.ignoreExt || false;
|
|
options.clone = options.clone || false;
|
|
|
|
var stream = new Stream.Transform({objectMode: true});
|
|
|
|
stream._transform = function(file, unused, done) {
|
|
// When null just pass through
|
|
if(file.isNull()) {
|
|
stream.push(file); done();
|
|
return;
|
|
}
|
|
|
|
// If the ext doesn't match, pass it through
|
|
if((!options.ignoreExt) && '.ttf' !== path.extname(file.path)) {
|
|
stream.push(file); done();
|
|
return;
|
|
}
|
|
|
|
// Fix for the vinyl clone method...
|
|
// https://github.com/wearefractal/vinyl/pull/9
|
|
if(options.clone) {
|
|
if(file.isBuffer()) {
|
|
stream.push(file.clone());
|
|
} else {
|
|
var cntStream = file.contents;
|
|
file.contents = null;
|
|
var newFile = file.clone();
|
|
file.contents = cntStream.pipe(new Stream.PassThrough());
|
|
newFile.contents = cntStream.pipe(new Stream.PassThrough());
|
|
stream.push(newFile);
|
|
}
|
|
}
|
|
|
|
file.path = gutil.replaceExtension(file.path, ".woff");
|
|
|
|
// Buffers
|
|
if(file.isBuffer()) {
|
|
try {
|
|
file.contents = new Buffer(ttf2woff(
|
|
new Uint8Array(file.contents)
|
|
).buffer);
|
|
} catch(err) {
|
|
stream.emit('error', new gutil.PluginError(PLUGIN_NAME, err, {
|
|
showStack: true
|
|
}));
|
|
}
|
|
|
|
// Streams
|
|
} else {
|
|
file.contents = file.contents.pipe(new BufferStreams(ttf2woffTransform()));
|
|
}
|
|
|
|
stream.push(file);
|
|
done();
|
|
|
|
};
|
|
|
|
return stream;
|
|
|
|
}
|
|
|
|
// Export the file level transform function for other plugins usage
|
|
ttf2woffGulp.fileTransform = ttf2woffTransform;
|
|
|
|
// Export the plugin main function
|
|
module.exports = ttf2woffGulp;
|
|
|