more work
This commit is contained in:
parent
59cc5d73c3
commit
fe2d881a08
|
@ -4,3 +4,5 @@ var tput = new Tput(process.argv[2] || 'xterm');
|
||||||
tput.colors();
|
tput.colors();
|
||||||
|
|
||||||
console.log(tput.info);
|
console.log(tput.info);
|
||||||
|
|
||||||
|
tput._compile('%?%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');
|
||||||
|
|
99
lib/tput.js
99
lib/tput.js
|
@ -303,22 +303,39 @@ Tput.prototype._compile = function(val) {
|
||||||
// CSI Ps ; Ps r
|
// CSI Ps ; Ps r
|
||||||
// CSI ? Pm r
|
// CSI ? Pm r
|
||||||
|
|
||||||
var code = 'var dyn = {}, stat = {}, stack = [], out = []; out.push("';
|
//var code = 'var dyn = {}, stat = {}, stack = [], out = []; out.push("';
|
||||||
|
var ch, op, i;
|
||||||
|
var code = 'var v, dyn = {}, stat = {}, stack = [], out = []; function o(a){out.push(a);return a}'
|
||||||
|
, buff = '';
|
||||||
|
|
||||||
// man terminfo, around line 940
|
// man terminfo, around line 940
|
||||||
|
|
||||||
|
function b() {
|
||||||
|
if (buff) {
|
||||||
|
code += 'o("';
|
||||||
|
code += buff.replace(/([\r\n"])/g, '\\$1');
|
||||||
|
code += '")';
|
||||||
|
buff = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (val) {
|
while (val) {
|
||||||
// '\e' -> ^[
|
// '\e' -> ^[
|
||||||
if (cap = /^\\e/gi.exec(val)) {
|
if (cap = /^\\e/gi.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o("';
|
||||||
code += '\x1b';
|
code += '\x1b';
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// '^A' -> ^A
|
// '^A' -> ^A
|
||||||
if (cap = /^\^(.)/gi.exec(val)) { // case-insensitive?
|
if (cap = /^\^(.)/gi.exec(val)) { // case-insensitive?
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
|
code += 'o("';
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '@':
|
case '@':
|
||||||
code += '\x00';
|
code += '\x00';
|
||||||
|
@ -420,6 +437,7 @@ Tput.prototype._compile = function(val) {
|
||||||
code += '\x7f';
|
code += '\x7f';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,8 +445,10 @@ Tput.prototype._compile = function(val) {
|
||||||
// '\r' -> \r
|
// '\r' -> \r
|
||||||
// '\0' -> \200 (special case)
|
// '\0' -> \200 (special case)
|
||||||
if (cap = /^\\([nlrtbfs\^\\,:0])/g.exec(val)) {
|
if (cap = /^\\([nlrtbfs\^\\,:0])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
|
code += 'o("';
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'n':
|
case 'n':
|
||||||
return '\n';
|
return '\n';
|
||||||
|
@ -454,30 +474,40 @@ Tput.prototype._compile = function(val) {
|
||||||
//return '\0';
|
//return '\0';
|
||||||
return '\200';
|
return '\200';
|
||||||
}
|
}
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3 octal digits -> character
|
// 3 octal digits -> character
|
||||||
if (cap = /^\\(\d\d\d)/g.exec(val)) {
|
if (cap = /^\\(\d\d\d)/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
|
code += 'o("';
|
||||||
code += String.fromCharCode(parseInt(ch, 8));
|
code += String.fromCharCode(parseInt(ch, 8));
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// $<5> -> padding
|
// $<5> -> padding
|
||||||
if (cap = /^\$<(\d+)>(\*|\/)/g.exec(val)) {
|
if (cap = /^\$<(\d+)>(\*|\/)/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
|
code += 'o("';
|
||||||
code += Array(+ch + 1).join(' '); // "padding" characters?
|
code += Array(+ch + 1).join(' '); // "padding" characters?
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// man terminfo, around page 1034
|
// man terminfo, around page 1034
|
||||||
// %% outputs `%'
|
// %% outputs `%'
|
||||||
if (cap = /^%%/g.exec(val)) {
|
if (cap = /^%%/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o("';
|
||||||
code += '%';
|
code += '%';
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -485,45 +515,62 @@ Tput.prototype._compile = function(val) {
|
||||||
// as in printf, flags are [-+#] and space. Use a `:' to allow the
|
// as in printf, flags are [-+#] and space. Use a `:' to allow the
|
||||||
// next character to be a `-' flag, avoiding interpreting "%-" as an
|
// next character to be a `-' flag, avoiding interpreting "%-" as an
|
||||||
// operator.
|
// operator.
|
||||||
if (cap = /^%(?:(:)?([\-+# ]+)?)(?:(\d+)(\.\d+)?)?([doxXs])?/g.exec(val)) {
|
if (cap = /^%(?:(:)?([\-+# ]+))(?:(\d+)(\.\d+)?)?([doxXs])?/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o("';
|
||||||
code += 'TODO';
|
code += 'TODO';
|
||||||
|
code += '")';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %c print pop() like %c in printf
|
// %c print pop() like %c in printf
|
||||||
if (cap = /^%c/g.exec(val)) {
|
if (cap = /^%c/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o(';
|
||||||
code += 'stack.pop()'; // TODO: FORMAT
|
code += 'stack.pop()'; // TODO: FORMAT
|
||||||
|
code += ')';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %d print pop() like %d in printf
|
// %d print pop() like %d in printf
|
||||||
// NOT SURE ABOUT %d being print!
|
// NOT SURE ABOUT %d being print!
|
||||||
if (cap = /^%d/g.exec(val)) {
|
if (cap = /^%d/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o(';
|
||||||
code += 'stack.pop()'; // TODO: FORMAT
|
code += 'stack.pop()'; // TODO: FORMAT
|
||||||
|
code += ')';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %s print pop() like %s in printf
|
// %s print pop() like %s in printf
|
||||||
if (cap = /^%s/g.exec(val)) {
|
if (cap = /^%s/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
|
code += 'o(';
|
||||||
code += 'stack.pop()'; // TODO: FORMAT
|
code += 'stack.pop()'; // TODO: FORMAT
|
||||||
|
code += ')';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %p[1-9]
|
// %p[1-9]
|
||||||
// push i'th parameter
|
// push i'th parameter
|
||||||
if (cap = /^%p([1-9])/g.exec(val)) {
|
if (cap = /^%p([1-9])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += 'params[i]';
|
i = cap[1];
|
||||||
|
//code += 'o(';
|
||||||
|
code += 'params[' + (i - 1) + ']';
|
||||||
|
//code += ')';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %P[a-z]
|
// %P[a-z]
|
||||||
// set dynamic variable [a-z] to pop()
|
// set dynamic variable [a-z] to pop()
|
||||||
if (cap = /^%P([a-z])/g.exec(val)) {
|
if (cap = /^%P([a-z])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
v = cap[1];
|
v = cap[1];
|
||||||
code += 'dyn.' + v + ' = stack.pop()';
|
code += 'dyn.' + v + ' = stack.pop()';
|
||||||
|
@ -533,6 +580,7 @@ Tput.prototype._compile = function(val) {
|
||||||
// %g[a-z]
|
// %g[a-z]
|
||||||
// get dynamic variable [a-z] and push it
|
// get dynamic variable [a-z] and push it
|
||||||
if (cap = /^%g([a-z])/g.exec(val)) {
|
if (cap = /^%g([a-z])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
v = cap[1];
|
v = cap[1];
|
||||||
code += '(stack.push(dyn.' + v + '), dyn.' + v + ')';
|
code += '(stack.push(dyn.' + v + '), dyn.' + v + ')';
|
||||||
|
@ -542,6 +590,7 @@ Tput.prototype._compile = function(val) {
|
||||||
// %P[A-Z]
|
// %P[A-Z]
|
||||||
// set static variable [a-z] to pop()
|
// set static variable [a-z] to pop()
|
||||||
if (cap = /^%P([A-Z])/g.exec(val)) {
|
if (cap = /^%P([A-Z])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
v = cap[1];
|
v = cap[1];
|
||||||
code += 'stat.' + v + ' = stack.pop()';
|
code += 'stat.' + v + ' = stack.pop()';
|
||||||
|
@ -558,14 +607,16 @@ Tput.prototype._compile = function(val) {
|
||||||
// impact portability to other implementations.
|
// impact portability to other implementations.
|
||||||
|
|
||||||
if (cap = /^%g([A-Z])/g.exec(val)) {
|
if (cap = /^%g([A-Z])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
v = cap[1];
|
v = cap[1];
|
||||||
code += 'stack.push(stat.' + v + ')';
|
code += '(stack.push(v = stat.' + v + '), v)';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %'c' char constant c
|
// %'c' char constant c
|
||||||
if (cap = /^%'(\w)'/g.exec(val)) {
|
if (cap = /^%'(\w)'/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
code += '"' + ch + '"';
|
code += '"' + ch + '"';
|
||||||
|
@ -575,6 +626,7 @@ Tput.prototype._compile = function(val) {
|
||||||
// %{nn}
|
// %{nn}
|
||||||
// integer constant nn
|
// integer constant nn
|
||||||
if (cap = /^%\{(\d+)\}/g.exec(val)) {
|
if (cap = /^%\{(\d+)\}/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
ch = cap[1];
|
ch = cap[1];
|
||||||
code += '(' + ch + ')';
|
code += '(' + ch + ')';
|
||||||
|
@ -583,8 +635,9 @@ Tput.prototype._compile = function(val) {
|
||||||
|
|
||||||
// %l push strlen(pop)
|
// %l push strlen(pop)
|
||||||
if (cap = /^%l/g.exec(val)) {
|
if (cap = /^%l/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += 'stack.push(stack.pop().length)';
|
code += '(stack.push(v = stack.pop().length), v)';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,17 +648,19 @@ Tput.prototype._compile = function(val) {
|
||||||
// %= %> %<
|
// %= %> %<
|
||||||
// logical operations: push(pop() op pop())
|
// logical operations: push(pop() op pop())
|
||||||
if (cap = /^%([+\-*\/m&|\^=><])/g.exec(val)) {
|
if (cap = /^%([+\-*\/m&|\^=><])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
op = cap[1];
|
op = cap[1];
|
||||||
if (op === '=') op = '===';
|
if (op === '=') op = '===';
|
||||||
else if (op === 'm') op = '%';
|
else if (op === 'm') op = '%';
|
||||||
code += 'stack.push(stack.pop() ' + op + ' stack.pop())';
|
code += '(stack.push(v = stack.pop() ' + op + ' stack.pop()), v)';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %A, %O
|
// %A, %O
|
||||||
// logical AND and OR operations (for conditionals)
|
// logical AND and OR operations (for conditionals)
|
||||||
if (cap = /^%([AO])/g.exec(val)) {
|
if (cap = /^%([AO])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
op = cap[1];
|
op = cap[1];
|
||||||
code += op === ' A ' ? ' && ' : ' || ';
|
code += op === ' A ' ? ' && ' : ' || ';
|
||||||
|
@ -615,14 +670,16 @@ Tput.prototype._compile = function(val) {
|
||||||
// %! %~
|
// %! %~
|
||||||
// unary operations (logical and bit complement): push(op pop())
|
// unary operations (logical and bit complement): push(op pop())
|
||||||
if (cap = /^%([!~])/g.exec(val)) {
|
if (cap = /^%([!~])/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
op = cap[1];
|
op = cap[1];
|
||||||
code += 'stack.push(' + op + 'stack.pop())';
|
code += '(stack.push(v = ' + op + 'stack.pop()), v)';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// %i add 1 to first two parameters (for ANSI terminals)
|
// %i add 1 to first two parameters (for ANSI terminals)
|
||||||
if (cap = /^%i/g.exec(val)) {
|
if (cap = /^%i/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += '(params[0]++, params[1]++)';
|
code += '(params[0]++, params[1]++)';
|
||||||
continue;
|
continue;
|
||||||
|
@ -644,26 +701,34 @@ Tput.prototype._compile = function(val) {
|
||||||
// written on one line. The -f option splits the string into lines with
|
// written on one line. The -f option splits the string into lines with
|
||||||
// the parts indented.
|
// the parts indented.
|
||||||
if (cap = /^%\?/g.exec(val)) {
|
if (cap = /^%\?/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += '"); if (';
|
//code += '"); if (';
|
||||||
|
code += 'if (';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cap = /^%t/g.exec(val)) {
|
if (cap = /^%t/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += ') { out.push("';
|
//code += ') { out.push("';
|
||||||
|
code += ') {';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cap = /^%e/g.exec(val)) {
|
if (cap = /^%e/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += '"); } else { out.push("';
|
//code += '"); } else { out.push("';
|
||||||
|
code += '} else {';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cap = /^%;/g.exec(val)) {
|
if (cap = /^%;/g.exec(val)) {
|
||||||
|
b();
|
||||||
val = val.substring(cap[0].length);
|
val = val.substring(cap[0].length);
|
||||||
code += '"); } out.push("';
|
//code += '"); } out.push("';
|
||||||
|
code += '}';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,13 +760,19 @@ Tput.prototype._compile = function(val) {
|
||||||
// Then the same is done for the second parameter. More complex
|
// Then the same is done for the second parameter. More complex
|
||||||
// arithmetic is possible using the stack.
|
// arithmetic is possible using the stack.
|
||||||
|
|
||||||
code += val[0];
|
buff += val[0];
|
||||||
val = val.substring(1);
|
val = val.substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
code += '"); return out.join("");';
|
code += 'return out.join("");';
|
||||||
|
|
||||||
return new Function('params', code);
|
console.log(code.replace(/\x1b/g, '\\x1b'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
return new Function('params', code);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return alias if one exists.
|
// Return alias if one exists.
|
||||||
|
|
Loading…
Reference in New Issue