add multi-language support & new db format

master
Gregory Scheerlinck 8 years ago
parent 8a80136246
commit f7d7c11f42

@ -10,9 +10,10 @@ var narrowDown = require('../lib/find').narrowDown;
var selectArticle = require('../lib/find').selectArticle;
var tmpSave = require('../lib/fileio').tmpSave;
var removeTmp = require('../lib/fileio').removeTmp;
var chalk = require('chalk');
var lastUpdate = require('arch-wiki-md-repo').updated;
var articles = require('arch-wiki-md-repo').db;
var db = require('arch-wiki-md-repo').db;
var spawn = require('child_process').spawn;
@ -32,7 +33,9 @@ var yargs = require('yargs')
.describe('w', 'open in browser')
.default('l', 'english')
.alias('l', 'language')
.describe('l', 'choose a language (default: english)')
.describe('l', 'choose a language (note: auto-fallback to English if no matches are found)')
.boolean('list-languages')
.describe('list-languages', 'print a list of available languages')
.help('h')
.alias('h', 'help')
.argv;
@ -43,19 +46,43 @@ var isApro = yargs.k;
var isWeb = yargs.w;
var lang = yargs.l;
var articles;
var englishArticles = null;
var doFallback = false;
var langs;
var options = {
name: '',
section: 1,
description: '',
date: lastUpdate,
version: '1.0.0',
version: '1.1.0',
manual: '',
};
articles = _.find(articles, { lang: lang }).articles;
yargs.$0 = 'awman';
if (yargs.listLanguages) {
langs = db.map(function getLanguages(e) { return e.lang; }).sort();
langs.forEach(function printLanguages(lan) { console.log(lan); });
process.exit();
}
Promise.resolve(narrowDown(articles, searchTerms, isDeep, isApro)).then(function select(filteredArticles) {
return selectArticle(filteredArticles);
try {
articles = _.find(db, { lang: lang }).articles;
} catch (e) {
if (e instanceof TypeError) {
console.log('Sorry, ' + chalk.yellow(lang) + ' is ' + chalk.bold('not') + ' a supported language.\n`awman --list-languages` to get a list of available languages');
process.exit();
}
}
if (lang !== 'english') {
englishArticles = _.find(db, { lang: 'english' }).articles;
}
Promise.resolve(narrowDown(articles, searchTerms, isDeep, isApro, doFallback, englishArticles)).then(function select(filteredArticles) {
return selectArticle(filteredArticles, lang, searchTerms, isDeep, isApro, englishArticles);
}).then(function makeRoff(selectedArticle) {
return getContents(selectedArticle);
}).then(function processArticle(article) {
@ -68,7 +95,7 @@ Promise.resolve(narrowDown(articles, searchTerms, isDeep, isApro)).then(function
}).then(function passToRemarkMan(article) {
options.name = article.title;
options.manual = article.url;
options.description = article.description;
// options.description = article.description;
return convert(article.contents, options);
}).then(function saveTmpFile(roff) {
@ -77,10 +104,11 @@ Promise.resolve(narrowDown(articles, searchTerms, isDeep, isApro)).then(function
var man = spawn('man', [tmpFile], { stdio: 'inherit' });
man.on('exit', function onExit() {
Promise.resolve(removeTmp()).then(function done() {
console.log('All done');
});
});
}).catch(function catchAll(err) {
console.log(err.message);
console.log(err.stack);
console.error(chalk.red(err));
if (err.stack) {
console.log(chalk.yellow(err.stack));
}
});

@ -7,13 +7,19 @@ var getContents = require('../lib/fileio').getContents;
exports.narrowDown = narrowDown;
exports.selectArticle = selectArticle;
function narrowDown(articles, terms, deep, apropos) {
function narrowDown(articles, terms, deep, apropos, doFallback, englishArticles) {
var reSearchTerms = terms.map(function mapRE(term) {
// escape invalid regex characters in the search terms before making a new regex
return new RegExp(term.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'), 'i');
});
var filtered = articles.slice();
var filtered;
if (doFallback) {
filtered = englishArticles.slice();
} else {
filtered = articles.slice();
}
if (apropos) {
filtered = filtered.map(function getArticleContents(art) {
@ -43,7 +49,7 @@ function narrowDown(articles, terms, deep, apropos) {
}
}
function selectArticle(articles) {
function selectArticle(articles, lang, searchTerms, isDeep, isApro, englishArticles) {
return new Promise(function makePromise(resolve, reject) {
var len = articles.length;
var choices;
@ -54,7 +60,11 @@ function selectArticle(articles) {
});
if (len === 0) {
return reject('No articles match your query.');
if (lang === 'english') {
return reject('No articles match your query.');
} else {
return resolve(selectArticle(narrowDown(null, searchTerms, isDeep, isApro, true, englishArticles), 'english'));
}
} else if (len === 1) {
return resolve(sorted[0]);
} else {
@ -66,7 +76,7 @@ function selectArticle(articles) {
inquirer.prompt([{
type: 'list',
name: 'selection',
message: 'Select the Arch Wiki article',
message: 'Select an article:',
choices: choices,
}], function getAnswer(response) {
var pos = choices.indexOf(response.selection);

@ -38,7 +38,7 @@ describe('narrowDown', function() {
describe('selectArticle', function() {
it('throws an error if the passed in articles array is empty', function(done) {
find.selectArticle([]).then(function() {
find.selectArticle([], 'english').then(function() {
// this should never run
console.warning('check ./test/find.js because you should never see this');
done();

Loading…
Cancel
Save