Use async instead of Promises

v1.18.x
Peter Jaszkowiak 9 years ago
parent 5223bb5191
commit 9fd64549a3

@ -2,48 +2,13 @@
var fs = require('fs'); var fs = require('fs');
var path = require('path'); var path = require('path');
var async = require('async');
var sanitizeHTML = require('sanitize-html'); var sanitizeHTML = require('sanitize-html');
var languages = require('../languages'); var languages = require('../languages');
var utils = require('../../public/src/utils'); var utils = require('../../public/src/utils');
var Translator = require('../../public/src/modules/translator').Translator; var Translator = require('../../public/src/modules/translator').Translator;
function walk(directory) {
return new Promise(function (resolve, reject) {
utils.walk(directory, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
function readFile(path) {
return new Promise(function (resolve, reject) {
fs.readFile(path, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data.toString());
}
});
});
}
function loadLanguage(language, namespace) {
return new Promise(function (resolve, reject) {
languages.get(language, namespace, function (err, data) {
if (err || !data || !Object.keys(data).length) {
reject(err);
} else {
resolve(data);
}
});
});
}
function filterDirectories(directories) { function filterDirectories(directories) {
return directories.map(function (dir) { return directories.map(function (dir) {
// get the relative path // get the relative path
@ -51,13 +16,21 @@ function filterDirectories(directories) {
}).filter(function (dir) { }).filter(function (dir) {
// exclude partials // exclude partials
// only include subpaths // only include subpaths
return !dir.includes('/partials/') && /\/.*\//.test(dir); // exclude category.tpl, group.tpl, category-analytics.tpl
return !dir.includes('/partials/') &&
/\/.*\//.test(dir) &&
!/category|group|category\-analytics$/.test(dir);
}); });
} }
function getAdminNamespaces() { function getAdminNamespaces(callback) {
return walk(path.resolve(__dirname, '../../public/templates/admin')) utils.walk(path.resolve(__dirname, '../../public/templates/admin'), function (err, directories) {
.then(filterDirectories); if (err) {
return callback(err);
}
callback(null, filterDirectories(directories));
});
} }
function sanitize(html) { function sanitize(html) {
@ -78,68 +51,133 @@ function simplify(translations) {
.replace(/[\t ]+/g, ' '); .replace(/[\t ]+/g, ' ');
} }
function nsToTitle(namespace) {
return namespace.replace('admin/', '').split('/').map(function (str) {
return str[0].toUpperCase() + str.slice(1);
}).join(' > ');
}
var fallbackCacheInProgress = {};
var fallbackCache = {}; var fallbackCache = {};
function initFallback(namespace) { function initFallback(namespace, callback) {
return readFile(path.resolve(__dirname, '../../public/templates/', namespace + '.tpl')) fs.readFile(path.resolve(__dirname, '../../public/templates/', namespace + '.tpl'), function (err, file) {
.then(function (template) { if (err) {
var translations = sanitize(template); return callback(err);
translations = simplify(translations); }
translations = Translator.removePatterns(translations);
var template = file.toString();
return {
namespace: namespace, var translations = sanitize(template);
translations: translations, translations = Translator.removePatterns(translations);
}; translations = simplify(translations);
translations += '\n' + nsToTitle(namespace);
callback(null, {
namespace: namespace,
translations: translations,
}); });
});
} }
function fallback(namespace) { function fallback(namespace, callback) {
// use cache if exists, else make it if (fallbackCache[namespace]) {
fallbackCache[namespace] = fallbackCache[namespace] || initFallback(namespace); return callback(null, fallbackCache[namespace]);
return fallbackCache[namespace]; }
if (fallbackCacheInProgress[namespace]) {
return fallbackCacheInProgress[namespace].push(callback);
}
fallbackCacheInProgress[namespace] = [function (err, params) {
if (err) {
return callback(err);
}
callback(null, params);
}];
initFallback(namespace, function (err, params) {
fallbackCacheInProgress[namespace].forEach(function (fn) {
fn(err, params);
});
fallbackCacheInProgress[namespace] = null;
fallbackCache[namespace] = params;
});
} }
function initDict(language) { function initDict(language, callback) {
return getAdminNamespaces().then(function (namespaces) { getAdminNamespaces(function (err, namespaces) {
return Promise.all(namespaces.map(function (namespace) { if (err) {
return loadLanguage(language, namespace) return callback(err);
.then(function (translations) { }
async.map(namespaces, function (namespace, cb) {
async.waterfall([
function (next) {
languages.get(language, namespace, next);
},
function (translations, next) {
if (!translations || !Object.keys(translations).length) {
return next(Error('No translations for ' + language + '/' + namespace));
}
// join all translations into one string separated by newlines // join all translations into one string separated by newlines
var str = Object.keys(translations).map(function (key) { var str = Object.keys(translations).map(function (key) {
return translations[key]; return translations[key];
}).join('\n'); }).join('\n');
return { next(null, {
namespace: namespace, namespace: namespace,
translations: str, translations: str,
}; });
}) }
// TODO: Use translator to get title for admin route? ], function (err, params) {
.catch(function () { if (err) {
// no translations for this route, fallback to template return fallback(namespace, function (err, params) {
return fallback(namespace); if (err) {
}) return cb({
.catch(function () { namespace: namespace,
// no fallback, just return blank translations: '',
return { });
namespace: namespace, }
translations: '',
}; cb(null, params);
}); });
})); }
cb(null, params);
});
}, callback);
}); });
} }
var cacheInProgress = {};
var cache = {}; var cache = {};
function getDict(language) { function getDictionary(language, callback) {
// use cache if exists, else make it if (cache[language]) {
cache[language] = cache[language] || initDict(language); return callback(null, cache[language]);
return cache[language]; }
if (cacheInProgress[language]) {
return cacheInProgress[language].push(callback);
}
cacheInProgress[language] = [function (err, params) {
if (err) {
return callback(err);
}
callback(null, params);
}];
initDict(language, function (err, params) {
cacheInProgress[language].forEach(function (fn) {
fn(err, params);
});
cacheInProgress[language] = null;
cache[language] = params;
});
} }
module.exports.getDict = getDict; module.exports.getDictionary = getDictionary;
module.exports.filterDirectories = filterDirectories; module.exports.filterDirectories = filterDirectories;
module.exports.simplify = simplify; module.exports.simplify = simplify;
module.exports.sanitize = sanitize; module.exports.sanitize = sanitize;

