forked from enviPath/enviPy
139 lines
2.6 KiB
JavaScript
139 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
var assign = require('object-assign');
|
|
var columns = require('cli-columns');
|
|
var gutil = require('gulp-util');
|
|
var handlebars = require('handlebars');
|
|
var handlebarsWax = require('handlebars-wax');
|
|
var through = require('through2');
|
|
|
|
function logKeys(file, pairs) {
|
|
var buf = [];
|
|
var options = {
|
|
width: process.stdout.columns - 12
|
|
};
|
|
|
|
pairs.forEach(function (pair) {
|
|
var key = pair[0];
|
|
var value = pair[1] || '';
|
|
|
|
if (typeof value !== 'string') {
|
|
value = columns(Object.keys(value), options);
|
|
}
|
|
|
|
buf.push(gutil.colors.grey(' ' + key + ':'));
|
|
buf.push(value.replace(/^/gm, ' '));
|
|
});
|
|
|
|
console.log(' ' + gutil.colors.green(file.relative));
|
|
console.log(buf.join('\n'));
|
|
console.log();
|
|
}
|
|
|
|
function gulpHb(options) {
|
|
var defaults = {
|
|
debug: 0
|
|
};
|
|
|
|
options = assign(defaults, options);
|
|
|
|
var debug = Number(options.debug) || 0;
|
|
|
|
// set { debug: 1 } to output gulp-hb info
|
|
// set { debug: 2 } to output node-glob info
|
|
options.debug = debug >= 2;
|
|
|
|
// Handlebars
|
|
|
|
var hb = options.handlebars || gulpHb.handlebars.create();
|
|
var wax = handlebarsWax(hb, options);
|
|
|
|
if (options.partials) {
|
|
wax.partials(options.partials);
|
|
}
|
|
|
|
if (options.helpers) {
|
|
wax.helpers(options.helpers);
|
|
}
|
|
|
|
if (options.decorators) {
|
|
wax.decorators(options.decorators);
|
|
}
|
|
|
|
if (options.data) {
|
|
wax.data(options.data);
|
|
}
|
|
|
|
// Stream
|
|
|
|
var stream = through.obj(function (file, enc, cb) {
|
|
if (file.isNull()) {
|
|
cb(null, file);
|
|
return;
|
|
}
|
|
|
|
if (file.isStream()) {
|
|
cb(new gutil.PluginError('gulp-hb', 'Streaming not supported.'));
|
|
return;
|
|
}
|
|
|
|
try {
|
|
var data = assign({}, file.data);
|
|
var template = wax.compile(file.contents.toString());
|
|
|
|
if (debug) {
|
|
logKeys(file, [
|
|
['context', wax.context],
|
|
['data', data],
|
|
['decorators', hb.decorators],
|
|
['helpers', hb.helpers],
|
|
['partials', hb.partials]
|
|
]);
|
|
}
|
|
|
|
file.contents = new Buffer(template(data, {
|
|
data: {
|
|
file: file
|
|
}
|
|
}));
|
|
|
|
this.push(file);
|
|
} catch (err) {
|
|
this.emit('error', new gutil.PluginError('gulp-hb', err, {
|
|
file: file,
|
|
fileName: file.path,
|
|
showStack: true
|
|
}));
|
|
}
|
|
|
|
cb();
|
|
});
|
|
|
|
// Proxy
|
|
|
|
stream.partials = function () {
|
|
wax.partials.apply(wax, arguments);
|
|
return stream;
|
|
};
|
|
|
|
stream.helpers = function () {
|
|
wax.helpers.apply(wax, arguments);
|
|
return stream;
|
|
};
|
|
|
|
stream.decorators = function () {
|
|
wax.decorators.apply(wax, arguments);
|
|
return stream;
|
|
};
|
|
|
|
stream.data = function () {
|
|
wax.data.apply(wax, arguments);
|
|
return stream;
|
|
};
|
|
|
|
return stream;
|
|
}
|
|
|
|
module.exports = gulpHb;
|
|
module.exports.handlebars = handlebars;
|