anthtrigger
Version:
Trigger events via http service
215 lines (184 loc) • 7.35 kB
JavaScript
angular.module('ansiToHtml', ['ngSanitize'])
.factory('ansi2html', function() {
var ansi_up,
VERSION = "1.1.0",
// check for nodeJS
hasModule = (typeof module !== 'undefined'),
// Normal and then Bright
ANSI_COLORS = [
[{
color: "0, 0, 0",
class: "ansi-black"
}, {
color: "187, 0, 0",
class: "ansi-red"
}, {
color: "0, 187, 0",
class: "ansi-green"
}, {
color: "187, 187, 0",
class: "ansi-yellow"
}, {
color: "0, 0, 187",
class: "ansi-blue"
}, {
color: "187, 0, 187",
class: "ansi-magenta"
}, {
color: "0, 187, 187",
class: "ansi-cyan"
}, {
color: "255,255,255",
class: "ansi-white"
}],
[{
color: "85, 85, 85",
class: "ansi-bright-black"
}, {
color: "255, 85, 85",
class: "ansi-bright-red"
}, {
color: "0, 255, 0",
class: "ansi-bright-green"
}, {
color: "255, 255, 85",
class: "ansi-bright-yellow"
}, {
color: "85, 85, 255",
class: "ansi-bright-blue"
}, {
color: "255, 85, 255",
class: "ansi-bright-magenta"
}, {
color: "85, 255, 255",
class: "ansi-bright-cyan"
}, {
color: "255, 255, 255",
class: "ansi-bright-white"
}]
];
function Ansi_Up() {
this.fg = this.bg = null;
this.bright = 0;
}
Ansi_Up.prototype.escape_for_html = function(txt) {
return txt.replace(/[&<>]/gm, function(str) {
if (str == "&") return "&";
if (str == "<") return "<";
if (str == ">") return ">";
});
};
Ansi_Up.prototype.linkify = function(txt) {
return txt.replace(/(https?:\/\/[^\s]+)/gm, function(str) {
return "<a href=\"" + str + "\">" + str + "</a>";
});
};
Ansi_Up.prototype.ansi_to_html = function(txt, options) {
var data4 = txt.split(/\033\[/);
var first = data4.shift(); // the first chunk is not the result of the split
var self = this;
var data5 = data4.map(function(chunk) {
return self.process_chunk(chunk, options);
});
data5.unshift(first);
var flattened_data = data5.reduce(function(a, b) {
if (Array.isArray(b))
return a.concat(b);
a.push(b);
return a;
}, []);
var escaped_data = flattened_data.join('');
return escaped_data;
};
Ansi_Up.prototype.process_chunk = function(text, options) {
// Are we using classes or styles?
options = typeof options == 'undefined' ? {} : options;
var use_classes = typeof options.use_classes != 'undefined' && options.use_classes;
var key = use_classes ? 'class' : 'color';
// Do proper handling of sequences (aka - injest vi split(';') into state machine
//match,codes,txt = text.match(/([\d;]+)m(.*)/m);
var matches = text.match(/([\d;]*)m([^]*)/m);
if (!matches) return text;
var orig_txt = matches[2];
var nums = matches[1].split(';');
var self = this;
nums.map(function(num_str) {
var num = parseInt(num_str);
if (isNaN(num) || num === 0) {
self.fg = self.bg = null;
self.bright = 0;
} else if (num === 1) {
self.bright = 1;
} else if ((num >= 30) && (num < 38)) {
self.fg = ANSI_COLORS[self.bright][(num % 10)][key];
} else if ((num >= 40) && (num < 48)) {
self.bg = ANSI_COLORS[0][(num % 10)][key];
}
});
if ((self.fg === null) && (self.bg === null)) {
return orig_txt;
} else {
var styles = classes = [];
if (self.fg) {
if (use_classes) {
classes.push(self.fg + "-fg");
} else {
styles.push("color:rgb(" + self.fg + ")");
}
}
if (self.bg) {
if (use_classes) {
classes.push(self.bg + "-bg");
} else {
styles.push("background-color:rgb(" + self.bg + ")");
}
}
if (use_classes) {
return ["<span class=\"" + classes.join(' ') + "\">", orig_txt, "</span>"];
} else {
return ["<span style=\"" + styles.join(';') + "\">", orig_txt, "</span>"];
}
}
};
// Module exports
ansi_up = {
escape_for_html: function(txt) {
var a2h = new Ansi_Up();
return a2h.escape_for_html(txt);
},
linkify: function(txt) {
var a2h = new Ansi_Up();
return a2h.linkify(txt);
},
ansi_to_html: function(txt, options) {
var a2h = new Ansi_Up();
return a2h.ansi_to_html(txt, options);
},
ansi_to_html_obj: function() {
return new Ansi_Up();
}
};
return ansi_up;
})
.directive('ansiHtml', function(ansi2html, $sce) {
return {
restrict: 'E',
scope: {
value: '='
},
template: "<pre style='word-wrap: normal; background-color: black; color: white;' ng-bind-html='txt'>{{txt}}</pre>",
replace: true,
link: function(scope, elem, attrs) {
scope.$watch('value', function(val) {
if (!val) return
var result = '';
var valArr = val.split('\n');
valArr.forEach(function(t) {
result += '<p style="line-height:1em; margin: 0;">' +
ansi2html.ansi_to_html(t) + '</p>';
});
scope.txt = $sce.trustAsHtml(result)
});
}
}
});