taiga-front/locales.js

178 lines
4.3 KiB
JavaScript

var glob = require('glob');
var inquirer = require('inquirer');
var fs = require('fs');
var _ = require('lodash');
var Promise = require("bluebird");
var clc = require('cli-color');
var app = 'app/';
var question = {
type: 'list',
name: 'command',
message: 'Action',
choices: [
{
name: 'Replace keys',
value: 'replace-keys'
},
{
name: 'Find duplicates',
value: 'find-duplicates'
}
]
};
inquirer.prompt([question], function( answer ) {
if (answer.command === 'replace-keys') replaceKeys();
if (answer.command === 'find-duplicates') findDuplicates();
});
findDuplicates();
function replaceKeys() {
question()
.then(searchKey)
.then(printFiles)
.then(confirm)
.then(replace);
function question() {
return new Promise(function (resolve, reject) {
var questions = [
{
type: 'input',
message: 'Write the key',
name: 'find_key'
},
{
type: 'input',
message: 'Write the new key',
name: 'replace_key'
}
];
inquirer.prompt(questions, function(answers) {
resolve({
answers: answers,
files: []
});
});
});
}
function searchKey(obj) {
return new Promise(function (resolve, reject) {
var key = obj.answers.find_key;
glob(app + '**/*.+(jade|coffee)', {}, function (er, files) {
obj.files = files.filter(function(filepath) {
var file = fs.readFileSync(filepath).toString('utf8');
return file.indexOf(key) !== -1;
});
resolve(obj);
});
});
}
function printFiles(obj) {
return new Promise(function (resolve, reject) {
obj.files.forEach(function(file) {
console.log(file);
});
resolve(obj);
});
}
function confirm(obj) {
return new Promise(function (resolve, reject) {
var questions = [
{
type: 'confirm',
message: 'Are you sure?',
name: 'sure'
}
];
inquirer.prompt(questions, function(answer) {
if (answer.sure) {
resolve(obj);
} else {
reject('Cancel replace');
}
});
});
};
function replace(obj) {
obj.files.forEach(function(filepath) {
var file = fs.readFileSync(filepath).toString('utf8');
var re = new RegExp(obj.answers.find_key, 'g');
file = file.replace(re, obj.answers.replace_key);
fs.writeFile(filepath, file);
});
}
}
function findDuplicates() {
glob(app + 'locales/taiga/*.json', {}, function (er, files) {
console.log(files);
files.forEach(duplicates);
});
function duplicates(file) {
var fileKeys = flatKeys(file);
var duplicates = [];
var value = '';
var values = _.values(fileKeys);
for (key in fileKeys) {
value = fileKeys[key];
if(duplicates.indexOf(value) !== -1) continue;
if (values.indexOf(value) !== values.lastIndexOf(value)) {
duplicates.push(value);
console.log(clc.red(value) + ' duplicate in ' + file);
}
}
}
function flatKeys(filepath) {
var locale = JSON.parse(fs.readFileSync(filepath).toString('utf8'));
return flatObject(locale);
}
}
function flatObject(data, path) {
var flat, keyWithPath, val;
var result = {};
if (!path) {
path = [];
}
for (var key in data) {
val = data[key];
if (typeof val === 'object') {
flat = flatObject(val, path.concat(key));
_.assign(result, flat);
} else {
keyWithPath = path.length ? ("" + path.join(".") + "." + key) : key;
result[keyWithPath] = val;
}
}
return result;
};