125 lines
3.2 KiB
JavaScript
125 lines
3.2 KiB
JavaScript
// Generated by CoffeeScript 1.9.3
|
|
var AnsiPainter, object, styles, tags, tools,
|
|
hasProp = {}.hasOwnProperty,
|
|
slice = [].slice;
|
|
|
|
tools = require('./tools');
|
|
|
|
tags = require('./ansiPainter/tags');
|
|
|
|
styles = require('./ansiPainter/styles');
|
|
|
|
object = require('utila').object;
|
|
|
|
module.exports = AnsiPainter = (function() {
|
|
var self;
|
|
|
|
function AnsiPainter() {}
|
|
|
|
AnsiPainter.tags = tags;
|
|
|
|
AnsiPainter.prototype.paint = function(s) {
|
|
return this._replaceSpecialStrings(this._renderDom(this._parse(s)));
|
|
};
|
|
|
|
AnsiPainter.prototype._replaceSpecialStrings = function(str) {
|
|
return str.replace(/&sp;/g, ' ').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/&/g, '&');
|
|
};
|
|
|
|
AnsiPainter.prototype._parse = function(string, injectFakeRoot) {
|
|
if (injectFakeRoot == null) {
|
|
injectFakeRoot = true;
|
|
}
|
|
if (injectFakeRoot) {
|
|
string = '<none>' + string + '</none>';
|
|
}
|
|
return tools.toDom(string);
|
|
};
|
|
|
|
AnsiPainter.prototype._renderDom = function(dom) {
|
|
var parentStyles;
|
|
parentStyles = {
|
|
bg: 'none',
|
|
color: 'none'
|
|
};
|
|
return this._renderChildren(dom, parentStyles);
|
|
};
|
|
|
|
AnsiPainter.prototype._renderChildren = function(children, parentStyles) {
|
|
var child, n, ret;
|
|
ret = '';
|
|
for (n in children) {
|
|
if (!hasProp.call(children, n)) continue;
|
|
child = children[n];
|
|
ret += this._renderNode(child, parentStyles);
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
AnsiPainter.prototype._renderNode = function(node, parentStyles) {
|
|
if (node.type === 'text') {
|
|
return this._renderTextNode(node, parentStyles);
|
|
} else {
|
|
return this._renderTag(node, parentStyles);
|
|
}
|
|
};
|
|
|
|
AnsiPainter.prototype._renderTextNode = function(node, parentStyles) {
|
|
return this._wrapInStyle(node.data, parentStyles);
|
|
};
|
|
|
|
AnsiPainter.prototype._wrapInStyle = function(str, style) {
|
|
return styles.color(style.color) + styles.bg(style.bg) + str + styles.none();
|
|
};
|
|
|
|
AnsiPainter.prototype._renderTag = function(node, parentStyles) {
|
|
var currentStyles, tagStyles;
|
|
tagStyles = this._getStylesForTagName(node.name);
|
|
currentStyles = this._mixStyles(parentStyles, tagStyles);
|
|
return this._renderChildren(node.children, currentStyles);
|
|
};
|
|
|
|
AnsiPainter.prototype._mixStyles = function() {
|
|
var final, i, key, len, style, styles, val;
|
|
styles = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
|
final = {};
|
|
for (i = 0, len = styles.length; i < len; i++) {
|
|
style = styles[i];
|
|
for (key in style) {
|
|
if (!hasProp.call(style, key)) continue;
|
|
val = style[key];
|
|
if ((final[key] == null) || val !== 'inherit') {
|
|
final[key] = val;
|
|
}
|
|
}
|
|
}
|
|
return final;
|
|
};
|
|
|
|
AnsiPainter.prototype._getStylesForTagName = function(name) {
|
|
if (tags[name] == null) {
|
|
throw Error("Unknown tag name `" + name + "`");
|
|
}
|
|
return tags[name];
|
|
};
|
|
|
|
self = AnsiPainter;
|
|
|
|
AnsiPainter.getInstance = function() {
|
|
if (self._instance == null) {
|
|
self._instance = new self;
|
|
}
|
|
return self._instance;
|
|
};
|
|
|
|
AnsiPainter.paint = function(str) {
|
|
return self.getInstance().paint(str);
|
|
};
|
|
|
|
AnsiPainter.strip = function(s) {
|
|
return s.replace(/\x1b\[[0-9]+m/g, '');
|
|
};
|
|
|
|
return AnsiPainter;
|
|
|
|
})();
|