267 lines
8.4 KiB
JavaScript
267 lines
8.4 KiB
JavaScript
|
|
// Generated by CoffeeScript 1.7.1
|
||
|
|
(function() {
|
||
|
|
var ANSI_BG, ANSI_BG_INTENSE, ANSI_CSI, ANSI_CUR_DOWN, ANSI_ESC, ANSI_FG, ANSI_FG_INTENSE, ANSI_RESET, ANSI_RETURN, ANSI_SEP, ANSI_TEXT_PROP;
|
||
|
|
|
||
|
|
ANSI_ESC = String.fromCharCode(0x1b);
|
||
|
|
|
||
|
|
ANSI_CSI = ANSI_ESC + '[';
|
||
|
|
|
||
|
|
ANSI_TEXT_PROP = 'm';
|
||
|
|
|
||
|
|
ANSI_RESET = '0';
|
||
|
|
|
||
|
|
ANSI_FG = '3';
|
||
|
|
|
||
|
|
ANSI_BG = '4';
|
||
|
|
|
||
|
|
ANSI_FG_INTENSE = '9';
|
||
|
|
|
||
|
|
ANSI_BG_INTENSE = '10';
|
||
|
|
|
||
|
|
ANSI_CUR_DOWN = 'B';
|
||
|
|
|
||
|
|
ANSI_SEP = ';';
|
||
|
|
|
||
|
|
ANSI_RETURN = 'A';
|
||
|
|
|
||
|
|
({
|
||
|
|
write: function() {
|
||
|
|
var attr, content, max_x, pixel, prevattr, x, y, _i, _j, _ref, _ref1;
|
||
|
|
content = "" + ANSI_CSI + "2J";
|
||
|
|
for (y = _i = 0, _ref = this.screen.length; 0 <= _ref ? _i < _ref : _i > _ref; y = 0 <= _ref ? ++_i : --_i) {
|
||
|
|
if (this.screen[y] == null) {
|
||
|
|
content += "\n";
|
||
|
|
}
|
||
|
|
if (this.screen[y] == null) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
for (x = _j = 0, _ref1 = this.getWidth(); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; x = 0 <= _ref1 ? ++_j : --_j) {
|
||
|
|
pixel = this.screen[y][x];
|
||
|
|
if (pixel == null) {
|
||
|
|
pixel = {
|
||
|
|
ch: ' ',
|
||
|
|
attr: 7
|
||
|
|
};
|
||
|
|
}
|
||
|
|
attr = this.gen_args(pixel.attr);
|
||
|
|
if (attr !== prevattr) {
|
||
|
|
content += "" + ANSI_CSI + "0;" + attr + ANSI_TEXT_PROP;
|
||
|
|
prevattr = attr;
|
||
|
|
}
|
||
|
|
content += pixel.ch != null ? pixel.ch : ' ';
|
||
|
|
max_x = x;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
content += "" + ANSI_CSI + "0m";
|
||
|
|
return this.toBinaryArray(content);
|
||
|
|
},
|
||
|
|
gen_args: function(attr) {
|
||
|
|
var a, attrs, bg, bl, fg, intense, _i, _len, _ref;
|
||
|
|
fg = 30 + (attr & 7);
|
||
|
|
bg = 40 + ((attr & 112) >> 4);
|
||
|
|
bl = attr & 128 ? 5 : '';
|
||
|
|
intense = attr & 8 ? 1 : '';
|
||
|
|
_ref = [fg, bg, bl, intense];
|
||
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||
|
|
a = _ref[_i];
|
||
|
|
if (a !== '') {
|
||
|
|
attrs = a;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return [fg, bg, bl, intense].join(";");
|
||
|
|
},
|
||
|
|
parse: function(content) {
|
||
|
|
var arg, args, ch, i, _i, _j, _k, _l, _len, _m, _n, _o, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _results;
|
||
|
|
this.screen = [];
|
||
|
|
this.state = 0;
|
||
|
|
this.x = 0;
|
||
|
|
this.y = 0;
|
||
|
|
this.save_x = 0;
|
||
|
|
this.save_y = 0;
|
||
|
|
this.attr = 7;
|
||
|
|
this.argbuf = '';
|
||
|
|
content = content.split('');
|
||
|
|
_results = [];
|
||
|
|
while (ch = content.shift()) {
|
||
|
|
if (this.state === 0) {
|
||
|
|
switch (ch) {
|
||
|
|
case "\x1a":
|
||
|
|
_results.push(this.state = 3);
|
||
|
|
break;
|
||
|
|
case "\x1b":
|
||
|
|
_results.push(this.state = 1);
|
||
|
|
break;
|
||
|
|
case "\n":
|
||
|
|
this.x = 0;
|
||
|
|
_results.push(this.y++);
|
||
|
|
break;
|
||
|
|
case "\r":
|
||
|
|
break;
|
||
|
|
case "\t":
|
||
|
|
i = (this.x + 1) % this.tabstop;
|
||
|
|
_results.push((function() {
|
||
|
|
var _results1;
|
||
|
|
_results1 = [];
|
||
|
|
while (i-- > 0) {
|
||
|
|
_results1.push(this.putpixel(' '));
|
||
|
|
}
|
||
|
|
return _results1;
|
||
|
|
}).call(this));
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
_results.push(this.putpixel(ch));
|
||
|
|
}
|
||
|
|
} else if (this.state === 1) {
|
||
|
|
if (ch !== "[") {
|
||
|
|
this.putpixel("\x1b");
|
||
|
|
this.putpixel("[");
|
||
|
|
_results.push(this.state = 0);
|
||
|
|
} else {
|
||
|
|
_results.push(this.state = 2);
|
||
|
|
}
|
||
|
|
} else if (this.state === 2) {
|
||
|
|
if (ch.match('[A-Za-z]')) {
|
||
|
|
args = (function() {
|
||
|
|
var _i, _len, _ref, _results1;
|
||
|
|
_ref = this.argbuf.split(';');
|
||
|
|
_results1 = [];
|
||
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||
|
|
i = _ref[_i];
|
||
|
|
_results1.push(parseInt(i));
|
||
|
|
}
|
||
|
|
return _results1;
|
||
|
|
}).call(this);
|
||
|
|
switch (ch) {
|
||
|
|
case "m":
|
||
|
|
for (_i = 0, _len = args.length; _i < _len; _i++) {
|
||
|
|
arg = args[_i];
|
||
|
|
if (arg === 0) {
|
||
|
|
this.attr = 7;
|
||
|
|
} else if (arg === 1) {
|
||
|
|
this.attr |= 8;
|
||
|
|
} else if (arg === 5) {
|
||
|
|
this.attr |= 128;
|
||
|
|
} else if ((30 <= arg && arg <= 37)) {
|
||
|
|
this.attr &= 248;
|
||
|
|
this.attr |= arg - 30;
|
||
|
|
} else if ((40 <= arg && arg <= 47)) {
|
||
|
|
this.attr &= 143;
|
||
|
|
this.attr |= (arg - 40) << 4;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "H":
|
||
|
|
case "f":
|
||
|
|
this.y = (args[0] || 1) - 1;
|
||
|
|
this.x = (args[1] || 1) - 1;
|
||
|
|
if (this.y < 0) {
|
||
|
|
this.y = 0;
|
||
|
|
}
|
||
|
|
if (this.x < 0) {
|
||
|
|
this.x = 0;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "A":
|
||
|
|
this.y -= args[0] || 1;
|
||
|
|
if (this.y < 0) {
|
||
|
|
this.y = 0;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "B":
|
||
|
|
this.y += args[0] || 1;
|
||
|
|
break;
|
||
|
|
case "C":
|
||
|
|
this.x += args[0] || 1;
|
||
|
|
break;
|
||
|
|
case "D":
|
||
|
|
this.x -= args[0] || 1;
|
||
|
|
if (this.x < 0) {
|
||
|
|
this.x = 0;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "E":
|
||
|
|
this.y += args[0] || 1;
|
||
|
|
this.x = 0;
|
||
|
|
break;
|
||
|
|
case "F":
|
||
|
|
this.y -= args[0] || 1;
|
||
|
|
if (this.y > 0) {
|
||
|
|
this.y = 0;
|
||
|
|
}
|
||
|
|
this.x = 0;
|
||
|
|
break;
|
||
|
|
case "G":
|
||
|
|
this.x = (args[0] || 1) - 1;
|
||
|
|
break;
|
||
|
|
case "s":
|
||
|
|
this.save_x = this.x;
|
||
|
|
this.save_y = this.y;
|
||
|
|
break;
|
||
|
|
case "u":
|
||
|
|
this.x = this.save_x;
|
||
|
|
this.y = this.save_y;
|
||
|
|
break;
|
||
|
|
case "J":
|
||
|
|
if (args.length === 0 || args[0] === 0) {
|
||
|
|
for (i = _j = _ref = this.y + 1, _ref1 = screen.length - 1; _ref <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = _ref <= _ref1 ? ++_j : --_j) {
|
||
|
|
this.screen[i] = null;
|
||
|
|
}
|
||
|
|
for (i = _k = _ref2 = this.x, _ref3 = screen[this.y].length - 1; _ref2 <= _ref3 ? _k <= _ref3 : _k >= _ref3; i = _ref2 <= _ref3 ? ++_k : --_k) {
|
||
|
|
this.screen[this.y][i] = null;
|
||
|
|
}
|
||
|
|
} else if (args[0] === 1) {
|
||
|
|
for (i = _l = 0, _ref4 = this.y - 1; 0 <= _ref4 ? _l <= _ref4 : _l >= _ref4; i = 0 <= _ref4 ? ++_l : --_l) {
|
||
|
|
this.screen[i] = null;
|
||
|
|
}
|
||
|
|
for (i = _m = 0, _ref5 = this.x; 0 <= _ref5 ? _m <= _ref5 : _m >= _ref5; i = 0 <= _ref5 ? ++_m : --_m) {
|
||
|
|
this.screen[this.y][i] = null;
|
||
|
|
}
|
||
|
|
} else if (args[0] === 2) {
|
||
|
|
this.x = 0;
|
||
|
|
this.y = 0;
|
||
|
|
this.screen = [];
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "K":
|
||
|
|
if (args.length === 0 || args[0] === 0) {
|
||
|
|
for (i = _n = _ref6 = this.x, _ref7 = this.screen[this.y].length - 1; _ref6 <= _ref7 ? _n <= _ref7 : _n >= _ref7; i = _ref6 <= _ref7 ? ++_n : --_n) {
|
||
|
|
this.screen[this.y][i] = null;
|
||
|
|
}
|
||
|
|
} else if (args[0] === 1) {
|
||
|
|
for (i = _o = 0, _ref8 = this.x; 0 <= _ref8 ? _o <= _ref8 : _o >= _ref8; i = 0 <= _ref8 ? ++_o : --_o) {
|
||
|
|
this.screen[this.y][i] = null;
|
||
|
|
}
|
||
|
|
} else if (args[0] === 2) {
|
||
|
|
this.screen[this.y] = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.argbuf = '';
|
||
|
|
_results.push(this.state = 0);
|
||
|
|
} else {
|
||
|
|
_results.push(this.argbuf += ch);
|
||
|
|
}
|
||
|
|
} else if (this.state === 3) {
|
||
|
|
break;
|
||
|
|
} else {
|
||
|
|
_results.push(this.state = 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return _results;
|
||
|
|
},
|
||
|
|
putpixel: function(ch) {
|
||
|
|
if (this.screen[this.y] == null) {
|
||
|
|
this.screen[this.y] = [];
|
||
|
|
}
|
||
|
|
this.screen[this.y][this.x] = {
|
||
|
|
ch: ch,
|
||
|
|
attr: this.attr
|
||
|
|
};
|
||
|
|
if (++this.x >= this.linewrap) {
|
||
|
|
this.x = 0;
|
||
|
|
return this.y++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
}).call(this);
|