mailtrain/tasks/jsxgettext.js
2017-03-04 18:15:16 +02:00

122 lines
3.7 KiB
JavaScript

/*
Original from https://raw.githubusercontent.com/Mindflash/grunt-jsxgettext/master/lib/index.js
License: ISC
*/
/* eslint-disable */
'use strict';
let _ = require('lodash');
let path = require('path');
let util = require('util');
let jsxgettext = require('jsxgettext-andris');
let fs = require('fs');
let async = require('async');
/*
options: {
files: ['file-path','file-path'],
+ jsxgettext options
}
*/
let task = function (grunt, options, cb) {
var generators = {
'.ejs': jsxgettext.generateFromEJS,
'.hbs': jsxgettext.generateFromHandlebars,
'.jade': jsxgettext.generateFromJade,
'.swig': jsxgettext.generateFromSwig
};
// dynamically update generators mapping
if (options.generators) {
if (!Array.isArray(options.generators)) {
options.generators = [options.generators];
}
options.generators.forEach(elem => {
// elem.generator can be either a string or a generator method (i.e. own generator or import from jsxgettext)
if (typeof elem.generator === 'string' || elem.generator instanceof String) {
// elem.generator can be an extension, which is used to remap predefined generators to different extensions
// or elem.generator is the name of an generator method implemented in jsxgettext
if (elem.generator.match(/^\..*/)) {
generators[elem.ext] = generators[elem.generator];
} else {
generators[elem.ext] = jsxgettext[elem.generator];
}
} else {
generators[elem.ext] = elem.generator;
}
});
}
var files = {};
var dest = options.dest;
if (!fs.existsSync(path.dirname(dest)))
return cb(util.format("Destination directory %s does not exist.", dest));
options.files.filter(file => grunt.file.exists(file)).forEach(file => {
var ext = path.extname(file);
var content = grunt.file.read(file, {
encoding: 'utf-8'
});
// pre-process non js files for use by jsxgettext.generate
if (ext !== '.js') {
var args = {};
args[file] = content;
files = _.assign(files, generators[ext](args, options).shift());
return;
}
files[file] = content;
});
if (_.isEmpty(files))
return cb("No valid input files found, received: " + util.inspect(options.files, {
depth: null
}));
cb(null, jsxgettext.generate(files, options));
};
function unary(fn) {
if (fn.length === 1) return fn;
return function (args) {
return fn.call(this, args);
};
}
module.exports = function (grunt) {
grunt.registerMultiTask('jsxgettext', 'A Grunt task to run jsxgettext against files to extract strings into a POT file.', function () {
var self = this;
var done = self.async();
async.forEach(self.files, function (fileSet, eCb) {
var dest;
if (typeof fileSet.dest !== 'undefined' && fileSet.dest) {
dest = fileSet.dest;
} else {
dest = path.join(fileSet['output-dir'] || '', fileSet.output);
}
var options = _.defaults(self.options(), {
files: fileSet.src,
dest: dest,
'output-dir': fileSet['output-dir'],
output: fileSet['output']
});
task(grunt, options, function (err, res) {
if (err) return eCb(err);
grunt.file.write(dest, res);
eCb();
});
}, err => {
if (err) grunt.fatal(err);
done();
});
});
};