alpha-one
Version:
ideas about recurring tasks in Web- and Backend-Application building
392 lines (363 loc) • 9.46 kB
JavaScript
// Generated by CoffeeScript 1.7.1
(function() {
var TRM, alert, ansi_vt100_cc_matcher, badge, colortext, debug, help, info, log, njs_path, rgb_hex_by_vt100_colorcode, rpr, warn;
njs_path = require('path');
TRM = require('coffeenode-trm');
rpr = TRM.rpr.bind(TRM);
badge = 'ansi256';
log = TRM.get_logger('plain', badge);
info = TRM.get_logger('info', badge);
alert = TRM.get_logger('alert', badge);
debug = TRM.get_logger('debug', badge);
warn = TRM.get_logger('warn', badge);
help = TRM.get_logger('help', badge);
rgb_hex_by_vt100_colorcode = {
'0': '000000',
'1': '800000',
'2': '008000',
'3': '808000',
'4': '000080',
'5': '800080',
'6': '008080',
'7': 'c0c0c0',
'8': '808080',
'9': 'ff0000',
'10': '00ff00',
'11': 'ffff00',
'12': '0000ff',
'13': 'ff00ff',
'14': '00ffff',
'15': 'ffffff',
'16': '000000',
'17': '00005f',
'18': '000087',
'19': '0000af',
'20': '0000d7',
'21': '0000ff',
'22': '005f00',
'23': '005f5f',
'24': '005f87',
'25': '005faf',
'26': '005fd7',
'27': '005fff',
'28': '008700',
'29': '00875f',
'30': '008787',
'31': '0087af',
'32': '0087d7',
'33': '0087ff',
'34': '00af00',
'35': '00af5f',
'36': '00af87',
'37': '00afaf',
'38': '00afd7',
'39': '00afff',
'40': '00d700',
'41': '00d75f',
'42': '00d787',
'43': '00d7af',
'44': '00d7d7',
'45': '00d7ff',
'46': '00ff00',
'47': '00ff5f',
'48': '00ff87',
'49': '00ffaf',
'50': '00ffd7',
'51': '00ffff',
'52': '5f0000',
'53': '5f005f',
'54': '5f0087',
'55': '5f00af',
'56': '5f00d7',
'57': '5f00ff',
'58': '5f5f00',
'59': '5f5f5f',
'60': '5f5f87',
'61': '5f5faf',
'62': '5f5fd7',
'63': '5f5fff',
'64': '5f8700',
'65': '5f875f',
'66': '5f8787',
'67': '5f87af',
'68': '5f87d7',
'69': '5f87ff',
'70': '5faf00',
'71': '5faf5f',
'72': '5faf87',
'73': '5fafaf',
'74': '5fafd7',
'75': '5fafff',
'76': '5fd700',
'77': '5fd75f',
'78': '5fd787',
'79': '5fd7af',
'80': '5fd7d7',
'81': '5fd7ff',
'82': '5fff00',
'83': '5fff5f',
'84': '5fff87',
'85': '5fffaf',
'86': '5fffd7',
'87': '5fffff',
'88': '870000',
'89': '87005f',
'90': '870087',
'91': '8700af',
'92': '8700d7',
'93': '8700ff',
'94': '875f00',
'95': '875f5f',
'96': '875f87',
'97': '875faf',
'98': '875fd7',
'99': '875fff',
'100': '878700',
'101': '87875f',
'102': '878787',
'103': '8787af',
'104': '8787d7',
'105': '8787ff',
'106': '87af00',
'107': '87af5f',
'108': '87af87',
'109': '87afaf',
'110': '87afd7',
'111': '87afff',
'112': '87d700',
'113': '87d75f',
'114': '87d787',
'115': '87d7af',
'116': '87d7d7',
'117': '87d7ff',
'118': '87ff00',
'119': '87ff5f',
'120': '87ff87',
'121': '87ffaf',
'122': '87ffd7',
'123': '87ffff',
'124': 'af0000',
'125': 'af005f',
'126': 'af0087',
'127': 'af00af',
'128': 'af00d7',
'129': 'af00ff',
'130': 'af5f00',
'131': 'af5f5f',
'132': 'af5f87',
'133': 'af5faf',
'134': 'af5fd7',
'135': 'af5fff',
'136': 'af8700',
'137': 'af875f',
'138': 'af8787',
'139': 'af87af',
'140': 'af87d7',
'141': 'af87ff',
'142': 'afaf00',
'143': 'afaf5f',
'144': 'afaf87',
'145': 'afafaf',
'146': 'afafd7',
'147': 'afafff',
'148': 'afd700',
'149': 'afd75f',
'150': 'afd787',
'151': 'afd7af',
'152': 'afd7d7',
'153': 'afd7ff',
'154': 'afff00',
'155': 'afff5f',
'156': 'afff87',
'157': 'afffaf',
'158': 'afffd7',
'159': 'afffff',
'160': 'd70000',
'161': 'd7005f',
'162': 'd70087',
'163': 'd700af',
'164': 'd700d7',
'165': 'd700ff',
'166': 'd75f00',
'167': 'd75f5f',
'168': 'd75f87',
'169': 'd75faf',
'170': 'd75fd7',
'171': 'd75fff',
'172': 'd78700',
'173': 'd7875f',
'174': 'd78787',
'175': 'd787af',
'176': 'd787d7',
'177': 'd787ff',
'178': 'd7af00',
'179': 'd7af5f',
'180': 'd7af87',
'181': 'd7afaf',
'182': 'd7afd7',
'183': 'd7afff',
'184': 'd7d700',
'185': 'd7d75f',
'186': 'd7d787',
'187': 'd7d7af',
'188': 'd7d7d7',
'189': 'd7d7ff',
'190': 'd7ff00',
'191': 'd7ff5f',
'192': 'd7ff87',
'193': 'd7ffaf',
'194': 'd7ffd7',
'195': 'd7ffff',
'196': 'ff0000',
'197': 'ff005f',
'198': 'ff0087',
'199': 'ff00af',
'200': 'ff00d7',
'201': 'ff00ff',
'202': 'ff5f00',
'203': 'ff5f5f',
'204': 'ff5f87',
'205': 'ff5faf',
'206': 'ff5fd7',
'207': 'ff5fff',
'208': 'ff8700',
'209': 'ff875f',
'210': 'ff8787',
'211': 'ff87af',
'212': 'ff87d7',
'213': 'ff87ff',
'214': 'ffaf00',
'215': 'ffaf5f',
'216': 'ffaf87',
'217': 'ffafaf',
'218': 'ffafd7',
'219': 'ffafff',
'220': 'ffd700',
'221': 'ffd75f',
'222': 'ffd787',
'223': 'ffd7af',
'224': 'ffd7d7',
'225': 'ffd7ff',
'226': 'ffff00',
'227': 'ffff5f',
'228': 'ffff87',
'229': 'ffffaf',
'230': 'ffffd7',
'231': 'ffffff',
'232': '080808',
'233': '121212',
'234': '1c1c1c',
'235': '262626',
'236': '303030',
'237': '3a3a3a',
'238': '444444',
'239': '4e4e4e',
'240': '585858',
'241': '626262',
'242': '6c6c6c',
'243': '767676',
'244': '808080',
'245': '8a8a8a',
'246': '949494',
'247': '9e9e9e',
'248': 'a8a8a8',
'249': 'b2b2b2',
'250': 'bcbcbc',
'251': 'c6c6c6',
'252': 'd0d0d0',
'253': 'dadada',
'254': 'e4e4e4',
'255': 'eeeeee'
};
ansi_vt100_cc_matcher = /(?:\x1b\x5b)([\?=;0-9]*?)([ABCDHJKfhlmnpsu])/g;
this.analyze = function(text) {
/* Parse ANSI control codes out of `text` and return a list of alternating text / opcode chunks; the
first element of the list and all elements with even indexes will represent (possibly empty) literal
texts, while elements with even indexes will be sub-lists representing control codes. Each control
code looks like `[ 'm', 38, 5, 199 ]` or `[ 'm', 0 ]`, with the opcode letter coming first, followed
by the integer parameters.
Adapted from https://github.com/atdt/escapes.js/blob/master/escapes.js
*/
var R, match, parameters, position, x, _i, _len, _ref;
R = [];
while (true) {
position = ansi_vt100_cc_matcher.lastIndex;
match = ansi_vt100_cc_matcher.exec(text);
if (match !== null) {
R.push(text.slice(position, match.index));
parameters = [match[2]];
_ref = match[1].split(';');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
x = _ref[_i];
parameters.push(parseInt(x, 10));
}
R.push(parameters);
}
if (ansi_vt100_cc_matcher.lastIndex === 0) {
break;
}
}
if (position < text.length) {
R.push(text.slice(position));
}
return R;
};
this.as_html = function(text, options) {
return (this._as_html(text, options)).join('');
};
this._as_html = function(text, options) {
var R, chunk, css_class, css_prefix, is_ansicode, n, open_span_count, vt100_clear, vt100_reset, _i, _j, _len, _ref;
is_ansicode = true;
R = [];
open_span_count = 0;
css_prefix = (options != null) && (options['css-prefix'] != null) ? options['css-prefix'] : 'ansi';
vt100_reset = css_prefix.concat('-m-0');
vt100_clear = css_prefix.concat('-K');
_ref = this.analyze(text);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
chunk = _ref[_i];
is_ansicode = !is_ansicode;
if (is_ansicode) {
css_class = css_prefix.concat('-', chunk.join('-'));
if (css_class === vt100_reset || css_class === vt100_clear) {
R.push('</span>');
open_span_count -= 1;
} else {
R.push("<span class='" + css_class + "'>");
open_span_count += 1;
}
continue;
} else {
/* TAINT must escape */
R.push(chunk);
}
}
if (open_span_count > 0 && ((options != null) && options['close-spans'])) {
for (n = _j = 0; 0 <= open_span_count ? _j < open_span_count : _j > open_span_count; n = 0 <= open_span_count ? ++_j : --_j) {
R.push('</span>');
}
}
return R;
};
this.get_css_source = function(options) {
var R, color_code, css_prefix, rgb_hex;
R = [];
css_prefix = (options != null) && (options['css-prefix'] != null) ? options['css-prefix'] : 'ansi';
for (color_code in rgb_hex_by_vt100_colorcode) {
rgb_hex = rgb_hex_by_vt100_colorcode[color_code];
R.push("." + css_prefix + "-m-38-5-" + color_code + " { color: " + rgb_hex + "; }");
}
return R.join('\n');
};
colortext = TRM.pen('foo', TRM.steel('helo', 42), 'bar', TRM.pink('baz'));
console.log(colortext);
colortext = '\x1b[38;05;199mhelo\x1b[0m foo \x1b[38;05;214moops\x1b[0m';
colortext = '\x1b[38;05;199mhelo\x1b[0m foo \x1b[38;05;214moops';
info(this.analyze(colortext));
info(this.as_html(colortext));
info(this.as_html(colortext, {
'css-prefix': 'xxxx',
'close-spans': true
}));
debug(this.get_css_source());
}).call(this);