fix label scroll. improve search. add features to ansi-viewer.

This commit is contained in:
Christopher Jeffrey 2015-04-18 22:14:51 -07:00
parent e3359a6877
commit 6c195dd8a0
2 changed files with 103 additions and 15 deletions

View File

@ -11,7 +11,7 @@ var blessed = require('../../')
, screen; , screen;
// $ wget -r -o log --tries=10 'http://artscene.textfiles.com/ansi/' // $ wget -r -o log --tries=10 'http://artscene.textfiles.com/ansi/'
// $ grep 'http.*\.ans$' log | awk '{ print $3 }' > blessed/ansi-art.list // $ grep 'http.*\.ans$' log | awk '{ print $3 }' > ansi-art.list
var urls = fs.readFileSync(__dirname + '/ansi-art.list', 'utf8').trim().split('\n'); var urls = fs.readFileSync(__dirname + '/ansi-art.list', 'utf8').trim().split('\n');
@ -57,7 +57,6 @@ var list = blessed.list({
} }
}, },
style: { style: {
//transparent: true,
item: { item: {
hover: { hover: {
bg: 'blue' bg: 'blue'
@ -67,6 +66,12 @@ var list = blessed.list({
bg: 'blue', bg: 'blue',
bold: true bold: true
} }
},
search: function(callback) {
prompt.input('Search:', '', function(err, value) {
if (err) return;
return callback(value);
});
} }
}); });
@ -78,24 +83,84 @@ var status = blessed.box({
width: 'shrink', width: 'shrink',
style: { style: {
bg: 'blue' bg: 'blue'
} },
content: 'Select your piece of ANSI art (`/` to search).'
});
var loader = blessed.loading({
parent: screen,
top: 'center',
left: 'center',
height: 5,
align: 'center',
width: '50%',
tags: true,
hidden: true,
border: 'line'
});
var msg = blessed.message({
parent: screen,
top: 'center',
left: 'center',
height: 'shrink',
width: '50%',
align: 'center',
tags: true,
hidden: true,
border: 'line'
});
var prompt = blessed.prompt({
parent: screen,
top: 'center',
left: 'center',
height: 'shrink',
width: 'shrink',
keys: true,
vi: true,
mouse: true,
tags: true,
content: 'Label:',
border: 'line',
hidden: true
}); });
list.setItems(Object.keys(map)); list.setItems(Object.keys(map));
list.on('select', function(url, selected) { list.on('select', function(url, selected) {
if (list._.rendering) return;
url = map[url.getText()]; url = map[url.getText()];
status.setContent(url); status.setContent(url);
list._.rendering = true;
loader.load('Loading...');
request(url, function(err, res, body) { request(url, function(err, res, body) {
if (err || !body) return; list._.rendering = false;
loader.stop();
if (err) {
return msg.error(err.message);
}
if (!body) {
return msg.error('No body.');
}
// Remove MCI codes:
body = body.replace(/%[A-Z]{2}/g, '');
// Reset and write the art:
art.term.reset(); art.term.reset();
art.term.write(body); art.term.write(body);
art.term.cursorHidden = true; art.term.cursorHidden = true;
screen.render(); screen.render();
}); });
}); });
list.select(0);
list.focus(); list.focus();
screen.key('q', function() { screen.key('q', function() {

View File

@ -2884,13 +2884,23 @@ Element.prototype.setLabel = function(options) {
this._label.rtop = 0; this._label.rtop = 0;
} }
this.on('scroll', function() { var reposition = function() {
var visible = self.height - self.iheight; var visible = self.height - self.iheight;
self._label.rtop = self.childBase - (self.border ? 1 : 0); self._label.rtop = self.childBase - (self.border ? 1 : 0);
if (!self.screen.autoPadding) { if (!self.screen.autoPadding) {
self._label.rtop = self.childBase; self._label.rtop = self.childBase;
} }
self.screen.render(); self.screen.render();
};
this.on('scroll', function() {
reposition();
});
this.on('resize', function() {
nextTick(function() {
reposition();
});
}); });
}; };
@ -5119,15 +5129,14 @@ function List(options) {
return; return;
} }
if (options.vi && key.ch === '/') { if (options.vi && (key.ch === '/' || key.ch === '?')) {
if (typeof self.options.search !== 'function') { if (typeof self.options.search !== 'function') {
return; return;
} }
return self.options.search(function(value) {
return self.options.search(function(searchString) { self.select(self.fuzzyFind(value, key.ch === '?'));
self.select(self.fuzzyFind(searchString));
self.screen.render(); self.screen.render();
}) });
} }
}); });
} }
@ -5235,12 +5244,26 @@ List.prototype.appendItem = function(item) {
} }
}; };
List.prototype.fuzzyFind = function(search) { List.prototype.fuzzyFind = function(search, back) {
var index = this.getItemIndex(this.selected); var index = this.getItemIndex(this.selected);
var start = this.selected + (back ? -1 : 1);
var finder = typeof search === 'string'
? function(item) { return !!~item.indexOf(search); }
: search.test.bind(search);
for (var i = 0; i < this.ritems.length; i++){ if (!back) {
if (this.ritems[i].indexOf(search) === 0) { for (var i = start; i < this.ritems.length; i++){
return i; if (finder(this.ritems[i])) return i;
}
for (var i = 0; i < start; i++){
if (finder(this.ritems[i])) return i;
}
} else {
for (var i = start; i >= 0; i--){
if (finder(this.ritems[i])) return i;
}
for (var i = this.ritems.length - 1; i > start; i--){
if (finder(this.ritems[i])) return i;
} }
} }