wrote basic functionality

master
Gregory Scheerlinck 9 years ago
parent ccebaa8115
commit 77d117e7a8

@ -5,12 +5,17 @@
var getContents = require('../lib/fileio').getContents;
var convert = require('../lib/fileio').convert;
var narrowDown = require('../lib/find').narrowDown;
var selectArticle = require('../lib/find').selectArticle;
var getArticlePath = require('../lib/util').getArticlePath;
var tmpSave = require('../lib/fileio').tmpSave;
var removeTmp = require('../lib/fileio').removeTmp;
var lastUpdate = require('arch-wiki-md-repo').updated;
var articles = require('arch-wiki-md-repo').doneList;
var selectedArticle = null;
var exec = require('child_process').exec;
// var kexec = require('kexec');
// var spawn = require('child_process').spawnSync;
var spawn = require('child_process').spawn;
var yargs = require('yargs')
.usage('Usage: $0 <search terms>')
@ -22,39 +27,39 @@ var yargs = require('yargs')
.argv;
var searchTerms = yargs._;
var isDeep = yargs.d;
// var options = {
// name: '',
// section: 1,
// description: '',
// date: lastUpdate,
// version: '1.0.0',
// manual: 'arch wiki manual',
// };
var options = {
name: '',
section: 1,
description: '',
date: lastUpdate,
version: '1.0.0',
manual: '',
};
articles = narrowDown(articles, searchTerms);
Promise.resolve(narrowDown(articles, searchTerms, isDeep)).then(function select(filteredArticles) {
return selectArticle(filteredArticles);
}).then(function makeRoff(selectedArticle) {
// selectedArticle = articles[1747];
selectedArticle.path = getArticlePath(selectedArticle.path);
return getContents(selectedArticle);
}).then(function passToRemark(data) {
options.name = data.title;
options.manual = data.url;
options.description = data.description;
// if (articles.length === 1) {
// getContents(articles[0]).then(function passToRemark(data) {
// console.log(convert(data.contents));
// });
// } else {
// console.log(articles);
// }
selectedArticle = { path: 'test/mock/mockArticle.md', title: 'foo bar', description: 'my description' };
// selectedArticle = articles[1747];
// TODO: remove the description from the main text
// TODO: reformat links and delete images
getContents(selectedArticle).then(function passToRemark(data) {
// options.name = data.title;
// options.manual = data.path;
// options.description = data.description;
console.log(convert(data.contents));
return Promise.resolve(convert(data.contents, options));
}).then(function saveTmpFile(roff) {
return tmpSave(roff);
}).then(function displayRoff(tmpFile) {
var man = spawn('man', [tmpFile], { stdio: 'inherit' });
man.on('exit', function onExit() {
Promise.resolve(removeTmp()).then(function done() {
console.log('All done');
});
});
});
// exec('man --warnings -E UTF-8 ' + convert(data.contents, options));
// TODO: remove the description from the main text
// TODO: reformat links and delete images

@ -1,20 +1,65 @@
'use strict';
var inquirer = require('inquirer');
var chalk = require('chalk');
exports.narrowDown = narrowDown;
exports.select = select;
exports.selectArticle = selectArticle;
function narrowDown(articles, terms) {
function narrowDown(articles, terms, deep) {
var reSearchTerms = terms.map(function mapRE(term) {
return new RegExp(term, 'i');
});
return articles.filter(function filterOnTitle(article) {
return reSearchTerms.every(function checkRE(reTerm) {
return reTerm.test(article.title);
});
var filtered = articles.filter(function filterOutCategoryPages(article) {
return !article.category;
});
if (deep) {
return filtered.filter(function filterOnTitle(article) {
return reSearchTerms.every(function checkRE(reTerm) {
return reTerm.test(article.title) || reTerm.test(article.description);
});
});
} else {
return filtered.filter(function filterOnTitle(article) {
return reSearchTerms.every(function checkRE(reTerm) {
return reTerm.test(article.title);
});
});
}
}
function select() {
function selectArticle(articles) {
return new Promise(function makePromise(resolve, reject) {
var len = articles.length;
var choices;
var entry;
var sorted = articles.sort(function sortSpecialLast(a, b) {
return (/\-/.test(a.title.split(' ')[0]) && !/\-/.test(b.title.split(' ')[0])) || (/DeveloperWiki/.test(a.title.split(' ')[0]) && /DeveloperWiki/.test(b.title.split(' ')[0])) || a.title.length > b.title.length ? 1 : -1;
});
if (len === 0) {
return reject('No articles match your query.');
} else if (len === 1) {
return resolve(sorted[0]);
} else {
choices = sorted.map(function makeChoices(article, index) {
entry = ['[', chalk.yellow(index + 1), '/', chalk.yellow(len), '] ', chalk.green(article.title), ': ', chalk.gray(article.description).slice(0, 150)].join('');
return (article.description.length < 150) ? entry : entry + '...';
});
inquirer.prompt([{
type: 'list',
name: 'selection',
message: 'Select the Arch Wiki article',
choices: choices,
pageSize: 15,
}], function getAnswer(response) {
var pos = choices.indexOf(response.selection);
return resolve(sorted[pos]);
});
}
});
}

@ -17,8 +17,9 @@
"dependencies": {
"arch-wiki-md-repo": "*",
"bluebird": "^3.1.5",
"chalk": "^1.1.1",
"inquirer": "^0.11.4",
"remark": "^3.2.2",
"remark-html": "^2.0.2",
"remark-man": "^2.0.1",
"yargs": "^3.32.0"
},

@ -0,0 +1,59 @@
/* eslint-env mocha */
/* eslint func-names:0 no-unused-expressions:0 */
'use strict';
var expect = require('chai').expect;
var find = require('../lib/find');
// var fsReadFile = Promise.promisify(require('fs').readFile);
// var fsUnlink = Promise.promisify(require('fs').unlink);
// var fsWriteFile = Promise.promisify(require('fs').writeFile);
// var path = require('path');
describe('methods', function() {
it('has a narrowDown function', function() {
expect(find.narrowDown).to.be.a('function');
});
it('has a selectArticle function', function() {
expect(find.selectArticle).to.be.a('function');
});
});
describe('narrowDown', function() {
var articles = [{title: 'foo1'}, {title: 'bar foo 2'}, {title: 'bar'}];
it('returns empty array if no terms match', function() {
expect(find.narrowDown(articles, ['baz', 'bam']).length).to.equal(0);
expect(find.narrowDown(articles, ['foo bar']).length).to.equal(0);
});
it('returns the matching articles', function() {
expect(find.narrowDown(articles, ['bar foo']).length).to.equal(1);
expect(find.narrowDown(articles, ['foo', 'bar']).length).to.equal(1);
expect(find.narrowDown(articles, ['foo']).length).to.equal(2);
expect(find.narrowDown(articles, ['bar']).length).to.equal(2);
});
});
describe('selectArticle', function() {
it('throws an error if the passed in articles array is empty', function(done) {
find.selectArticle([]).then(function() {
// this should never run
console.warning('check ./test/find.js because you should never see this');
done();
}).catch(function(err) {
expect(err).to.be.a('string');
expect(err).to.equal('No articles match your query.');
done();
});
});
it('returns the article when the passed in articles array only contains one item', function(done) {
find.selectArticle([{title: 'foo'}]).then(function(data) {
expect(data).to.be.an('object');
done();
});
});
});
Loading…
Cancel
Save