yaml-i18n-brunch
Version:
Generate yaml format i18n translation files for your brunch project
205 lines (177 loc) • 4.93 kB
JavaScript
// Generated by CoffeeScript 1.10.0
var Compiler, DEFAULTS, async, basename, compare_merge, dirname, extend, flatten, fs, getdirs, join, json_skip_comment, mkdirp, ref, saferead, safewrite, yaml;
yaml = require('js-yaml');
ref = require('path'), dirname = ref.dirname, basename = ref.basename, join = ref.join;
fs = require('fs');
async = require('async');
extend = require('node.extend');
DEFAULTS = {
source: 'app/locales',
dest: 'public/locales',
flatten: true,
locale: {
"default": 'en'
}
};
getdirs = function(path) {
var names;
names = fs.readdirSync(path);
return names.filter(function(filename) {
return fs.statSync(join(path, filename)).isDirectory();
});
};
mkdirp = function(dir) {
var parentDir;
if (fs.existsSync(dir)) {
return;
}
parentDir = dirname(dir);
if (!fs.existsSync(parentDir)) {
mkdirp(parentDir);
}
return fs.mkdirSync(dir);
};
safewrite = function(path, data, callback) {
mkdirp(dirname(path));
return fs.writeFile(path, data, function(err) {
return callback(err);
});
};
saferead = function(path) {
if (fs.existsSync(path)) {
return fs.readFileSync(path, 'utf-8');
}
return '';
};
flatten = function(obj, prev) {
var k, key, ret, v;
if (prev == null) {
prev = '';
}
ret = {};
for (k in obj) {
v = obj[k];
if (prev === '') {
key = k;
} else {
key = k ? prev + "." + k : prev;
}
if ('object' === typeof v) {
extend(true, ret, flatten(v, key));
} else {
ret[key] = v;
}
}
return ret;
};
compare_merge = function(a, b) {
var a_val, k, ret, v;
ret = {};
for (k in b) {
v = b[k];
if (k[0] === '#') {
continue;
}
a_val = a[k] || a['#' + k];
if ('object' === typeof v) {
ret[k] = compare_merge(a_val != null ? a_val : {}, v);
} else {
ret[k] = a_val != null ? a_val : v;
}
}
for (k in a) {
v = a[k];
if ((!(k in b)) && (k[0] !== '#')) {
ret['#' + k] = v;
}
}
return ret;
};
json_skip_comment = function(k, v) {
if (k[0] !== '#') {
return v;
}
};
module.exports = Compiler = (function() {
Compiler.prototype.brunchPlugin = true;
Compiler.prototype.type = 'javascript';
Compiler.prototype.extension = 'yaml';
Compiler.prototype.extensionEnd = /\.ya?ml$/;
function Compiler(cfg) {
var ref1, ref2;
cfg = (ref1 = (ref2 = cfg.plugins) != null ? ref2.yamlI18n : void 0) != null ? ref1 : {};
cfg = extend(true, {}, DEFAULTS, cfg);
if (!cfg.locale.all) {
cfg.locale.all = getdirs(cfg.source);
}
this.cfg = cfg;
if (require('os').platform() === 'win32') {
this.cfg.dest = this.cfg.dest.replace(/\//g, '\\');
this.cfg.source = this.cfg.source.replace(/\//g, '\\');
}
this.pattern = new RegExp(this.escapeRegex(this.cfg.source) + "(.*)\.ya?ml$");
this.default_dir = this.sourceDir(cfg.locale["default"]);
}
Compiler.prototype.sourceDir = function(locale) {
return join(this.cfg.source, locale);
};
Compiler.prototype.sync = function(path, data, callback) {
var dosync, filename;
data = yaml.safeLoad(data) || {};
filename = basename(path);
dosync = (function(_this) {
return function(item, callback) {
var _data;
if (item === _this.cfg.locale["default"]) {
return callback(null, null);
}
path = join(_this.sourceDir(item), filename);
_data = yaml.safeLoad(saferead(path)) || {};
_data = compare_merge(_data, data);
return safewrite(path, yaml.safeDump(_data), callback);
};
})(this);
return async.each(this.cfg.locale.all, dosync, callback);
};
Compiler.prototype.dump = function(path, data, callback) {
var dest, dict;
dict = yaml.safeLoad(data) || {};
if (this.cfg.flatten === true) {
dict = flatten(dict);
}
dest = path.replace(this.cfg.source, this.cfg.dest);
dest = dest.replace(this.extensionEnd, '.json');
return safewrite(dest, JSON.stringify(dict, json_skip_comment, 2), callback);
};
Compiler.prototype.isInSourcePath = function(path) {
return path.indexOf(this.cfg.source) === 0;
};
Compiler.prototype.isDefaultLocaleFile = function(path) {
return path.indexOf(this.default_dir) === 0;
};
Compiler.prototype.compile = function(data, path, callback) {
var tick, ticker;
if (!this.isInSourcePath(path)) {
return;
}
ticker = 1;
tick = function(err, result) {
if (err) {
return callback(err);
}
ticker -= 1;
if (ticker <= 0) {
return callback(null, null);
}
};
if (this.isDefaultLocaleFile(path)) {
ticker += 1;
this.sync(path, data, tick);
}
return this.dump(path, data, tick);
};
Compiler.prototype.escapeRegex = function(str) {
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
};
return Compiler;
})();