UNPKG

objj-runtime

Version:

JavaScript (ECMAScript) and Objective-J runtime

198 lines (174 loc) 5.54 kB
// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License // reference: http://ascii-table.com/ansi-escape-sequences-vt-100.php // Modified for Node 2021 by Martin Carlberg var terms = [ 'ansi', 'vt100', 'xterm', 'xtermc', 'xterm-color', 'xterm-256color', 'gnome-terminal' ]; exports.Stream = function () { var self = Object.create(process.stdout); var output = process.stdout; var errput = process.stderr; var env = process.env || {}; var fore = ""; var back = ""; var bold = "0"; var stack = []; var enabled = terms.indexOf(env.TERM) >= 0; self.enable = function () { enabled = true; }; self.disable = function () { enabled = false; }; self.writeCode = function (code) { if (enabled) { //output.flush(); errput.write(code); } return self; }; self.print = function () { // todo recordSeparator, fieldSeparator self.write(Array.prototype.join.call(arguments, " ") + "\n"); //self.flush(); return self; }; self.printError = function () { // todo recordSeparator, fieldSeparator self.write(Array.prototype.join.call(arguments, " ") + "\n", true); //self.flush(); return self; }; self.write = function (string, error) { var toput = error ? errput : output; var at = 0; self.update(bold, fore, back); while (at < string.length) { var pos = string.indexOf("\0", at); if (pos == -1) { // no additional marks, advanced to end toput.write(string.substring(at, string.length)); at = string.length; } else { toput.write(string.substring(at, pos)); at = pos + 1; if (string.charAt(at) == ")") { if (!stack.length) throw new Error("No colors on the stack at " + at); var pair = stack.pop(); bold = pair[0]; fore = pair[1]; at = at + 1; self.update(bold, fore, back); } else { var paren = string.indexOf("(", at); stack.push([bold, fore, back]); var command = string.substring(at, paren); if (command == "bold") { bold = "1"; } else if (Object.prototype.hasOwnProperty.call(exports.colors, command)) { fore = exports.colors[command]; } else if ( /^:/.test(command) && Object.prototype.hasOwnProperty.call(exports.colors, command.substring(1)) ) { back = exports.colors[command.substring(1)]; } else { throw new Error("No such command: " + command); } self.update(bold, fore, back); at = paren + 1; } } } self.update("0", "", ""); return self; }; self.update = function (bold, fore, back) { return self.writeCode( "\033[" + [ bold, (fore.length ? "3" + fore : ""), (back.length ? "4" + back : ""), ].filter(function (string) { return string.length; }).join(";") + "m" ); }; self.moveTo = function (y, x) { return self.writeCode("\033[" + y + ";" + x + "H"); }; self.moveBy = function (y, x) { if (y == 0) { } else if (y < 0) { self.writeCode("\033[" + (-y) + "A"); } else { self.writeCode("\033[" + y + "B"); } if (x == 0) { } else if (x > 0) { self.writeCode("\033[" + x + "C"); } else { self.writeCode("\033[" + (-x) + "D"); } //errput.flush(); return self; }; self.home = function () { return self.writeCode("\033[H"); }; self.clear = function () { return self.writeCode("\033[2J"); }; self.clearUp = function () { return self.writeCode("\033[1J"); }; self.cearDown = function () { return self.writeCode("\033[J"); }; self.clearLine = function () { return self.writeCode("\033[2K"); }; self.clearLeft = function () { return self.writeCode("\033[1K"); }; self.clearRight = function () { return self.writeCode("\033[K"); }; self.update(bold, fore, back); self.error = {}; self.error.print = function () { return self.printError.apply(self, arguments); }; self.error.write = function (message) { return self.write(message, true); }; return self; }; exports.colors = { "black": "0", "red": "1", "green": "2", "orange": "3", "yellow": "3", "blue": "4", "violet": "5", "magenta": "5", "purple": "5", "cyan": "6", "white": "7" } exports.stream = new exports.Stream(); if (module.id == require.main) { exports.stream.print("white\0red(red\0blue(blue\0)red\0)white"); Object.keys(exports.colors).forEach(function (name) { exports.stream.print("\0" + name + "(" + name + "\0)"); exports.stream.print("\0bold(\0" + name + "(" + name + "\0)\0)"); }); }