|
|
- 'use strict'
-
- module.exports = ansiHTML
-
- // Reference to https://github.com/sindresorhus/ansi-regex
- var _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()
|