gulp-sk-i18n
Version:
ShaneKing I18N for Gulp
92 lines (76 loc) • 2.73 kB
JavaScript
;
var Buffer = require('buffer').Buffer;
var crypto = require('crypto');
var gUtil = require('gulp-util');
var path = require('path');
var Mesgs = require('sk-js').Mesgs;
var through = require('through2');
var File = gUtil.File;
// file can be a vinyl file object or a string
// when a string it will construct a new one
module.exports = function (opt) {
opt = opt || {};
if (!opt.hashAlgorithm) {
opt.hashAlgorithm = 'md5';//'sha1'、'sha256'、'sha512'
}
if (!opt.hashLength) {
opt.hashLength = 8;
}
if (!opt.folderMapping) {
opt.folderMapping = {};
}
var files = [];
var folderLanguageHashObject = {};
var folderLanguageHashFile = {};
function bufferContents(file, enc, cb) {
// ignore empty files
if (file.isNull()) {
cb();
return;
}
var currentPath = file.history[file.history.length - 1];
var currentPaths = currentPath.split('/');
var jsonFilename = currentPaths[currentPaths.length - 1];
var folder = jsonFilename.split('_')[0];
var languageFilename = jsonFilename.split(folder)[1];
folder = opt.folderMapping[folder] ? opt.folderMapping[folder] : folder;
if (!folderLanguageHashFile[folder + languageFilename]) {
folderLanguageHashFile[folder + languageFilename] = new File({
cwd: file.cwd,
base: file.base,
path: path.join(file.base, folder + '_Hash' + languageFilename)
});
}
if (!folderLanguageHashObject[folder + languageFilename]) {
folderLanguageHashObject[folder + languageFilename] = {};
}
var hashObject = folderLanguageHashObject[folder + languageFilename];
var jsonObject = JSON.parse(file.contents.toString());
var pathObjects = {};
Mesgs.jsonNodeParser(jsonObject, '', pathObjects);
Object.keys(pathObjects).forEach(function (pathStr) {
var strContent = JSON.stringify(pathObjects[pathStr]);
var hashValue = crypto.createHash(opt.hashAlgorithm).update(strContent).digest('hex').slice(0, opt.hashLength);
hashObject[pathStr] = hashValue;
files.push(new File({
cwd: file.cwd,
base: file.base,
path: path.join(file.base, folder, pathStr, hashValue + languageFilename),
contents: new Buffer(strContent)
}));
});
cb();
}
function endStream(cb) {
files.forEach(function (file) {
this.push(file);
}.bind(this));
Object.keys(folderLanguageHashFile).forEach(function (folderLanguage) {
var file = folderLanguageHashFile[folderLanguage];
file.contents = new Buffer(JSON.stringify(folderLanguageHashObject[folderLanguage]));
this.push(file);
}.bind(this));
cb();
}
return through.obj(bufferContents, endStream);
};