/
index.js
115 lines (101 loc) · 2.32 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'use strict';
var ESCAPE_CODES = {
0: 0,
1: 22,
2: 22,
3: 23,
4: 24,
7: 27,
8: 28,
9: 29,
30: 39,
31: 39,
32: 39,
33: 39,
34: 39,
35: 39,
36: 39,
37: 39,
38: 39,
90: 39,
40: 49,
41: 49,
42: 49,
43: 49,
44: 49,
45: 49,
46: 49,
48: 49,
47: 49
};
function wrapAnsi(pair) {
var result = '';
var tmpCode;
while ((tmpCode = pair.pop())) {
result += '\u001b[' + tmpCode + 'm';
}
return result;
}
module.exports = function (str, start, end) {
var originalString = str.replace(/\u001b\[.*?m/g, '');
start = (start < 0) ? 0 : start;
if (end === undefined) {
end = originalString.length;
}
end = (originalString.length < end) ? originalString.length : end;
var ansiRegex = new RegExp(/\u001b\[(\d+).*?m/g);
var ansiResult = ansiRegex.exec(str);
var ansiCursor = 0;
var stringCursor = 0;
var tmpCursor;
var resultString = '';
var pair = [];
if (!ansiResult) {
return str.substring(start, end);
}
if (start === end) {
return '';
}
do {
if (ansiCursor < ansiResult.index) {
tmpCursor = stringCursor + (ansiResult.index - ansiCursor);
if (stringCursor >= start && tmpCursor <= end) {
resultString += originalString.substring(stringCursor, tmpCursor);
} else if (stringCursor <= start && tmpCursor >= start && tmpCursor <= end) {
resultString += originalString.substring(start, tmpCursor);
} else if (stringCursor <= end && tmpCursor >= end && stringCursor >= start) {
resultString +=
(originalString.substring(stringCursor, end));
break;
} else if (stringCursor <= start && tmpCursor >= end) {
resultString +=
(originalString.substring(start, end));
break;
}
}
stringCursor += (ansiResult.index - ansiCursor);
if (stringCursor >= end) {
break;
}
if (ESCAPE_CODES[ansiResult[1]]) {
pair.push(ESCAPE_CODES[ansiResult[1]]);
} else {
var index = pair.indexOf(ansiResult[1]);
pair.splice(index, 1);
}
resultString += ansiResult[0];
ansiCursor = ansiRegex.lastIndex;
if (stringCursor <= start && pair.length === 0) {
resultString = '';
}
} while ((ansiResult = ansiRegex.exec(str)) !== null);
resultString += wrapAnsi(pair);
if (tmpCursor <= end) {
if (tmpCursor > start) {
resultString += originalString.substring(tmpCursor, end);
} else {
resultString = originalString.substring(start, end);
}
}
return resultString;
};