/*  ansi_up.js
 *  author : Dru Nelson
 *  license : MIT
 *  http://github.com/drudru/ansi_up
 */
(function (factory) {
    var v;
    if (typeof module === "object" && typeof module.exports === "object") {
        v = factory(require, exports);
        if ("undefined" !== typeof v) module.exports = v;
    }
    else if ("function" === typeof define && define.amd) {
        define(["require", "exports"], factory);
    }
    else {
        var req, exp = {};
        v = factory(req, exp);
        window.AnsiUp = exp.default;
    }
})(function (require, exports) {

    "use strict";
    function rgx(tmplObj) {
        var subst = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            subst[_i - 1] = arguments[_i];
        }
        var regexText = tmplObj.raw[0];
        var wsrgx = /^\s+|\s+\n|\s+#[\s\S]+?\n/gm;
        var txt2 = regexText.replace(wsrgx, '');
        return new RegExp(txt2, 'm');
    }
    var AnsiUp = (function () {
        function AnsiUp() {
            this.VERSION = "2.0.1";
            this.ansi_colors = [
                [
                    { rgb: [0, 0, 0], class_name: "ansi-black" },
                    { rgb: [187, 0, 0], class_name: "ansi-red" },
                    { rgb: [0, 187, 0], class_name: "ansi-green" },
                    { rgb: [187, 187, 0], class_name: "ansi-yellow" },
                    { rgb: [0, 0, 187], class_name: "ansi-blue" },
                    { rgb: [187, 0, 187], class_name: "ansi-magenta" },
                    { rgb: [0, 187, 187], class_name: "ansi-cyan" },
                    { rgb: [255, 255, 255], class_name: "ansi-white" }
                ],
                [
                    { rgb: [85, 85, 85], class_name: "ansi-bright-black" },
                    { rgb: [255, 85, 85], class_name: "ansi-bright-red" },
                    { rgb: [0, 255, 0], class_name: "ansi-bright-green" },
                    { rgb: [255, 255, 85], class_name: "ansi-bright-yellow" },
                    { rgb: [85, 85, 255], class_name: "ansi-bright-blue" },
                    { rgb: [255, 85, 255], class_name: "ansi-bright-magenta" },
                    { rgb: [85, 255, 255], class_name: "ansi-bright-cyan" },
                    { rgb: [255, 255, 255], class_name: "ansi-bright-white" }
                ]
            ];
            this.htmlFormatter = {
                transform: function (fragment, instance) {
                    var txt = fragment.text;
                    if (txt.length === 0)
                        return txt;
                    if (instance._escape_for_html)
                        txt = instance.old_escape_for_html(txt);
                    if (!fragment.bright && fragment.fg === null && fragment.bg === null)
                        return txt;
                    var styles = [];
                    var classes = [];
                    var fg = fragment.fg;
                    var bg = fragment.bg;
                    if (fg === null && fragment.bright)
                        fg = instance.ansi_colors[1][7];
                    if (!instance._use_classes) {
                        if (fg)
                            styles.push("color:rgb(" + fg.rgb.join(',') + ")");
                        if (bg)
                            styles.push("background-color:rgb(" + bg.rgb + ")");
                    }
                    else {
                        if (fg) {
                            if (fg.class_name !== 'truecolor') {
                                classes.push(fg.class_name + "-fg");
                            }
                            else {
                                styles.push("color:rgb(" + fg.rgb.join(',') + ")");
                            }
                        }
                        if (bg) {
                            if (bg.class_name !== 'truecolor') {
                                classes.push(bg.class_name + "-bg");
                            }
                            else {
                                styles.push("background-color:rgb(" + bg.rgb.join(',') + ")");
                            }
                        }
                    }
                    var class_string = '';
                    var style_string = '';
                    if (classes.length)
                        class_string = " class=\"" + classes.join(' ') + "\"";
                    if (styles.length)
                        style_string = " style=\"" + styles.join(';') + "\"";
                    return "<span" + class_string + style_string + ">" + txt + "</span>";
                },
                compose: function (segments, instance) {
                    return segments.join("");
                }
            };
            this.textFormatter = {
                transform: function (fragment, instance) {
                    return fragment.text;
                },
                compose: function (segments, instance) {
                    return segments.join("");
                }
            };
            this.setup_256_palette();
            this._use_classes = false;
            this._escape_for_html = true;
            this.bright = false;
            this.fg = this.bg = null;
            this._buffer = '';
        }
        Object.defineProperty(AnsiUp.prototype, "use_classes", {
            get: function () {
                return this._use_classes;
            },
            set: function (arg) {
                this._use_classes = arg;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(AnsiUp.prototype, "escape_for_html", {
            get: function () {
                return this._escape_for_html;
            },
            set: function (arg) {
                this._escape_for_html = arg;
            },
            enumerable: true,
            configurable: true
        });
        AnsiUp.prototype.setup_256_palette = function () {
            var _this = this;
            this.palette_256 = [];
            this.ansi_colors.forEach(function (palette) {
                palette.forEach(function (rec) {
                    _this.palette_256.push(rec);
                });
            });
            var levels = [0, 95, 135, 175, 215, 255];
            for (var r = 0; r < 6; ++r) {
                for (var g = 0; g < 6; ++g) {
                    for (var b = 0; b < 6; ++b) {
                        var col = { rgb: [levels[r], levels[g], levels[b]], class_name: 'truecolor' };
                        this.palette_256.push(col);
                    }
                }
            }
            var grey_level = 8;
            for (var i = 0; i < 24; ++i, grey_level += 10) {
                var gry = { rgb: [grey_level, grey_level, grey_level], class_name: 'truecolor' };
                this.palette_256.push(gry);
            }
        };
        AnsiUp.prototype.old_escape_for_html = function (txt) {
            return txt.replace(/[&<>]/gm, function (str) {
                if (str === "&")
                    return "&amp;";
                if (str === "<")
                    return "&lt;";
                if (str === ">")
                    return "&gt;";
            });
        };
        AnsiUp.prototype.old_linkify = function (txt) {
            return txt.replace(/(https?:\/\/[^\s]+)/gm, function (str) {
                return "<a href=\"" + str + "\">" + str + "</a>";
            });
        };
        AnsiUp.prototype.detect_incomplete_ansi = function (txt) {
            return !(/.*?[\x40-\x7e]/.test(txt));
        };
        AnsiUp.prototype.detect_incomplete_link = function (txt) {
            var found = false;
            for (var i = txt.length - 1; i > 0; i--) {
                if (/\s|\x1B/.test(txt[i])) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                if (/(https?:\/\/[^\s]+)/.test(txt))
                    return 0;
                else
                    return -1;
            }
            var prefix = txt.substr(i + 1, 4);
            if (prefix.length === 0)
                return -1;
            if ("http".indexOf(prefix) === 0)
                return (i + 1);
        };
        AnsiUp.prototype.ansi_to = function (txt, formatter) {
            var pkt = this._buffer + txt;
            this._buffer = '';
            var raw_text_pkts = pkt.split(/\x1B\[/);
            if (raw_text_pkts.length === 1)
                raw_text_pkts.push('');
            this.handle_incomplete_sequences(raw_text_pkts);
            var first_chunk = this.with_state(raw_text_pkts.shift());
            var blocks = new Array(raw_text_pkts.length);
            for (var i = 0, len = raw_text_pkts.length; i < len; ++i) {
                blocks[i] = (formatter.transform(this.process_ansi(raw_text_pkts[i]), this));
            }
            if (first_chunk.text.length > 0)
                blocks.unshift(formatter.transform(first_chunk, this));
            return formatter.compose(blocks, this);
        };
        AnsiUp.prototype.ansi_to_html = function (txt) {
            return this.ansi_to(txt, this.htmlFormatter);
        };
        AnsiUp.prototype.ansi_to_text = function (txt) {
            return this.ansi_to(txt, this.textFormatter);
        };
        AnsiUp.prototype.with_state = function (text) {
            return { bright: this.bright, fg: this.fg, bg: this.bg, text: text };
        };
        AnsiUp.prototype.handle_incomplete_sequences = function (chunks) {
            var last_chunk = chunks[chunks.length - 1];
            if ((last_chunk.length > 0) && this.detect_incomplete_ansi(last_chunk)) {
                this._buffer = "\x1B[" + last_chunk;
                chunks.pop();
                chunks.push('');
            }
            else {
                if (last_chunk.slice(-1) === "\x1B") {
                    this._buffer = "\x1B";
                    console.log("raw", chunks);
                    chunks.pop();
                    chunks.push(last_chunk.substr(0, last_chunk.length - 1));
                    console.log(chunks);
                    console.log(last_chunk);
                }
                if (chunks.length === 2 &&
                    chunks[1] === "" &&
                    chunks[0].slice(-1) === "\x1B") {
                    this._buffer = "\x1B";
                    last_chunk = chunks.shift();
                    chunks.unshift(last_chunk.substr(0, last_chunk.length - 1));
                }
            }
        };
        AnsiUp.prototype.process_ansi = function (block) {
            if (!this._sgr_regex) {
                this._sgr_regex = (_a = ["\n            ^                           # beginning of line\n            ([!<-?]?)             # a private-mode char (!, <, =, >, ?)\n            ([d;]*)                    # any digits or semicolons\n            ([ -/]?               # an intermediate modifier\n            [@-~])                # the command\n            ([sS]*)                   # any text following this CSI sequence\n          "], _a.raw = ["\n            ^                           # beginning of line\n            ([!\\x3c-\\x3f]?)             # a private-mode char (!, <, =, >, ?)\n            ([\\d;]*)                    # any digits or semicolons\n            ([\\x20-\\x2f]?               # an intermediate modifier\n            [\\x40-\\x7e])                # the command\n            ([\\s\\S]*)                   # any text following this CSI sequence\n          "], rgx(_a));
            }
            var matches = block.match(this._sgr_regex);
            if (!matches) {
                return this.with_state(block);
            }
            var orig_txt = matches[4];
            if (matches[1] !== '' || matches[3] !== 'm') {
                return this.with_state(orig_txt);
            }
            var sgr_cmds = matches[2].split(';');
            while (sgr_cmds.length > 0) {
                var sgr_cmd_str = sgr_cmds.shift();
                var num = parseInt(sgr_cmd_str, 10);
                if (isNaN(num) || num === 0) {
                    this.fg = this.bg = null;
                    this.bright = false;
                }
                else if (num === 1) {
                    this.bright = true;
                }
                else if (num === 22) {
                    this.bright = false;
                }
                else if (num === 39) {
                    this.fg = null;
                }
                else if (num === 49) {
                    this.bg = null;
                }
                else if ((num >= 30) && (num < 38)) {
                    var bidx = this.bright ? 1 : 0;
                    this.fg = this.ansi_colors[bidx][(num - 30)];
                }
                else if ((num >= 90) && (num < 98)) {
                    this.fg = this.ansi_colors[1][(num - 90)];
                }
                else if ((num >= 40) && (num < 48)) {
                    this.bg = this.ansi_colors[0][(num - 40)];
                }
                else if ((num >= 100) && (num < 108)) {
                    this.bg = this.ansi_colors[1][(num - 100)];
                }
                else if (num === 38 || num === 48) {
                    if (sgr_cmds.length > 0) {
                        var is_foreground = (num === 38);
                        var mode_cmd = sgr_cmds.shift();
                        if (mode_cmd === '5' && sgr_cmds.length > 0) {
                            var palette_index = parseInt(sgr_cmds.shift(), 10);
                            if (palette_index >= 0 && palette_index <= 255) {
                                if (is_foreground)
                                    this.fg = this.palette_256[palette_index];
                                else
                                    this.bg = this.palette_256[palette_index];
                            }
                        }
                        if (mode_cmd === '2' && sgr_cmds.length > 2) {
                            var r = parseInt(sgr_cmds.shift(), 10);
                            var g = parseInt(sgr_cmds.shift(), 10);
                            var b = parseInt(sgr_cmds.shift(), 10);
                            if ((r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255)) {
                                var c = { rgb: [r, g, b], class_name: 'truecolor' };
                                if (is_foreground)
                                    this.fg = c;
                                else
                                    this.bg = c;
                            }
                        }
                    }
                }
            }
            return this.with_state(orig_txt);
            var _a;
        };
        return AnsiUp;
    }());
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.default = AnsiUp;
});
