more tput.js work, fixes. cleanup.

This commit is contained in:
Christopher Jeffrey 2013-07-23 00:22:49 -05:00
parent fe9406aba1
commit 5e2ca90f04
3 changed files with 110 additions and 222 deletions

View File

@ -81,6 +81,11 @@ Tput.prototype.term = function(is) {
return this.terminal.indexOf(is) === 0; return this.terminal.indexOf(is) === 0;
}; };
Tput.prototype._debug = function() {
if (!this.debug) return;
return console.log.apply(console, arguments);
};
/** /**
* Fallback * Fallback
*/ */
@ -513,9 +518,7 @@ Tput.prototype.compile = function(info) {
this.detectFeatures(info); this.detectFeatures(info);
if (this.debug) { this._debug(info);
console.log(info);
}
info.all = {}; info.all = {};
info.methods = {}; info.methods = {};
@ -523,9 +526,7 @@ Tput.prototype.compile = function(info) {
['bools', 'numbers', 'strings'].forEach(function(type) { ['bools', 'numbers', 'strings'].forEach(function(type) {
Object.keys(info[type]).forEach(function(key) { Object.keys(info[type]).forEach(function(key) {
info.all[key] = info[type][key]; info.all[key] = info[type][key];
if (self.debug) { self._debug('Compiling %s: %s', key, JSON.stringify(info.all[key]));
console.log('Compiling %s: %s', key, JSON.stringify(info.all[key]));
}
info.methods[key] = self._compile(info.all[key], key, info); info.methods[key] = self._compile(info.all[key], key, info);
}); });
}); });
@ -593,42 +594,40 @@ Tput.prototype.inject = function(info) {
// See: // See:
// ~/ncurses/ncurses/tinfo/lib_tparm.c // ~/ncurses/ncurses/tinfo/lib_tparm.c
// ~/ncurses/ncurses/tinfo/comp_scan.c // ~/ncurses/ncurses/tinfo/comp_scan.c
Tput.prototype._compile = function(val, key, info) { Tput.prototype._compile = function(str, key, info) {
var self = this switch (typeof str) {
, _val = val
, _key = key;
switch (typeof val) {
case 'boolean': case 'boolean':
return val; return str;
case 'number': case 'number':
return val; return str;
case 'string': case 'string':
break; break;
default: default:
return noop; return noop;
} }
if (!val) { if (!str) {
return noop; return noop;
} }
// See: // See:
// ~/ncurses/progs/tput.c - tput() - L149 // ~/ncurses/progs/tput.c - tput() - L149
// ~/ncurses/progs/tset.c - set_init() - L992 // ~/ncurses/progs/tset.c - set_init() - L992
if (_key === 'init_file' || _key === 'reset_file') { if (key === 'init_file' || key === 'reset_file') {
try { try {
// NOTE: Should we consider this code and parse it instead? // NOTE: Should we consider this code and parse it instead?
val = fs.readFileSync(_val, 'utf8'); str = fs.readFileSync(str, 'utf8');
return function() { return val; }; return function() { return str; };
} catch (e) { } catch (e) {
return noop; return noop;
} }
} }
var header = 'var v, dyn = {}, stat = {}, stack = [], out = "";' var tkey = info.name + '.' + key
, header = 'var v, dyn = {}, stat = {}, stack = [], out = "";'
, footer = ';return out;' , footer = ';return out;'
, code = header , code = header
, val = str
, buff = '' , buff = ''
, cap; , cap;
@ -654,7 +653,6 @@ Tput.prototype._compile = function(val, key, info) {
if (!cap) return; if (!cap) return;
val = val.substring(cap[0].length); val = val.substring(cap[0].length);
ch = op = i = v = cap[1]; ch = op = i = v = cap[1];
// with old print(): clear();
if (!no) clear(); if (!no) clear();
return cap; return cap;
} }
@ -680,12 +678,7 @@ Tput.prototype._compile = function(val, key, info) {
} }
function print(c) { function print(c) {
// with old print(): echo('"' + c + '"'); buff += c;
// NOTE: Instead of doing this, could simply change
// the strings that are passed to print() below.
buff += JSON.parse('"'
+ c.replace(/\\x([0-9a-fA-F]{2})/g, '\\u00$1')
+ '"');
} }
function push(c) { function push(c) {
@ -698,67 +691,26 @@ Tput.prototype._compile = function(val, key, info) {
while (val) { while (val) {
// Ignore newlines // Ignore newlines
// if (read(/^\n /, true)) { if (read(/^\n /, true)) {
// continue; continue;
// } }
// '\e' -> ^[
// if (read(/^\\e/i, true)) {
// print('\\x1b');
// continue;
// }
// '^A' -> ^A // '^A' -> ^A
if (read(/^\^(.)/i, true)) { if (read(/^\^(.)/i, true)) {
if (!(ch >= ' ' && ch <= '~')) { if (!(ch >= ' ' && ch <= '~')) {
; this._debug('%s: bad caret char.', tkey);
// NOTE: ncurses appears to simply
// continue in this situation, but
// I could be wrong.
print(cap[0]);
continue;
} }
if (ch === '?') { if (ch === '?') {
ch = '\\x7f'; ch = '\x7f';
} else { } else {
ch = ch.charCodeAt(0) & 31; ch = ch.charCodeAt(0) & 31;
if (ch === 0) ch = 128; if (ch === 0) ch = 128;
ch = ch.toString(16); ch = String.fromCharCode(ch);
if (ch.length < 2) ch = '0' + ch;
ch = '\\x' + ch;
}
print(ch);
continue;
switch (ch) {
case '@':
ch = '\\200';
break;
case '[':
ch = '\\x1b';
break;
case '\\':
ch = '\\x1c';
break;
case ']':
ch = '\\x1d';
break;
case '^':
ch = '\\x1e';
break;
case '_':
ch = '\\x1f';
break;
case '?':
ch = '\\x7f';
break;
default:
ch = ch.toUpperCase();
if (ch >= 'A' && ch <= 'Z') {
ch = ch.charCodeAt(0) - 64;
ch = ch.toString(16);
if (ch.length < 2) ch = '0' + ch;
ch = '\\x' + ch;
} else {
//ch = cap[0];
ch = ch;
}
break;
} }
print(ch); print(ch);
continue; continue;
@ -766,7 +718,7 @@ Tput.prototype._compile = function(val, key, info) {
// 3 octal digits -> character // 3 octal digits -> character
if (read(/^\\([0-7]{3})/, true)) { if (read(/^\\([0-7]{3})/, true)) {
print('\\' + ch); print(String.fromCharCode(parseInt(ch, 8)));
continue; continue;
} }
@ -778,25 +730,25 @@ Tput.prototype._compile = function(val, key, info) {
switch (ch) { switch (ch) {
case 'e': case 'e':
case 'E': case 'E':
ch = '\\x1b'; ch = '\x1b';
break; break;
case 'n': case 'n':
ch = '\\n'; ch = '\n';
break; break;
case 'l': case 'l':
ch = '\\x85'; ch = '\x85';
break; break;
case 'r': case 'r':
ch = '\\r'; ch = '\r';
break; break;
case 't': case 't':
ch = '\\t'; ch = '\t';
break; break;
case 'b': case 'b':
ch = '\\x08'; ch = '\x08';
break; break;
case 'f': case 'f':
ch = '\\x0c'; ch = '\x0c';
break; break;
case 's': case 's':
ch = ' '; ch = ' ';
@ -805,7 +757,7 @@ Tput.prototype._compile = function(val, key, info) {
ch = '^'; ch = '^';
break; break;
case '\\': case '\\':
ch = '\\\\'; ch = '\\';
break; break;
case ',': case ',':
ch = ','; ch = ',';
@ -814,14 +766,14 @@ Tput.prototype._compile = function(val, key, info) {
ch = ':'; ch = ':';
break; break;
case '0': case '0':
ch = '\\200'; ch = '\200';
break; break;
case 'a': case 'a':
ch = '\\x07'; ch = '\x07';
break; break;
default: default:
//ch = cap[0]; this._debug('%s: bad backslash char.', tkey);
ch = ch; ch = cap[0];
break; break;
} }
print(ch); print(ch);
@ -855,40 +807,14 @@ Tput.prototype._compile = function(val, key, info) {
if (this.printf || cap[1] || cap[2] || ~'oxX'.indexOf(cap[3])) { if (this.printf || cap[1] || cap[2] || ~'oxX'.indexOf(cap[3])) {
echo('sprintf("'+ cap[0].replace(':-', '-') + '", stack.pop())'); echo('sprintf("'+ cap[0].replace(':-', '-') + '", stack.pop())');
} else if (cap[3] === 'c') { } else if (cap[3] === 'c') {
echo('(v = stack.pop() || "",' echo('(v = stack.pop(), isFinite(v) '
+ ' isFinite(v) ? String.fromCharCode(v) : v[0])'); + '? String.fromCharCode(v || 0200) : "")');
} else { } else {
echo('stack.pop()'); echo('stack.pop()');
} }
continue; continue;
} }
// %c print pop() like %c in printf
// Example from screen terminfo:
// S0: "\u001b(%p1%c"
// if (read(/^%c/)) {
// if (this.printf) {
// echo('sprintf("%c", stack.pop())');
// } else {
// echo('(v = stack.pop() || "",'
// + ' isFinite(v) ? String.fromCharCode(v) : v[0])');
// }
// continue;
// }
// %d print pop()
// "Print (e.g., "%d") is a special case."
// if (read(/^%d/)) {
// echo('stack.pop()');
// continue;
// }
// %s print pop() like %s in printf
// if (read(/^%s/)) {
// echo('stack.pop()');
// continue;
// }
// %p[1-9] // %p[1-9]
// push i'th parameter // push i'th parameter
if (read(/^%p([1-9])/)) { if (read(/^%p([1-9])/)) {
@ -930,8 +856,10 @@ Tput.prototype._compile = function(val, key, info) {
} }
// %'c' char constant c // %'c' char constant c
if (read(/^%'(\w)'/)) { // NOTE: These are stored as c chars, exemplified by:
expr('(stack.push(v = "' + ch + '"), v)'); // cursor_address: "\u001b=%p1%' '%+%c%p2%' '%+%c"
if (read(/^%'(.)'/)) {
expr('(stack.push(v = ' + ch.charCodeAt(0) + '), v)');
continue; continue;
} }
@ -944,7 +872,7 @@ Tput.prototype._compile = function(val, key, info) {
// %l push strlen(pop) // %l push strlen(pop)
if (read(/^%l/)) { if (read(/^%l/)) {
expr('(stack.push(v = stack.pop().length), v)'); expr('(stack.push(v = (stack.pop() || "").length || 0), v)');
continue; continue;
} }
@ -957,14 +885,13 @@ Tput.prototype._compile = function(val, key, info) {
if (read(/^%([+\-*\/m&|\^=><])/)) { if (read(/^%([+\-*\/m&|\^=><])/)) {
if (op === '=') op = '==='; if (op === '=') op = '===';
else if (op === 'm') op = '%'; else if (op === 'm') op = '%';
expr('(stack.push(v = (stack.pop() ' + op + ' stack.pop())), v)'); expr('(stack.push(v = (stack.pop() ' + op + ' stack.pop()) || 0), v)');
continue; continue;
} }
// %A, %O // %A, %O
// logical AND and OR operations (for conditionals) // logical AND and OR operations (for conditionals)
if (read(/^%([AO])/)) { if (read(/^%([AO])/)) {
// stmt(op === 'A' ? ' && ' : ' || ');
// Are we supposed to store the result on the stack? // Are we supposed to store the result on the stack?
expr('(stack.push(v = (stack.pop() ' expr('(stack.push(v = (stack.pop() '
+ (op === 'A' ? '&&' : '||') + (op === 'A' ? '&&' : '||')
@ -981,11 +908,12 @@ Tput.prototype._compile = function(val, key, info) {
// %i add 1 to first two parameters (for ANSI terminals) // %i add 1 to first two parameters (for ANSI terminals)
if (read(/^%i/)) { if (read(/^%i/)) {
// expr('(params[0] = params[0] || 0, params[1] = params[1] || 0)');
// Are these supposed to go on the stack in certain situations? // Are these supposed to go on the stack in certain situations?
// ncurses doesn't seem to put them on the stack, but xterm.user6 // ncurses doesn't seem to put them on the stack, but xterm.user6
// seems to assume they're on the stack for some reason. Could // seems to assume they're on the stack for some reason. Could
// just be a bad terminfo string. // just be a bad terminfo string.
// user6: "\u001b[%i%d;%dR" - possibly a termcap-style string.
// expr('(params[0] |= 0, params[1] |= 0, params[0]++, params[1]++)');
expr('(params[0]++, params[1]++)'); expr('(params[0]++, params[1]++)');
continue; continue;
} }
@ -1041,66 +969,11 @@ Tput.prototype._compile = function(val, key, info) {
} }
if (read(/^%;/)) { if (read(/^%;/)) {
fi = then = els = end = null; end = null;
stmt('}'); stmt('}');
continue; continue;
} }
// Binary operations are in postfix form with the operands in the usual
// order. That is, to get x-5 one would use "%gx%{5}%-". %P and %g vari
// ables are persistent across escape-string evaluations.
// Consider the HP2645, which, to get to row 3 and column 12, needs to be
// sent \E&a12c03Y padded for 6 milliseconds. Note that the order of the
// rows and columns is inverted here, and that the row and column are
// printed as two digits. Thus its cup capability is
// “cup=6\E&%p2%2dc%p1%2dY”.
// The Microterm ACT-IV needs the current row and column sent
// preceded by a ^T, with the row and column simply encoded in
// binary, “cup=^T%p1%c%p2%c”. Terminals which use “%c” need to be able
// to backspace the cursor (cub1), and to move the cursor up one line
// on the screen (cuu1). This is necessary because it is not always safe
// to transmit \n ^D and \r, as the system may change or discard them.
// (The library routines dealing with terminfo set tty modes so that tabs
// are never expanded, so \t is safe to send. This turns out to be
// essential for the Ann Arbor 4080.)
// A final example is the LSI ADM-3a, which uses row and column offset
// by a blank character, thus “cup=\E=%p1%' '%+%c%p2%' '%+%c”. After
// sending `\E=', this pushes the first parameter, pushes the ASCII value
// for a space (32), adds them (pushing the sum on the stack in place of
// the two previous values) and outputs that value as a character.
// Then the same is done for the second parameter. More complex
// arithmetic is possible using the stack.
// $ man termcap
// Disabled for now since we can convert termcap strings to terminfo.
if (0 && info.termcap) {
// %r Single parameter capability
if (read(/^%r/)) {
continue;
}
// %+ Add value of next character to this parameter and do binary output
// if (read(/^%\+/)) {
// echo('stack.pop()');
// continue;
// }
// %2 Do ASCII output of this parameter with a field with of 2
if (read(/^%2/)) {
echo('stack.pop()');
continue;
}
// %d Do ASCII output of this parameter with a field with of 3
// if (read(/^%d/)) {
// echo('stack.pop()');
// continue;
// }
}
buff += val[0]; buff += val[0];
val = val.substring(1); val = val.substring(1);
} }
@ -1144,7 +1017,7 @@ Tput.prototype._compile = function(val, key, info) {
// Terminfos `wyse350-vb`, and `wy350-w` // Terminfos `wyse350-vb`, and `wy350-w`
// seem to have a few broken strings. // seem to have a few broken strings.
if (_val === '\u001b%?') { if (str === '\u001b%?') {
code = 'return "\\x1b";'; code = 'return "\\x1b";';
} }
@ -1165,8 +1038,8 @@ Tput.prototype._compile = function(val, key, info) {
: new Function('params', code); : new Function('params', code);
} catch (e) { } catch (e) {
console.error(''); console.error('');
console.error('Error on `' + _key + '` (' + info.name + '):'); console.error('Error on %s:', tkey);
console.error(JSON.stringify(_val)); console.error(JSON.stringify(str));
console.error(''); console.error('');
console.error(code.replace(/(,|;)/g, '$1\n')); console.error(code.replace(/(,|;)/g, '$1\n'));
e.stack = e.stack.replace(/\x1b/g, '\\x1b'); e.stack = e.stack.replace(/\x1b/g, '\\x1b');
@ -1268,12 +1141,11 @@ Tput.prototype.readTermcap = function(term) {
root.inherits = root.inherits || []; root.inherits = root.inherits || [];
root.inherits.push(term.strings.tc); root.inherits.push(term.strings.tc);
if (self.debug) { var names = terms[term.strings.tc]
var names = terms[term.strings.tc] ? terms[term.strings.tc].names
? terms[term.strings.tc].names : [term.strings.tc];
: [term.strings.tc];
console.log(term.names.join('/') + ' inherits from ' + names.join('/')); self._debug(term.names.join('/') + ' inherits from ' + names.join('/'));
}
var inherit = tc(terms[term.strings.tc]); var inherit = tc(terms[term.strings.tc]);
if (inherit) { if (inherit) {
@ -1417,9 +1289,7 @@ Tput.prototype.translateTermcap = function(info) {
if (!info) return; if (!info) return;
if (this.debug) { this._debug(info);
console.log(info);
}
['name', 'names', 'desc', 'file', 'termcap'].forEach(function(key) { ['name', 'names', 'desc', 'file', 'termcap'].forEach(function(key) {
out[key] = info[key]; out[key] = info[key];
@ -1450,7 +1320,7 @@ Tput.prototype.translateTermcap = function(info) {
out[key] = {}; out[key] = {};
Object.keys(info[key]).forEach(function(cap) { Object.keys(info[key]).forEach(function(cap) {
if (key === 'strings') { if (key === 'strings') {
info.strings[cap] = captoinfo(cap, info.strings[cap], 1, self.debug); info.strings[cap] = self._captoinfo(cap, info.strings[cap], 1);
} }
if (talias[cap]) { if (talias[cap]) {
out[key][talias[cap][0]] = info[key][cap]; out[key][talias[cap][0]] = info[key][cap];
@ -1489,7 +1359,9 @@ Tput.prototype.injectTermcap = function(term) {
* pad translations if >=0 * pad translations if >=0
*/ */
function captoinfo(cap, s, parameterized, debug) { Tput.prototype._captoinfo = function(cap, s, parameterized) {
var self = this;
var capstart; var capstart;
if (parameterized == null) { if (parameterized == null) {
@ -1509,8 +1381,9 @@ function captoinfo(cap, s, parameterized, debug) {
, out = ''; , out = '';
function warn() { function warn() {
if (!debug) return; var args = Array.prototype.slice.call(arguments);
console.log.apply(console, arguments); args[0] = 'captoinfo: ' + (args[0] || '');
return self._debug.apply(self, args);
} }
function isdigit(ch) { function isdigit(ch) {
@ -1941,15 +1814,21 @@ function captoinfo(cap, s, parameterized, debug) {
} }
return out; return out;
} };
/** /**
* Compile All Terminfo * Compile All Terminfo
*/ */
Tput.prototype.compileAll = function(start) { Tput.prototype.getAll = function() {
var self = this var dir = this._prefix()
, all = {}; , list = asort(fs.readdirSync(dir))
, infos = [];
list.forEach(function(letter) {
var terms = asort(fs.readdirSync(path.resolve(dir, letter)));
infos.push.apply(infos, terms);
});
function asort(obj) { function asort(obj) {
return obj.sort(function(a, b) { return obj.sort(function(a, b) {
@ -1959,19 +1838,20 @@ Tput.prototype.compileAll = function(start) {
}); });
} }
var dir = this._prefix() return infos;
, list = asort(fs.readdirSync(dir)); };
list.forEach(function(letter) { Tput.prototype.compileAll = function(start) {
var infos = asort(fs.readdirSync(path.resolve(dir, letter))); var self = this
infos.forEach(function(name) { , all = {};
if (start && name !== start) {
return; this.getAll().forEach(function(name) {
} else { if (start && name !== start) {
start = null; return;
} } else {
all[name] = self.compileTerminfo(name); start = null;
}); }
all[name] = self.compileTerminfo(name);
}); });
return all; return all;
@ -2150,12 +2030,14 @@ function sprintf(src) {
return src.replace(rule, function(_, flag, width, type) { return src.replace(rule, function(_, flag, width, type) {
var flags = (flag || '').split('') var flags = (flag || '').split('')
, param = params[i++] || '' , param = params[i] != null ? params[i] : ''
, initial = param , initial = param
, width = +width , width = +width
, opt = {} , opt = {}
, pre = ''; , pre = '';
i++;
switch (type) { switch (type) {
case 'd': // signed int case 'd': // signed int
param = (+param).toString(10); param = (+param).toString(10);
@ -2172,11 +2054,9 @@ function sprintf(src) {
case 's': // string case 's': // string
break; break;
case 'c': // char case 'c': // char
// Should return here?
param = isFinite(param) param = isFinite(param)
? String.fromCharCode(param) ? String.fromCharCode(param || 0200)
: param[0]; : '';
//: '';
break; break;
} }

View File

@ -595,7 +595,7 @@ return "\n";
Compiling scroll_reverse: "\u001bM" Compiling scroll_reverse: "\u001bM"
return "\x1bM"; return "\x1bM";
Compiling set_attributes: "%?%p9%t\u001b(0%e\u001b(B%;\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m" Compiling set_attributes: "%?%p9%t\u001b(0%e\u001b(B%;\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m"
var v, stack = [], out = "";;if ((stack.push(v = params[8]), v)) {out += "\x1b(0"} else {out += "\x1b(B"}out += "\x1b[0";if ((stack.push(v = params[5]), v)) {out += ";1"};if ((stack.push(v = params[1]), v)) {out += ";4"};if ((stack.push(v = params[0]), v),(stack.push(v = params[2]), v),(stack.push(v = (stack.pop() | stack.pop())), v)) {out += ";7"};if ((stack.push(v = params[3]), v)) {out += ";5"};if ((stack.push(v = params[6]), v)) {out += ";8"}out += "m";return out; var v, stack = [], out = "";;if ((stack.push(v = params[8]), v)) {out += "\x1b(0"} else {out += "\x1b(B"}out += "\x1b[0";if ((stack.push(v = params[5]), v)) {out += ";1"};if ((stack.push(v = params[1]), v)) {out += ";4"};if ((stack.push(v = params[0]), v),(stack.push(v = params[2]), v),(stack.push(v = (stack.pop() | stack.pop()) || 0), v)) {out += ";7"};if ((stack.push(v = params[3]), v)) {out += ";5"};if ((stack.push(v = params[6]), v)) {out += ";8"}out += "m";return out;
Compiling set_tab: "\u001bH" Compiling set_tab: "\u001bH"
return "\x1bH"; return "\x1bH";
Compiling tab: "\t" Compiling tab: "\t"
@ -749,9 +749,9 @@ return "\x1b[c";
Compiling orig_pair: "\u001b[39;49m" Compiling orig_pair: "\u001b[39;49m"
return "\x1b[39;49m"; return "\x1b[39;49m";
Compiling set_foreground: "\u001b[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m" Compiling set_foreground: "\u001b[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m"
var v, stack = [], out = "";out += "\x1b[3";if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "4"} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "6"} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "1"} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "3"} else {out += (params[0] || "")}out += "m";return out; var v, stack = [], out = "";out += "\x1b[3";if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "4"} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "6"} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "1"} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "3"} else {out += (params[0] || "")}out += "m";return out;
Compiling set_background: "\u001b[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m" Compiling set_background: "\u001b[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m"
var v, stack = [], out = "";out += "\x1b[4";if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "4"} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "6"} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "1"} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop())), v)) {out += "3"} else {out += (params[0] || "")}out += "m";return out; var v, stack = [], out = "";out += "\x1b[4";if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "4"} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "6"} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "1"} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out += "3"} else {out += (params[0] || "")}out += "m";return out;
Compiling key_mouse: "\u001b[M" Compiling key_mouse: "\u001b[M"
return "\x1b[M"; return "\x1b[M";
Compiling set_a_foreground: "\u001b[3%p1%dm" Compiling set_a_foreground: "\u001b[3%p1%dm"

View File

@ -81,7 +81,7 @@ function parseArg() {
var argv = parseArg(); var argv = parseArg();
var tput = blessed.tput({ var tput = blessed.tput({
term: argv[0] && argv[0] !== 'all' ? argv[0] : 'xterm', term: argv[0] && argv[0] !== 'all' && argv[0] !== 'rand' ? argv[0] : 'xterm',
extended: true, extended: true,
debug: true, debug: true,
termcap: argv.termcap, termcap: argv.termcap,
@ -122,6 +122,14 @@ if (!argv[0] || argv[0] === 'all') {
return; return;
} }
if (argv[0] === 'rand') {
var terms = tput.getAll();
var term = terms[(terms.length - 1) * Math.random() | 0];
console.log('Compiling ' + term + '...');
tput.compileTerminfo(term);
return;
}
// console.log('Max colors: %d.', tput.colors); // console.log('Max colors: %d.', tput.colors);
// console.log(tput.strings.acs_chars.split('').map(function(ch) { return ch.charCodeAt(0); })); // console.log(tput.strings.acs_chars.split('').map(function(ch) { return ch.charCodeAt(0); }));