145 lines
4.2 KiB
JavaScript
145 lines
4.2 KiB
JavaScript
|
|
var fs = require('fs'),
|
|
Handlebars = require('./index'),
|
|
basename = require('path').basename,
|
|
uglify = require('uglify-js');
|
|
|
|
module.exports.cli = function(opts) {
|
|
if (opts.version) {
|
|
console.log(Handlebars.VERSION);
|
|
return;
|
|
}
|
|
|
|
var template = [0];
|
|
if (!opts.templates.length) {
|
|
throw new Handlebars.Exception('Must define at least one template or directory.');
|
|
}
|
|
|
|
opts.templates.forEach(function(template) {
|
|
try {
|
|
fs.statSync(template);
|
|
} catch (err) {
|
|
throw new Handlebars.Exception('Unable to open template file "' + template + '"');
|
|
}
|
|
});
|
|
|
|
if (opts.simple && opts.min) {
|
|
throw new Handlebars.Exception('Unable to minimze simple output');
|
|
}
|
|
if (opts.simple && (opts.templates.length !== 1 || fs.statSync(opts.templates[0]).isDirectory())) {
|
|
throw new Handlebars.Exception('Unable to output multiple templates in simple mode');
|
|
}
|
|
|
|
// Convert the known list into a hash
|
|
var known = {};
|
|
if (opts.known && !Array.isArray(opts.known)) {
|
|
opts.known = [opts.known];
|
|
}
|
|
if (opts.known) {
|
|
for (var i = 0, len = opts.known.length; i < len; i++) {
|
|
known[opts.known[i]] = true;
|
|
}
|
|
}
|
|
|
|
// Build file extension pattern
|
|
var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; });
|
|
extension = new RegExp('\\.' + extension + '$');
|
|
|
|
var output = [];
|
|
if (!opts.simple) {
|
|
if (opts.amd) {
|
|
output.push('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];');
|
|
} else if (opts.commonjs) {
|
|
output.push('var Handlebars = require("' + opts.commonjs + '");');
|
|
} else {
|
|
output.push('(function() {\n');
|
|
}
|
|
output.push(' var template = Handlebars.template, templates = ');
|
|
output.push(opts.namespace);
|
|
output.push(' = ');
|
|
output.push(opts.namespace);
|
|
output.push(' || {};\n');
|
|
}
|
|
function processTemplate(template, root) {
|
|
var path = template,
|
|
stat = fs.statSync(path);
|
|
if (stat.isDirectory()) {
|
|
fs.readdirSync(template).map(function(file) {
|
|
var path = template + '/' + file;
|
|
|
|
if (extension.test(path) || fs.statSync(path).isDirectory()) {
|
|
processTemplate(path, root || template);
|
|
}
|
|
});
|
|
} else {
|
|
var data = fs.readFileSync(path, 'utf8');
|
|
|
|
if (opts.bom && data.indexOf('\uFEFF') === 0) {
|
|
data = data.substring(1);
|
|
}
|
|
|
|
var options = {
|
|
knownHelpers: known,
|
|
knownHelpersOnly: opts.o
|
|
};
|
|
|
|
if (opts.data) {
|
|
options.data = true;
|
|
}
|
|
|
|
// Clean the template name
|
|
if (!root) {
|
|
template = basename(template);
|
|
} else if (template.indexOf(root) === 0) {
|
|
template = template.substring(root.length+1);
|
|
}
|
|
template = template.replace(extension, '');
|
|
|
|
if (opts.simple) {
|
|
output.push(Handlebars.precompile(data, options) + '\n');
|
|
} else if (opts.partial) {
|
|
if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {
|
|
output.push('return ');
|
|
}
|
|
output.push('Handlebars.partials[\'' + template + '\'] = template(' + Handlebars.precompile(data, options) + ');\n');
|
|
} else {
|
|
if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {
|
|
output.push('return ');
|
|
}
|
|
output.push('templates[\'' + template + '\'] = template(' + Handlebars.precompile(data, options) + ');\n');
|
|
}
|
|
}
|
|
}
|
|
|
|
opts.templates.forEach(function(template) {
|
|
processTemplate(template, opts.root);
|
|
});
|
|
|
|
// Output the content
|
|
if (!opts.simple) {
|
|
if (opts.amd) {
|
|
if(opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) {
|
|
if(opts.partial){
|
|
output.push('return Handlebars.partials;\n');
|
|
} else {
|
|
output.push('return templates;\n');
|
|
}
|
|
}
|
|
output.push('});');
|
|
} else if (!opts.commonjs) {
|
|
output.push('})();');
|
|
}
|
|
}
|
|
output = output.join('');
|
|
|
|
if (opts.min) {
|
|
output = uglify.minify(output, {fromString: true}).code;
|
|
}
|
|
|
|
if (opts.output) {
|
|
fs.writeFileSync(opts.output, output, 'utf8');
|
|
} else {
|
|
console.log(output);
|
|
}
|
|
};
|