UNPKG

yaml-i18n-brunch

Version:

Generate yaml format i18n translation files for your brunch project

205 lines (177 loc) 4.93 kB
// 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; })();