2015-06-30 19:04:58 +00:00
|
|
|
/* jslint node: true */
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var ansi = require('./ansi_term.js');
|
|
|
|
|
|
|
|
var assert = require('assert');
|
|
|
|
|
2015-07-06 01:05:55 +00:00
|
|
|
exports.pipeToAnsi = exports.enigmaToAnsi = enigmaToAnsi;
|
|
|
|
exports.stripPipeCodes = exports.stripEnigmaCodes = stripEnigmaCodes;
|
2015-08-26 05:17:09 +00:00
|
|
|
exports.pipeStrLen = exports.enigmaStrLen = enigmaStrLen;
|
2015-07-21 04:56:48 +00:00
|
|
|
exports.renegadeToAnsi = renegadeToAnsi;
|
2015-06-30 19:04:58 +00:00
|
|
|
|
|
|
|
// :TODO: Not really happy with the module name of "color_codes". Would like something better
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Also add:
|
|
|
|
// * fromCelerity(): |<case sensitive letter>
|
|
|
|
// * fromPCBoard(): (@X<bg><fg>)
|
|
|
|
// * fromWildcat(): (@<bg><fg>@ (same as PCBoard without 'X' prefix and '@' suffix)
|
|
|
|
// * fromWWIV(): <ctrl-c><0-7>
|
|
|
|
// * fromSyncronet(): <ctrl-a><colorCode>
|
|
|
|
// See http://wiki.synchro.net/custom:colors
|
2015-07-06 01:05:55 +00:00
|
|
|
function enigmaToAnsi(s) {
|
2015-06-30 19:04:58 +00:00
|
|
|
if(-1 == s.indexOf('|')) {
|
|
|
|
return s; // no pipe codes present
|
|
|
|
}
|
|
|
|
|
|
|
|
var result = '';
|
2015-07-02 21:20:39 +00:00
|
|
|
var re = /\|(\d{2}|\|)/g;
|
2015-06-30 19:04:58 +00:00
|
|
|
var m;
|
|
|
|
var lastIndex = 0;
|
|
|
|
while((m = re.exec(s))) {
|
|
|
|
var val = m[1];
|
|
|
|
|
|
|
|
if('|' == val) {
|
|
|
|
result += '|';
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// convert to number
|
|
|
|
val = parseInt(val, 10);
|
|
|
|
if(isNaN(val)) {
|
|
|
|
val = 0;
|
|
|
|
}
|
|
|
|
|
2015-07-06 01:05:55 +00:00
|
|
|
assert(val >= 0 && val <= 47);
|
2015-06-30 19:04:58 +00:00
|
|
|
|
|
|
|
var attr = '';
|
|
|
|
if(7 == val) {
|
|
|
|
attr = ansi.sgr('normal');
|
|
|
|
} else if (val < 7 || val >= 16) {
|
|
|
|
attr = ansi.sgr(['normal', val]);
|
|
|
|
} else if (val <= 15) {
|
|
|
|
attr = ansi.sgr(['normal', val - 8, 'bold']);
|
|
|
|
}
|
|
|
|
|
|
|
|
result += s.substr(lastIndex, m.index - lastIndex) + attr;
|
|
|
|
lastIndex = re.lastIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = (0 === result.length ? s : result + s.substr(lastIndex));
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2015-08-26 05:17:09 +00:00
|
|
|
function stripEnigmaCodes(s) {
|
|
|
|
return s.replace(/\|[\d]{2}/g, '');
|
|
|
|
}
|
|
|
|
|
|
|
|
function enigmaStrLen(s) {
|
|
|
|
return stripEnigmaCodes(s).length;
|
|
|
|
}
|
|
|
|
|
2015-07-06 01:05:55 +00:00
|
|
|
function renegadeToAnsi(s) {
|
|
|
|
if(-1 == s.indexOf('|')) {
|
|
|
|
return s; // no pipe codes present
|
|
|
|
}
|
|
|
|
|
|
|
|
var result = '';
|
|
|
|
var re = /\|(\d{2}|\|)/g;
|
|
|
|
var m;
|
|
|
|
var lastIndex = 0;
|
|
|
|
while((m = re.exec(s))) {
|
|
|
|
var val = m[1];
|
|
|
|
|
|
|
|
if('|' == val) {
|
|
|
|
result += '|';
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// convert to number
|
|
|
|
val = parseInt(val, 10);
|
|
|
|
if(isNaN(val)) {
|
|
|
|
val = 0;
|
|
|
|
}
|
|
|
|
assert(val >= 0 && val <= 23);
|
|
|
|
|
2015-07-21 04:56:48 +00:00
|
|
|
var attr = ansi.sgr({
|
|
|
|
0 : [ 'reset', 'black' ],
|
|
|
|
1 : [ 'reset', 'blue' ],
|
|
|
|
2 : [ 'reset', 'green' ],
|
|
|
|
3 : [ 'reset', 'cyan' ],
|
|
|
|
4 : [ 'reset', 'red' ],
|
|
|
|
5 : [ 'reset', 'magenta' ],
|
|
|
|
6 : [ 'reset', 'yellow' ],
|
|
|
|
7 : [ 'reset', 'white' ],
|
|
|
|
|
|
|
|
8 : [ 'bold', 'black' ],
|
|
|
|
9 : [ 'bold', 'blue' ],
|
|
|
|
10 : [ 'bold', 'green' ],
|
|
|
|
11 : [ 'bold', 'cyan' ],
|
|
|
|
12 : [ 'bold', 'red' ],
|
|
|
|
13 : [ 'bold', 'magenta' ],
|
|
|
|
14 : [ 'bold', 'yellow' ],
|
|
|
|
15 : [ 'bold', 'white' ],
|
|
|
|
|
|
|
|
16 : [ 'blackBG' ],
|
|
|
|
17 : [ 'blueBG' ],
|
|
|
|
18 : [ 'greenBG' ],
|
|
|
|
19 : [ 'cyanBG' ],
|
|
|
|
20 : [ 'redBG' ],
|
|
|
|
21 : [ 'magentaBG' ],
|
|
|
|
22 : [ 'yellowBG' ],
|
|
|
|
23 : [ 'whiteBG' ],
|
|
|
|
}[val] || 'normal');
|
2015-07-06 01:05:55 +00:00
|
|
|
|
|
|
|
result += s.substr(lastIndex, m.index - lastIndex) + attr;
|
|
|
|
lastIndex = re.lastIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = (0 === result.length ? s : result + s.substr(lastIndex));
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|