| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | 'use strict'module.exports = ansiHTML// Reference to https://github.com/sindresorhus/ansi-regexvar _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/var _defColors = {  reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR]  black: '000',  red: 'ff0000',  green: '209805',  yellow: 'e8bf03',  blue: '0000ff',  magenta: 'ff00ff',  cyan: '00ffee',  lightgrey: 'f0f0f0',  darkgrey: '888'}var _styles = {  30: 'black',  31: 'red',  32: 'green',  33: 'yellow',  34: 'blue',  35: 'magenta',  36: 'cyan',  37: 'lightgrey'}var _openTags = {  '1': 'font-weight:bold', // bold  '2': 'opacity:0.5', // dim  '3': '<i>', // italic  '4': '<u>', // underscore  '8': 'display:none', // hidden  '9': '<del>' // delete}var _closeTags = {  '23': '</i>', // reset italic  '24': '</u>', // reset underscore  '29': '</del>' // reset delete};[0, 21, 22, 27, 28, 39, 49].forEach(function (n) {  _closeTags[n] = '</span>'})/** * Converts text with ANSI color codes to HTML markup. * @param {String} text * @returns {*} */function ansiHTML (text) {  // Returns the text if the string has no ANSI escape code.  if (!_regANSI.test(text)) {    return text  }  // Cache opened sequence.  var ansiCodes = []  // Replace with markup.  var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) {    var ot = _openTags[seq]    if (ot) {      // If current sequence has been opened, close it.      if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast        ansiCodes.pop()        return '</span>'      }      // Open tag.      ansiCodes.push(seq)      return ot[0] === '<' ? ot : '<span style="' + ot + ';">'    }    var ct = _closeTags[seq]    if (ct) {      // Pop sequence      ansiCodes.pop()      return ct    }    return ''  })  // Make sure tags are closed.  var l = ansiCodes.length  ;(l > 0) && (ret += Array(l + 1).join('</span>'))  return ret}/** * Customize colors. * @param {Object} colors reference to _defColors */ansiHTML.setColors = function (colors) {  if (typeof colors !== 'object') {    throw new Error('`colors` parameter must be an Object.')  }  var _finalColors = {}  for (var key in _defColors) {    var hex = colors.hasOwnProperty(key) ? colors[key] : null    if (!hex) {      _finalColors[key] = _defColors[key]      continue    }    if ('reset' === key) {      if (typeof hex === 'string') {        hex = [hex]      }      if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) {        return typeof h !== 'string'      })) {        throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000')      }      var defHexColor = _defColors[key]      if (!hex[0]) {        hex[0] = defHexColor[0]      }      if (hex.length === 1 || !hex[1]) {        hex = [hex[0]]        hex.push(defHexColor[1])      }      hex = hex.slice(0, 2)    } else if (typeof hex !== 'string') {      throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000')    }    _finalColors[key] = hex  }  _setTags(_finalColors)}/** * Reset colors. */ansiHTML.reset = function () {  _setTags(_defColors)}/** * Expose tags, including open and close. * @type {Object} */ansiHTML.tags = {}if (Object.defineProperty) {  Object.defineProperty(ansiHTML.tags, 'open', {    get: function () { return _openTags }  })  Object.defineProperty(ansiHTML.tags, 'close', {    get: function () { return _closeTags }  })} else {  ansiHTML.tags.open = _openTags  ansiHTML.tags.close = _closeTags}function _setTags (colors) {  // reset all  _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1]  // inverse  _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0]  // dark grey  _openTags['90'] = 'color:#' + colors.darkgrey  for (var code in _styles) {    var color = _styles[code]    var oriColor = colors[color] || '000'    _openTags[code] = 'color:#' + oriColor    code = parseInt(code)    _openTags[(code + 10).toString()] = 'background:#' + oriColor  }}ansiHTML.reset()
 |