@ -15,7 +15,7 @@ var emailer = require('../emailer');
var db = require('../database'); var db = require('../database');
var analytics = require('../analytics'); var analytics = require('../analytics');
var index = require('./index'); var index = require('./index');
var getAdminSearchDict = require('../admin/search').getDict; var getAdminSearchDict = require('../admin/search').getDictionary;
var SocketAdmin = { var SocketAdmin = {
user: require('./admin/user'), user: require('./admin/user'),
@ -284,10 +284,7 @@ SocketAdmin.getSearchDict = function (socket, data, callback) {
return callback(err); return callback(err);
} }
var lang = settings.userLang || meta.config.defaultLang || 'en-GB'; var lang = settings.userLang || meta.config.defaultLang || 'en-GB';
getAdminSearchDict(lang) getAdminSearchDict(lang, callback);
.then(function (results) {
callback(null, results);
}, callback);
}); });
}; };

@ -2,7 +2,7 @@
/*global require*/ /*global require*/
var assert = require('assert'); var assert = require('assert');
var search = require('../src/admin/search.js'); var search = require('../src/admin/search');
describe('admin search', function () { describe('admin search', function () {
describe('filterDirectories', function () { describe('filterDirectories', function () {
@ -60,7 +60,7 @@ describe('admin search', function () {
assert.equal( assert.equal(
search.simplify( search.simplify(
'Pellentesque tristique {{senectus}}habitant morbi' + 'Pellentesque tristique {{senectus}}habitant morbi' +
'liquam tincidunt {{mauris.eu}}risus' 'liquam tincidunt {mauris.eu}risus'
), ),
'Pellentesque tristique habitant morbi' + 'Pellentesque tristique habitant morbi' +
'liquam tincidunt risus' 'liquam tincidunt risus'

Loading…
Cancel
Save