Name: gateway-uvi/webconsole/ansi_up.js
| 1: | // ansi_up.js |
| 2: | // version : 1.1.0 |
| 3: | // author : Dru Nelson |
| 4: | // license : MIT |
| 5: | // http://github.com/drudru/ansi_up |
| 6: | |
| 7: | (function (Date, undefined) { |
| 8: | |
| 9: | var ansi_up, |
| 10: | VERSION = "1.1.0", |
| 11: | |
| 12: | // check for nodeJS |
| 13: | hasModule = (typeof module !== 'undefined'), |
| 14: | |
| 15: | // Normal and then Bright |
| 16: | ANSI_COLORS = [ |
| 17: | [ |
| 18: | { color: "0, 0, 0", class: "ansi-black" }, |
| 19: | { color: "187, 0, 0", class: "ansi-red" }, |
| 20: | { color: "0, 187, 0", class: "ansi-green" }, |
| 21: | { color: "187, 187, 0", class: "ansi-yellow" }, |
| 22: | { color: "0, 0, 187", class: "ansi-blue" }, |
| 23: | { color: "187, 0, 187", class: "ansi-magenta" }, |
| 24: | { color: "0, 187, 187", class: "ansi-cyan" }, |
| 25: | { color: "255,255,255", class: "ansi-white" } |
| 26: | ], |
| 27: | [ |
| 28: | { color: "85, 85, 85", class: "ansi-bright-black" }, |
| 29: | { color: "255, 85, 85", class: "ansi-bright-red" }, |
| 30: | { color: "0, 255, 0", class: "ansi-bright-green" }, |
| 31: | { color: "255, 255, 85", class: "ansi-bright-yellow" }, |
| 32: | { color: "85, 85, 255", class: "ansi-bright-blue" }, |
| 33: | { color: "255, 85, 255", class: "ansi-bright-magenta" }, |
| 34: | { color: "85, 255, 255", class: "ansi-bright-cyan" }, |
| 35: | { color: "255, 255, 255", class: "ansi-bright-white" } |
| 36: | ] |
| 37: | ]; |
| 38: | |
| 39: | function Ansi_Up() { |
| 40: | this.fg = this.bg = null; |
| 41: | this.bright = 0; |
| 42: | } |
| 43: | |
| 44: | Ansi_Up.prototype.escape_for_html = function (txt) { |
| 45: | return txt.replace(/[&<>]/gm, function(str) { |
| 46: | if (str == "&") return "&"; |
| 47: | if (str == "<") return "<"; |
| 48: | if (str == ">") return ">"; |
| 49: | }); |
| 50: | }; |
| 51: | |
| 52: | Ansi_Up.prototype.linkify = function (txt) { |
| 53: | return txt.replace(/(https?:\/\/[^\s]+)/gm, function(str) { |
| 54: | return "<a href=\"" + str + "\">" + str + "</a>"; |
| 55: | }); |
| 56: | }; |
| 57: | |
| 58: | Ansi_Up.prototype.ansi_to_html = function (txt, options) { |
| 59: | |
| 60: | var data4 = txt.split(/\033\[/); |
| 61: | |
| 62: | var first = data4.shift(); // the first chunk is not the result of the split |
| 63: | |
| 64: | var self = this; |
| 65: | var data5 = data4.map(function (chunk) { |
| 66: | return self.process_chunk(chunk, options); |
| 67: | }); |
| 68: | |
| 69: | data5.unshift(first); |
| 70: | |
| 71: | var flattened_data = data5.reduce( function (a, b) { |
| 72: | if (Array.isArray(b)) |
| 73: | return a.concat(b); |
| 74: | |
| 75: | a.push(b); |
| 76: | return a; |
| 77: | }, []); |
| 78: | |
| 79: | var escaped_data = flattened_data.join(''); |
| 80: | |
| 81: | return escaped_data; |
| 82: | }; |
| 83: | |
| 84: | Ansi_Up.prototype.process_chunk = function (text, options) { |
| 85: | |
| 86: | // Are we using classes or styles? |
| 87: | options = typeof options == 'undefined' ? {} : options; |
| 88: | var use_classes = typeof options.use_classes != 'undefined' && options.use_classes; |
| 89: | var key = use_classes ? 'class' : 'color'; |
| 90: | |
| 91: | // Do proper handling of sequences (aka - injest vi split(';') into state machine |
| 92: | //match,codes,txt = text.match(/([\d;]+)m(.*)/m); |
| 93: | var matches = text.match(/([\d;]*)m([^]*)/m); |
| 94: | |
| 95: | if (!matches) return text; |
| 96: | |
| 97: | var orig_txt = matches[2]; |
| 98: | var nums = matches[1].split(';'); |
| 99: | |
| 100: | var self = this; |
| 101: | nums.map(function (num_str) { |
| 102: | |
| 103: | var num = parseInt(num_str); |
| 104: | |
| 105: | if (isNaN(num) || num === 0) { |
| 106: | self.fg = self.bg = null; |
| 107: | self.bright = 0; |
| 108: | } else if (num === 1) { |
| 109: | self.bright = 1; |
| 110: | } else if ((num >= 30) && (num < 38)) { |
| 111: | self.fg = ANSI_COLORS[self.bright][(num % 10)][key]; |
| 112: | } else if ((num >= 40) && (num < 48)) { |
| 113: | self.bg = ANSI_COLORS[0][(num % 10)][key]; |
| 114: | } |
| 115: | }); |
| 116: | |
| 117: | if ((self.fg === null) && (self.bg === null)) { |
| 118: | return orig_txt; |
| 119: | } else { |
| 120: | var styles = classes = []; |
| 121: | if (self.fg) { |
| 122: | if (use_classes) { |
| 123: | classes.push(self.fg + "-fg"); |
| 124: | } else { |
| 125: | styles.push("color:rgb(" + self.fg + ")"); |
| 126: | } |
| 127: | } |
| 128: | if (self.bg) { |
| 129: | if (use_classes) { |
| 130: | classes.push(self.bg + "-bg"); |
| 131: | } else { |
| 132: | styles.push("background-color:rgb(" + self.bg + ")"); |
| 133: | } |
| 134: | } |
| 135: | if (use_classes) { |
| 136: | return ["<span class=\"" + classes.join(' ') + "\">", orig_txt, "</span>"]; |
| 137: | } else { |
| 138: | return ["<span style=\"" + styles.join(';') + "\">", orig_txt, "</span>"]; |
| 139: | } |
| 140: | } |
| 141: | }; |
| 142: | |
| 143: | // Module exports |
| 144: | ansi_up = { |
| 145: | |
| 146: | escape_for_html: function (txt) { |
| 147: | var a2h = new Ansi_Up(); |
| 148: | return a2h.escape_for_html(txt); |
| 149: | }, |
| 150: | |
| 151: | linkify: function (txt) { |
| 152: | var a2h = new Ansi_Up(); |
| 153: | return a2h.linkify(txt); |
| 154: | }, |
| 155: | |
| 156: | ansi_to_html: function (txt, options) { |
| 157: | var a2h = new Ansi_Up(); |
| 158: | return a2h.ansi_to_html(txt, options); |
| 159: | }, |
| 160: | |
| 161: | ansi_to_html_obj: function () { |
| 162: | return new Ansi_Up(); |
| 163: | } |
| 164: | }; |
| 165: | |
| 166: | // CommonJS module is defined |
| 167: | if (hasModule) { |
| 168: | module.exports = ansi_up; |
| 169: | } |
| 170: | /*global ender:false */ |
| 171: | if (typeof window !== 'undefined' && typeof ender === 'undefined') { |
| 172: | window.ansi_up = ansi_up; |
| 173: | } |
| 174: | /*global define:false */ |
| 175: | if (typeof define === "function" && define.amd) { |
| 176: | define("ansi_up", [], function () { |
| 177: | return ansi_up; |
| 178: | }); |
| 179: | } |
| 180: | })(Date); |
