123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #!/usr/bin/env node
- var blessed = require('blessed'),
- PythonShell = require('python-shell'),
- screen = blessed.screen({
- smartCSR: true,
- autoPadding: true
- }),
- searchResults;
-
- screen._listenedMouse = true; // HACK HACK HACK
-
- var cleanExit = function () {
- // program.clear();
- // program.disableMouse();
- // program.showCursor();
- // program.normalBuffer();
- process.exit(0);
- };
-
- var form = blessed.form({
- parent: screen,
- keys: true,
- top: 'center',
- left: 'center',
- padding: {
- left: 1,
- right: 1,
- top: 1,
- bottom: 1
- },
- border: {
- type: 'line',
- fg: 'white',
- },
- width: '95%',
- height: 7,
- content: 'Search: '
- });
-
- var input = blessed.textbox({
- parent: form,
- name: 'input',
- keys: true,
- inputOnFocus: true,
- height: 1,
- padding: {
- left: 1,
- right: 1
- },
- top: 0,
- left: 10,
- right: 2
- });
-
- var submit = blessed.button({
- parent: form,
- keys: true,
- shrink: true,
- padding: {
- left: 1,
- right: 1
- },
- right: 12,
- top: 2,
- name: 'submit',
- content: 'submit',
- style: {
- bg: 'blue',
- focus: {
- bg: 'white',
- fg: 'blue'
- },
- hover: {
- bg: 'white',
- fg: 'blue'
- }
- }
- });
-
- var cancel = blessed.button({
- parent: form,
- keys: true,
- shrink: true,
- padding: {
- left: 1,
- right: 1
- },
- right: 2,
- top: 2,
- name: 'cancel',
- content: 'cancel',
- style: {
- bg: 'red',
- focus: {
- bg: 'white',
- fg: 'red'
- },
- hover: {
- bg: 'white',
- fg: 'red'
- }
- }
- });
-
- var loading = blessed.loading({
- parent: screen,
- visible: false,
- hidden: true,
- top: 'center',
- left: 'center',
- padding: {
- left: 1,
- right: 1,
- top: 1,
- bottom: 1
- },
- border: {
- type: 'line',
- fg: 'white'
- },
- width: 32,
- height: 7,
- });
-
- var resultsForm = blessed.form({
- parent: screen,
- hidden: true,
- input: false,
- keys: true,
- tags: true
- });
-
- var resultsSet = blessed.radioset({
- parent: resultsForm,
- input: false,
- keys: true,
- tags: true,
- top: 0,
- left: 0,
- border: {
- type: 'line',
- fg: 'white'
- },
- selectedBg: 'darkred',
- selectedFg: 'yellow',
- scollbar: true,
- });
-
- submit.on('press', function() {
- form.submit();
- });
-
- cancel.on('press', function() {
- form.reset();
- });
-
- input.on('submit', function(data) {
- form.submit();
- });
-
- form.on('submit', function(data) {
- form.hide();
- PythonShell.run('results.py', {args: [data.input], mode: 'json',
- scriptPath: __dirname,
- pythonPath: '/usr/bin/python3'},
- function (err, results) {
- loading.stop();
- if (err) throw err;
- searchResults = results[0];
- resultsForm.show();
- searchResults.forEach(function(r, i) {
- var result = blessed.radiobutton({
- tags: true,
- top: i * 4,
- height: 4,
- padding: {
- bottom: 1
- },
- text: '{bold}' + (i + 1) + '. ' + r.title + '{/}\n\t{blue-fg}' + r.link.slice(0, 100) + '{/}\n\t' + r.desc
- });
- result.set('index', i);
- resultsSet.append(result);
- result.key('left', backToSearch);
- result.on('check', function() {
- resultsForm.hide();
- screen.leave();
- var browser = screen.spawn('w3m', [searchResults[this.get('index')].link]);
- var self = this;
- browser.on('exit', function() {
- screen.program.hideCursor();
- resultsForm.show();
- self.focus();
- screen.render();
- });
- })
- result.key('j', listNext);
- result.key('k', listPrev);
- result.key('up', listNext);
- result.key('down', listPrev);
- result.on('keypress', numberPress);
- })
- resultsSet.children[0].focus(); // first result
- screen.render();
- });
- loading.load('Searching...');
- // loading._.icon.style = {bg: 'grey'}; // Hacky, loading icon doesn't support styling via options
- });
-
- form.on('reset', function(data) {
- form.setContent('Canceled.');
- cleanExit();
- });
-
- var backToSearch = function() {
- screen.saveFocus();
- resultsForm.hide();
- form.show();
- input.focus();
- screen.render();
- }
-
- var forwardToList = function() {
- if (searchResults) {
- form.hide();
- resultsForm.show();
- screen.restoreFocus();
- screen.render();
- }
- }
-
- var numberPress = function(key) {
- numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
- if (numbers.indexOf(key) > -1) {
- resultsSet.children[parseInt(key, 10) - 1].focus();
- resultsSet.children[parseInt(key, 10) - 1].check();
- }
- }
-
- var listNext = function() {
- resultsForm.focusNext();
- }
- var listPrev = function() {
- resultsForm.focusPrevious();
- }
-
- // resultsSet.key('left', backToSearch);
- // resultsForm.key('left', backToSearch);
- // resultsSet.on('keypress', numberPress);
- // resultsForm.on('keypress', numberPress);
-
- form.key('right', forwardToList);
- input.key('right', forwardToList);
- submit.key('right', forwardToList);
- cancel.key('right', forwardToList);
-
- screen.key('q', function() {
- cleanExit();
- });
-
- screen.key('escape', function() {
- cleanExit();
- });
-
- screen.render();
- input.focus();
|