123 lines · 2.1 KB · JavaScript
RawDownload
var consbuf = "";var unread = "";var backlog = "";var online = [];var onnote = [];var rawmode = false;var holdmode = false; function fromutf8(s) {	return decodeURIComponent(escape(s));} function toutf8(s) {	return unescape(encodeURIComponent(s));}  functionwriteterminal(msg){	var ta = document.getElementById("terminal");	backlog += msg;	ta.firstChild.nodeValue = fromutf8(backlog + consbuf) + "\u2588";	ta.scrollTop = ta.scrollHeight;} functionprint(msg){	writeterminal(toutf8(msg));} functionflush() {	if(holdmode && !rawmode){		writeterminal("");		return;	}	unread += consbuf;	if(!rawmode)		backlog += consbuf;	consbuf = "";	writeterminal("");	if(online.length > 0)		online.shift()(consbuf);	while(unread != "" && online.length > 0)		online.shift()(consbuf);} functionnote(s){	while(onnote.length > 0)		onnote.shift()(s);} functionaddchar(c){	if(c == 127){		note("interrupt");		return;	}	if(c == 8){		consbuf = consbuf.substring(0, consbuf.length - 1);		writeterminal("");		return;	}	if(c == 23){		consbuf = consbuf.substring(0, consbuf.lastIndexOf(' '));		writeterminal("");		return;	}	if(c == 21){		consbuf = consbuf.substring(0, consbuf.lastIndexOf('\n'));		writeterminal("");		return;	}	if(c == 4){		flush();		return;	}	if(c == 13){		consbuf += "\n";		flush();		return;	}	if(c == 27){		holdmode = !holdmode;		if(holdmode){			var ta = document.getElementById("terminal");			ta.style.backgroundColor = 'black';			ta.style.color = 'white';		} else {			var ta = document.getElementById("terminal");			ta.style.backgroundColor = 'white';			ta.style.color = 'black';			if(consbuf != "")				flush();		}		return;	}	consbuf += toutf8(String.fromCharCode(c));	if(rawmode)		flush();	else		writeterminal("");} functionreadterminal(c, f, t){	if(unread != ""){		f(unread.substring(0, c));		unread = unread.substring(c);	} else {		if(t != undefined){			var l = online.length;			onflush(t, function() { online.splice(l, 1); });		}		online.push(function() { f(unread.substring(0, c)); unread = unread.substring(c); })	}}