1 | 'use strict'
|
2 |
|
3 | module.exports = ansiHTML
|
4 |
|
5 |
|
6 | var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/
|
7 |
|
8 | var _defColors = {
|
9 | reset: ['fff', '000'],
|
10 | black: '000',
|
11 | red: 'ff0000',
|
12 | green: '209805',
|
13 | yellow: 'e8bf03',
|
14 | blue: '0000ff',
|
15 | magenta: 'ff00ff',
|
16 | cyan: '00ffee',
|
17 | lightgrey: 'f0f0f0',
|
18 | darkgrey: '888'
|
19 | }
|
20 | var _styles = {
|
21 | 30: 'black',
|
22 | 31: 'red',
|
23 | 32: 'green',
|
24 | 33: 'yellow',
|
25 | 34: 'blue',
|
26 | 35: 'magenta',
|
27 | 36: 'cyan',
|
28 | 37: 'lightgrey'
|
29 | }
|
30 | var _openTags = {
|
31 | '1': 'font-weight:bold',
|
32 | '2': 'opacity:0.5',
|
33 | '3': '<i>',
|
34 | '4': '<u>',
|
35 | '8': 'display:none',
|
36 | '9': '<del>'
|
37 | }
|
38 | var _closeTags = {
|
39 | '23': '</i>',
|
40 | '24': '</u>',
|
41 | '29': '</del>'
|
42 | }
|
43 |
|
44 | ;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) {
|
45 | _closeTags[n] = '</span>'
|
46 | })
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | function ansiHTML (text) {
|
54 |
|
55 | if (!_regANSI.test(text)) {
|
56 | return text
|
57 | }
|
58 |
|
59 |
|
60 | var ansiCodes = []
|
61 |
|
62 | var ret = text.replace(/\033\[(\d+)*m/g, function (match, seq) {
|
63 | var ot = _openTags[seq]
|
64 | if (ot) {
|
65 |
|
66 | if (!!~ansiCodes.indexOf(seq)) {
|
67 | ansiCodes.pop()
|
68 | return '</span>'
|
69 | }
|
70 |
|
71 | ansiCodes.push(seq)
|
72 | return ot[0] === '<' ? ot : '<span style="' + ot + ';">'
|
73 | }
|
74 |
|
75 | var ct = _closeTags[seq]
|
76 | if (ct) {
|
77 |
|
78 | ansiCodes.pop()
|
79 | return ct
|
80 | }
|
81 | return ''
|
82 | })
|
83 |
|
84 |
|
85 | var l = ansiCodes.length
|
86 | ;(l > 0) && (ret += Array(l + 1).join('</span>'))
|
87 |
|
88 | return ret
|
89 | }
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | ansiHTML.setColors = function (colors) {
|
96 | if (typeof colors !== 'object') {
|
97 | throw new Error('`colors` parameter must be an Object.')
|
98 | }
|
99 |
|
100 | var _finalColors = {}
|
101 | for (var key in _defColors) {
|
102 | var hex = colors.hasOwnProperty(key) ? colors[key] : null
|
103 | if (!hex) {
|
104 | _finalColors[key] = _defColors[key]
|
105 | continue
|
106 | }
|
107 | if ('reset' === key) {
|
108 | if (typeof hex === 'string') {
|
109 | hex = [hex]
|
110 | }
|
111 | if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) {
|
112 | return typeof h !== 'string'
|
113 | })) {
|
114 | throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000')
|
115 | }
|
116 | var defHexColor = _defColors[key]
|
117 | if (!hex[0]) {
|
118 | hex[0] = defHexColor[0]
|
119 | }
|
120 | if (hex.length === 1 || !hex[1]) {
|
121 | hex = [hex[0]]
|
122 | hex.push(defHexColor[1])
|
123 | }
|
124 |
|
125 | hex = hex.slice(0, 2)
|
126 | } else if (typeof hex !== 'string') {
|
127 | throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000')
|
128 | }
|
129 | _finalColors[key] = hex
|
130 | }
|
131 | _setTags(_finalColors)
|
132 | }
|
133 |
|
134 |
|
135 |
|
136 |
|
137 | ansiHTML.reset = function () {
|
138 | _setTags(_defColors)
|
139 | }
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 | ansiHTML.tags = {}
|
146 |
|
147 | if (Object.defineProperty) {
|
148 | Object.defineProperty(ansiHTML.tags, 'open', {
|
149 | get: function () { return _openTags }
|
150 | })
|
151 | Object.defineProperty(ansiHTML.tags, 'close', {
|
152 | get: function () { return _closeTags }
|
153 | })
|
154 | } else {
|
155 | ansiHTML.tags.open = _openTags
|
156 | ansiHTML.tags.close = _closeTags
|
157 | }
|
158 |
|
159 | function _setTags (colors) {
|
160 |
|
161 | _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1]
|
162 |
|
163 | _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0]
|
164 |
|
165 | _openTags['90'] = 'color:#' + colors.darkgrey
|
166 |
|
167 | for (var code in _styles) {
|
168 | var color = _styles[code]
|
169 | var oriColor = colors[color] || '000'
|
170 | _openTags[code] = 'color:#' + oriColor
|
171 | code = parseInt(code)
|
172 | _openTags[(code + 10).toString()] = 'background:#' + oriColor
|
173 | }
|
174 | }
|
175 |
|
176 | ansiHTML.reset()
|