@cjser/wrap-ansi 10.0.0-cjser.2 → 10.0.2-cjser.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjser/index.cjs +304 -162
- package/index.js +392 -198
- package/package.json +9 -13
package/dist-cjser/index.cjs
CHANGED
|
@@ -26,22 +26,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
));
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// packages/@cjser/wrap-ansi/index.js
|
|
29
|
+
// packages/@cjser/wrap-ansi.tmp-26-1790096744839/index.js
|
|
30
30
|
var index_exports = {};
|
|
31
31
|
__export(index_exports, {
|
|
32
32
|
default: () => wrapAnsi
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(index_exports);
|
|
35
35
|
var import_string_width = __toESM(require("@cjser/string-width"), 1);
|
|
36
|
-
var
|
|
37
|
-
var import_ansi_styles = __toESM(require("@cjser/ansi-styles"), 1);
|
|
36
|
+
var import_ansi_styles_v6_2_3 = __toESM(require("@cjser/ansi-styles__v6_2_3"), 1);
|
|
38
37
|
var ANSI_ESCAPE = "\x1B";
|
|
39
|
-
var ANSI_ESCAPE_CSI = "\x9B";
|
|
40
|
-
var ESCAPES = /* @__PURE__ */ new Set([
|
|
41
|
-
ANSI_ESCAPE,
|
|
42
|
-
ANSI_ESCAPE_CSI
|
|
43
|
-
]);
|
|
44
38
|
var ANSI_ESCAPE_BELL = "\x07";
|
|
39
|
+
var C1_CSI = "\x9B";
|
|
45
40
|
var ANSI_CSI = "[";
|
|
46
41
|
var ANSI_OSC = "]";
|
|
47
42
|
var ANSI_SGR_TERMINATOR = "m";
|
|
@@ -52,47 +47,168 @@ var ANSI_SGR_RESET_UNDERLINE_COLOR = 59;
|
|
|
52
47
|
var ANSI_SGR_FOREGROUND_EXTENDED = 38;
|
|
53
48
|
var ANSI_SGR_BACKGROUND_EXTENDED = 48;
|
|
54
49
|
var ANSI_SGR_UNDERLINE_COLOR_EXTENDED = 58;
|
|
55
|
-
var ANSI_SGR_COLOR_MODE_256 = 5;
|
|
56
50
|
var ANSI_SGR_COLOR_MODE_RGB = 2;
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
|
|
51
|
+
var ANSI_SGR_COLOR_MODE_256 = 5;
|
|
52
|
+
var ANSI_ESCAPE_LINK = `${ANSI_OSC}8;`;
|
|
53
|
+
var ESCAPES = /* @__PURE__ */ new Set([
|
|
54
|
+
ANSI_ESCAPE,
|
|
55
|
+
C1_CSI
|
|
56
|
+
]);
|
|
57
|
+
var ESCAPE_CHARACTERS = [...ESCAPES].join("");
|
|
58
|
+
var CSI_INTRODUCER = `(?:${ANSI_ESCAPE}\\${ANSI_CSI}|${C1_CSI})`;
|
|
59
|
+
var CSI_PARAMETERS = "[0-?]*[ -/]*[@-~]";
|
|
60
|
+
var SGR_PARAMETERS = `(?<sgr>[0-9;:]*)${ANSI_SGR_TERMINATOR}`;
|
|
61
|
+
var OSC_STRING_TERMINATOR = `(?:${ANSI_ESCAPE_BELL}|${ANSI_ESCAPE}\\\\)`;
|
|
62
|
+
var OSC_STRING_PAYLOAD = String.raw`[^\u0000-\u001F\u007F-\u009F]*`;
|
|
63
|
+
var LINK_PARAMETERS = String.raw`8;(?<parameters>[^;\u0000-\u001F\u007F-\u009F]*);(?<uri>${OSC_STRING_PAYLOAD})${OSC_STRING_TERMINATOR}`;
|
|
64
|
+
var OSC_STRING = `${OSC_STRING_PAYLOAD}${OSC_STRING_TERMINATOR}`;
|
|
65
|
+
var ANSI_ESCAPE_REGEX = new RegExp(
|
|
66
|
+
`${CSI_INTRODUCER}(?:${SGR_PARAMETERS}|${CSI_PARAMETERS})|${ANSI_ESCAPE}\\${ANSI_OSC}(?:${LINK_PARAMETERS}|${OSC_STRING})`,
|
|
67
|
+
"y"
|
|
68
|
+
);
|
|
69
|
+
var ANSI_SGR_MODIFIER_CLOSE_CODES = new Set(import_ansi_styles_v6_2_3.default.codes.values());
|
|
61
70
|
ANSI_SGR_MODIFIER_CLOSE_CODES.delete(ANSI_SGR_RESET);
|
|
62
71
|
var segmenter = new Intl.Segmenter();
|
|
63
|
-
var
|
|
72
|
+
var getStringWidth = (string) => (0, import_string_width.default)(string, { countAnsiEscapeCodes: true });
|
|
64
73
|
var TAB_SIZE = 8;
|
|
74
|
+
var ESCAPE_INTRODUCER_REGEX = new RegExp(`[${ESCAPE_CHARACTERS}]`, "g");
|
|
75
|
+
var ROW_BOUNDARY_REGEX = new RegExp(`[\\n${ESCAPE_CHARACTERS}]`, "g");
|
|
76
|
+
var ASCII_PRINTABLE_REGEX = /^[ -~]*$/;
|
|
65
77
|
var wrapAnsiCode = (code) => `${ANSI_ESCAPE}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;
|
|
66
|
-
var wrapAnsiHyperlink = (url) => `${ANSI_ESCAPE}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;
|
|
78
|
+
var wrapAnsiHyperlink = (url, parameters = "") => `${ANSI_ESCAPE}${ANSI_ESCAPE_LINK}${parameters};${url}${ANSI_ESCAPE_BELL}`;
|
|
79
|
+
var matchAnsiEscape = (string, index) => {
|
|
80
|
+
if (!ESCAPES.has(string[index])) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
ANSI_ESCAPE_REGEX.lastIndex = index;
|
|
84
|
+
return ANSI_ESCAPE_REGEX.exec(string) ?? void 0;
|
|
85
|
+
};
|
|
86
|
+
var forEachSegment = (string, onPlainText, onEscape = () => {
|
|
87
|
+
}) => {
|
|
88
|
+
let plainStart = 0;
|
|
89
|
+
let index = 0;
|
|
90
|
+
while (index < string.length) {
|
|
91
|
+
ESCAPE_INTRODUCER_REGEX.lastIndex = index;
|
|
92
|
+
const introducer = ESCAPE_INTRODUCER_REGEX.exec(string);
|
|
93
|
+
if (!introducer) {
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
const escape = matchAnsiEscape(string, introducer.index);
|
|
97
|
+
if (!escape) {
|
|
98
|
+
index = introducer.index + 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (introducer.index > plainStart) {
|
|
102
|
+
onPlainText(string.slice(plainStart, introducer.index));
|
|
103
|
+
}
|
|
104
|
+
onEscape(escape[0]);
|
|
105
|
+
index = introducer.index + escape[0].length;
|
|
106
|
+
plainStart = index;
|
|
107
|
+
}
|
|
108
|
+
if (plainStart < string.length) {
|
|
109
|
+
onPlainText(string.slice(plainStart));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var getWidth = (string) => {
|
|
113
|
+
let plainText = "";
|
|
114
|
+
forEachSegment(string, (part) => {
|
|
115
|
+
plainText += part;
|
|
116
|
+
});
|
|
117
|
+
return getStringWidth(plainText);
|
|
118
|
+
};
|
|
119
|
+
var getTokens = (string) => {
|
|
120
|
+
const tokens = [];
|
|
121
|
+
forEachSegment(string, (plainText) => {
|
|
122
|
+
if (ASCII_PRINTABLE_REGEX.test(plainText)) {
|
|
123
|
+
for (const character of plainText) {
|
|
124
|
+
tokens.push({ value: character, width: 1 });
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
for (const { segment } of segmenter.segment(plainText)) {
|
|
129
|
+
tokens.push({ value: segment, width: getStringWidth(segment) });
|
|
130
|
+
}
|
|
131
|
+
}, (escape) => {
|
|
132
|
+
tokens.push({ value: escape, width: 0 });
|
|
133
|
+
});
|
|
134
|
+
return tokens;
|
|
135
|
+
};
|
|
136
|
+
var splitWords = (string) => {
|
|
137
|
+
let currentWord = { value: "", plainText: "" };
|
|
138
|
+
const words = [currentWord];
|
|
139
|
+
forEachSegment(string, (plainText) => {
|
|
140
|
+
const parts = plainText.split(" ");
|
|
141
|
+
currentWord.value += parts[0];
|
|
142
|
+
currentWord.plainText += parts[0];
|
|
143
|
+
for (let index = 1; index < parts.length; index++) {
|
|
144
|
+
currentWord = { value: parts[index], plainText: parts[index] };
|
|
145
|
+
words.push(currentWord);
|
|
146
|
+
}
|
|
147
|
+
}, (escape) => {
|
|
148
|
+
currentWord.value += escape;
|
|
149
|
+
});
|
|
150
|
+
for (const word of words) {
|
|
151
|
+
word.width = getStringWidth(word.plainText);
|
|
152
|
+
}
|
|
153
|
+
return words;
|
|
154
|
+
};
|
|
155
|
+
var getColonColorToken = (parameter) => {
|
|
156
|
+
const parts = parameter.split(":");
|
|
157
|
+
const code = Number.parseInt(parts[0], 10);
|
|
158
|
+
const mode = Number.parseInt(parts[1], 10);
|
|
159
|
+
if (![ANSI_SGR_FOREGROUND_EXTENDED, ANSI_SGR_BACKGROUND_EXTENDED, ANSI_SGR_UNDERLINE_COLOR_EXTENDED].includes(code)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (mode === ANSI_SGR_COLOR_MODE_256 && parts.length === 3 && /^\d+$/.test(parts[2])) {
|
|
163
|
+
return { code, open: parameter, hasArguments: true };
|
|
164
|
+
}
|
|
165
|
+
if (mode !== ANSI_SGR_COLOR_MODE_RGB) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const components = parts.length === 6 ? parts.slice(3) : parts.slice(2);
|
|
169
|
+
const colorSpace = parts.length === 6 ? parts[2] : void 0;
|
|
170
|
+
if (components.length === 3 && components.every((component) => /^\d+$/.test(component)) && (colorSpace === void 0 || /^\d*$/.test(colorSpace))) {
|
|
171
|
+
return { code, open: parameter, hasArguments: true };
|
|
172
|
+
}
|
|
173
|
+
};
|
|
67
174
|
var getSgrTokens = (sgrParameters) => {
|
|
68
|
-
const
|
|
175
|
+
const parameters = sgrParameters.split(";");
|
|
69
176
|
const sgrTokens = [];
|
|
70
|
-
for (let index = 0; index <
|
|
71
|
-
const
|
|
177
|
+
for (let index = 0; index < parameters.length; index++) {
|
|
178
|
+
const parameter = parameters[index];
|
|
179
|
+
if (parameter.includes(":")) {
|
|
180
|
+
const colonColorToken = getColonColorToken(parameter);
|
|
181
|
+
if (colonColorToken) {
|
|
182
|
+
sgrTokens.push(colonColorToken);
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const code = parameter === "" ? ANSI_SGR_RESET : Number.parseInt(parameter, 10);
|
|
72
187
|
if (!Number.isFinite(code)) {
|
|
73
188
|
continue;
|
|
74
189
|
}
|
|
75
190
|
if (code === ANSI_SGR_FOREGROUND_EXTENDED || code === ANSI_SGR_BACKGROUND_EXTENDED || code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED) {
|
|
76
|
-
if (index + 1 >=
|
|
191
|
+
if (index + 1 >= parameters.length) {
|
|
77
192
|
break;
|
|
78
193
|
}
|
|
79
|
-
const mode =
|
|
80
|
-
|
|
81
|
-
|
|
194
|
+
const mode = Number.parseInt(parameters[index + 1], 10);
|
|
195
|
+
const colorIndex = Number.parseInt(parameters[index + 2], 10);
|
|
196
|
+
if (mode === ANSI_SGR_COLOR_MODE_256 && Number.isFinite(colorIndex)) {
|
|
197
|
+
sgrTokens.push({ code, open: [code, mode, colorIndex].join(";"), hasArguments: true });
|
|
82
198
|
index += 2;
|
|
83
199
|
continue;
|
|
84
200
|
}
|
|
85
|
-
const red =
|
|
86
|
-
const green =
|
|
87
|
-
const blue =
|
|
201
|
+
const red = Number.parseInt(parameters[index + 2], 10);
|
|
202
|
+
const green = Number.parseInt(parameters[index + 3], 10);
|
|
203
|
+
const blue = Number.parseInt(parameters[index + 4], 10);
|
|
88
204
|
if (mode === ANSI_SGR_COLOR_MODE_RGB && Number.isFinite(red) && Number.isFinite(green) && Number.isFinite(blue)) {
|
|
89
|
-
sgrTokens.push([code, mode, red, green, blue]);
|
|
205
|
+
sgrTokens.push({ code, open: [code, mode, red, green, blue].join(";"), hasArguments: true });
|
|
90
206
|
index += 4;
|
|
91
207
|
continue;
|
|
92
208
|
}
|
|
93
209
|
break;
|
|
94
210
|
}
|
|
95
|
-
sgrTokens.push(
|
|
211
|
+
sgrTokens.push({ code, open: String(code), hasArguments: false });
|
|
96
212
|
}
|
|
97
213
|
return sgrTokens;
|
|
98
214
|
};
|
|
@@ -114,25 +230,26 @@ var removeModifierStylesByClose = (activeStyles, closeCode) => {
|
|
|
114
230
|
}
|
|
115
231
|
}
|
|
116
232
|
};
|
|
117
|
-
var getColorStyle = (
|
|
118
|
-
|
|
233
|
+
var getColorStyle = (sgrToken) => {
|
|
234
|
+
const { code, open, hasArguments } = sgrToken;
|
|
235
|
+
if (code >= 30 && code <= 37 || code >= 90 && code <= 97 || code === ANSI_SGR_FOREGROUND_EXTENDED && hasArguments) {
|
|
119
236
|
return {
|
|
120
237
|
family: "foreground",
|
|
121
|
-
open
|
|
238
|
+
open,
|
|
122
239
|
close: ANSI_SGR_RESET_FOREGROUND
|
|
123
240
|
};
|
|
124
241
|
}
|
|
125
|
-
if (code >= 40 && code <= 47 || code >= 100 && code <= 107 || code === ANSI_SGR_BACKGROUND_EXTENDED &&
|
|
242
|
+
if (code >= 40 && code <= 47 || code >= 100 && code <= 107 || code === ANSI_SGR_BACKGROUND_EXTENDED && hasArguments) {
|
|
126
243
|
return {
|
|
127
244
|
family: "background",
|
|
128
|
-
open
|
|
245
|
+
open,
|
|
129
246
|
close: ANSI_SGR_RESET_BACKGROUND
|
|
130
247
|
};
|
|
131
248
|
}
|
|
132
|
-
if (code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED &&
|
|
249
|
+
if (code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED && hasArguments) {
|
|
133
250
|
return {
|
|
134
251
|
family: "underlineColor",
|
|
135
|
-
open
|
|
252
|
+
open,
|
|
136
253
|
close: ANSI_SGR_RESET_UNDERLINE_COLOR
|
|
137
254
|
};
|
|
138
255
|
}
|
|
@@ -161,20 +278,20 @@ var applySgrResetCode = (code, activeStyles) => {
|
|
|
161
278
|
return false;
|
|
162
279
|
};
|
|
163
280
|
var applySgrToken = (sgrToken, activeStyles) => {
|
|
164
|
-
const
|
|
281
|
+
const { code } = sgrToken;
|
|
165
282
|
if (applySgrResetCode(code, activeStyles)) {
|
|
166
283
|
return;
|
|
167
284
|
}
|
|
168
|
-
const colorStyle = getColorStyle(
|
|
285
|
+
const colorStyle = getColorStyle(sgrToken);
|
|
169
286
|
if (colorStyle) {
|
|
170
287
|
upsertActiveStyle(activeStyles, colorStyle);
|
|
171
288
|
return;
|
|
172
289
|
}
|
|
173
|
-
const close =
|
|
290
|
+
const close = import_ansi_styles_v6_2_3.default.codes.get(code);
|
|
174
291
|
if (close !== void 0 && close !== ANSI_SGR_RESET) {
|
|
175
292
|
upsertActiveStyle(activeStyles, {
|
|
176
293
|
family: `modifier-${code}`,
|
|
177
|
-
open: sgrToken.
|
|
294
|
+
open: sgrToken.open,
|
|
178
295
|
close
|
|
179
296
|
});
|
|
180
297
|
}
|
|
@@ -185,71 +302,37 @@ var applySgrParameters = (sgrParameters, activeStyles) => {
|
|
|
185
302
|
}
|
|
186
303
|
};
|
|
187
304
|
var applySgrResets = (sgrParameters, activeStyles) => {
|
|
188
|
-
for (const
|
|
189
|
-
const [code] = sgrToken;
|
|
305
|
+
for (const { code } of getSgrTokens(sgrParameters)) {
|
|
190
306
|
applySgrResetCode(code, activeStyles);
|
|
191
307
|
}
|
|
192
308
|
};
|
|
193
|
-
var applyLeadingSgrResets = (string, activeStyles) => {
|
|
194
|
-
let
|
|
195
|
-
while (
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
if (match.groups.sgr !== void 0) {
|
|
202
|
-
applySgrResets(match.groups.sgr, activeStyles);
|
|
203
|
-
}
|
|
204
|
-
remainder = remainder.slice(match[0].length);
|
|
205
|
-
continue;
|
|
309
|
+
var applyLeadingSgrResets = (string, startIndex, activeStyles) => {
|
|
310
|
+
let index = startIndex;
|
|
311
|
+
while (index < string.length) {
|
|
312
|
+
const match = matchAnsiEscape(string, index);
|
|
313
|
+
if (!match) {
|
|
314
|
+
break;
|
|
206
315
|
}
|
|
207
|
-
if (
|
|
208
|
-
const match = ANSI_ESCAPE_CSI_REGEX.exec(remainder);
|
|
209
|
-
if (!match || match.groups.sgr === void 0) {
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
316
|
+
if (match.groups.sgr !== void 0) {
|
|
212
317
|
applySgrResets(match.groups.sgr, activeStyles);
|
|
213
|
-
remainder = remainder.slice(match[0].length);
|
|
214
|
-
continue;
|
|
215
318
|
}
|
|
216
|
-
|
|
319
|
+
index += match[0].length;
|
|
217
320
|
}
|
|
218
321
|
};
|
|
219
322
|
var getClosingSgrSequence = (activeStyles) => [...activeStyles].reverse().map((activeStyle) => wrapAnsiCode(activeStyle.close)).join("");
|
|
220
323
|
var getOpeningSgrSequence = (activeStyles) => activeStyles.map((activeStyle) => wrapAnsiCode(activeStyle.open)).join("");
|
|
221
|
-
var
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
let
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const characterLength = (0, import_string_width.default)(character);
|
|
229
|
-
if (visible + characterLength <= columns) {
|
|
230
|
-
rows[rows.length - 1] += character;
|
|
231
|
-
} else {
|
|
232
|
-
rows.push(character);
|
|
324
|
+
var wrapWord = (rows, word, columns, rowWidth) => {
|
|
325
|
+
const tokens = getTokens(word);
|
|
326
|
+
let visible = rowWidth;
|
|
327
|
+
for (let index = 0; index < tokens.length; index++) {
|
|
328
|
+
const token = tokens[index];
|
|
329
|
+
if (token.width > 0 && visible > 0 && visible + token.width > columns) {
|
|
330
|
+
rows.push("");
|
|
233
331
|
visible = 0;
|
|
234
332
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
isInsideLinkEscape = ansiEscapeLinkCandidate === ANSI_ESCAPE_LINK;
|
|
239
|
-
}
|
|
240
|
-
if (isInsideEscape) {
|
|
241
|
-
if (isInsideLinkEscape) {
|
|
242
|
-
if (character === ANSI_ESCAPE_BELL || character === "\\" && index > 0 && characters[index - 1] === ANSI_ESCAPE) {
|
|
243
|
-
isInsideEscape = false;
|
|
244
|
-
isInsideLinkEscape = false;
|
|
245
|
-
}
|
|
246
|
-
} else if (character === ANSI_SGR_TERMINATOR) {
|
|
247
|
-
isInsideEscape = false;
|
|
248
|
-
}
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
visible += characterLength;
|
|
252
|
-
if (visible === columns && index < characters.length - 1) {
|
|
333
|
+
rows[rows.length - 1] += token.value;
|
|
334
|
+
visible += token.width;
|
|
335
|
+
if (visible === columns && index < tokens.length - 1) {
|
|
253
336
|
rows.push("");
|
|
254
337
|
visible = 0;
|
|
255
338
|
}
|
|
@@ -257,54 +340,134 @@ var wrapWord = (rows, word, columns) => {
|
|
|
257
340
|
if (!visible && rows.at(-1).length > 0 && rows.length > 1) {
|
|
258
341
|
rows[rows.length - 2] += rows.pop();
|
|
259
342
|
}
|
|
343
|
+
return getWidth(rows.at(-1));
|
|
260
344
|
};
|
|
261
345
|
var stringVisibleTrimSpacesRight = (string) => {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
346
|
+
if (!string.includes(" ")) {
|
|
347
|
+
return string;
|
|
348
|
+
}
|
|
349
|
+
const segments = [];
|
|
350
|
+
forEachSegment(string, (plainText) => {
|
|
351
|
+
segments.push({ value: plainText, isEscape: false });
|
|
352
|
+
}, (escape) => {
|
|
353
|
+
segments.push({ value: escape, isEscape: true });
|
|
354
|
+
});
|
|
355
|
+
for (let index = segments.length - 1; index >= 0; index--) {
|
|
356
|
+
const segment = segments[index];
|
|
357
|
+
if (segment.isEscape) {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
let end = segment.value.length;
|
|
361
|
+
while (end > 0 && segment.value[end - 1] === " ") {
|
|
362
|
+
end--;
|
|
363
|
+
}
|
|
364
|
+
segment.value = segment.value.slice(0, end);
|
|
365
|
+
if (getStringWidth(segment.value) > 0) {
|
|
266
366
|
break;
|
|
267
367
|
}
|
|
268
|
-
last--;
|
|
269
368
|
}
|
|
270
|
-
|
|
271
|
-
return string;
|
|
272
|
-
}
|
|
273
|
-
return words.slice(0, last).join(" ") + words.slice(last).join("");
|
|
369
|
+
return segments.map((segment) => segment.value).join("");
|
|
274
370
|
};
|
|
275
371
|
var expandTabs = (line) => {
|
|
276
372
|
if (!line.includes(" ")) {
|
|
277
373
|
return line;
|
|
278
374
|
}
|
|
279
|
-
const segments = line.split(" ");
|
|
280
375
|
let visible = 0;
|
|
281
376
|
let expandedLine = "";
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
377
|
+
let plainTextSinceTab = "";
|
|
378
|
+
const expandPlainText = (plainText) => {
|
|
379
|
+
const segments = plainText.split(" ");
|
|
380
|
+
for (const [index, segment] of segments.entries()) {
|
|
381
|
+
expandedLine += segment;
|
|
382
|
+
plainTextSinceTab += segment;
|
|
383
|
+
if (index < segments.length - 1) {
|
|
384
|
+
visible += getStringWidth(plainTextSinceTab);
|
|
385
|
+
plainTextSinceTab = "";
|
|
386
|
+
const spaces = TAB_SIZE - visible % TAB_SIZE;
|
|
387
|
+
expandedLine += " ".repeat(spaces);
|
|
388
|
+
visible += spaces;
|
|
389
|
+
}
|
|
289
390
|
}
|
|
290
|
-
}
|
|
391
|
+
};
|
|
392
|
+
forEachSegment(line, expandPlainText, (escape) => {
|
|
393
|
+
expandedLine += escape;
|
|
394
|
+
});
|
|
291
395
|
return expandedLine;
|
|
292
396
|
};
|
|
397
|
+
var restoreStylesAcrossRows = (preString) => {
|
|
398
|
+
let returnValue = "";
|
|
399
|
+
let activeHyperlink;
|
|
400
|
+
const activeStyles = [];
|
|
401
|
+
let index = 0;
|
|
402
|
+
let copiedIndex = 0;
|
|
403
|
+
while (index < preString.length) {
|
|
404
|
+
ROW_BOUNDARY_REGEX.lastIndex = index;
|
|
405
|
+
const boundary = ROW_BOUNDARY_REGEX.exec(preString);
|
|
406
|
+
if (!boundary) {
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
index = boundary.index;
|
|
410
|
+
if (boundary[0] !== "\n") {
|
|
411
|
+
const escape = matchAnsiEscape(preString, index);
|
|
412
|
+
if (!escape) {
|
|
413
|
+
index++;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
const { groups } = escape;
|
|
417
|
+
if (groups.sgr !== void 0) {
|
|
418
|
+
applySgrParameters(groups.sgr, activeStyles);
|
|
419
|
+
} else if (groups.uri !== void 0) {
|
|
420
|
+
activeHyperlink = groups.uri.length === 0 ? void 0 : { parameters: groups.parameters, uri: groups.uri };
|
|
421
|
+
}
|
|
422
|
+
index += escape[0].length;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
returnValue += preString.slice(copiedIndex, index);
|
|
426
|
+
if (index > copiedIndex) {
|
|
427
|
+
if (activeHyperlink) {
|
|
428
|
+
returnValue += wrapAnsiHyperlink("");
|
|
429
|
+
}
|
|
430
|
+
returnValue += getClosingSgrSequence(activeStyles);
|
|
431
|
+
}
|
|
432
|
+
returnValue += "\n";
|
|
433
|
+
index++;
|
|
434
|
+
copiedIndex = index;
|
|
435
|
+
if (index < preString.length && preString[index] !== "\n") {
|
|
436
|
+
const openingStyles = [...activeStyles];
|
|
437
|
+
applyLeadingSgrResets(preString, index, openingStyles);
|
|
438
|
+
returnValue += getOpeningSgrSequence(openingStyles);
|
|
439
|
+
if (activeHyperlink) {
|
|
440
|
+
returnValue += wrapAnsiHyperlink(activeHyperlink.uri, activeHyperlink.parameters);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return returnValue + preString.slice(copiedIndex);
|
|
445
|
+
};
|
|
293
446
|
var exec = (string, columns, options = {}) => {
|
|
294
447
|
if (options.trim !== false && string.trim() === "") {
|
|
295
448
|
return "";
|
|
296
449
|
}
|
|
297
|
-
|
|
298
|
-
let escapeUrl;
|
|
299
|
-
const activeStyles = [];
|
|
300
|
-
const lengths = wordLengths(string);
|
|
450
|
+
const words = splitWords(string);
|
|
301
451
|
let rows = [""];
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
452
|
+
let rowLength = 0;
|
|
453
|
+
let trimmedRowIndex = -1;
|
|
454
|
+
let isFirstWord = true;
|
|
455
|
+
for (const word of words) {
|
|
456
|
+
const rowIndex = rows.length - 1;
|
|
457
|
+
if (options.trim !== false && trimmedRowIndex !== rowIndex) {
|
|
458
|
+
const row = rows[rowIndex];
|
|
459
|
+
const trimmedRow = row.trimStart();
|
|
460
|
+
if (trimmedRow.length !== row.length) {
|
|
461
|
+
rows[rowIndex] = trimmedRow;
|
|
462
|
+
rowLength = getWidth(trimmedRow);
|
|
463
|
+
}
|
|
464
|
+
if (trimmedRow.length > 0) {
|
|
465
|
+
trimmedRowIndex = rowIndex;
|
|
466
|
+
}
|
|
305
467
|
}
|
|
306
|
-
|
|
307
|
-
|
|
468
|
+
if (isFirstWord) {
|
|
469
|
+
isFirstWord = false;
|
|
470
|
+
} else {
|
|
308
471
|
if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {
|
|
309
472
|
rows.push("");
|
|
310
473
|
rowLength = 0;
|
|
@@ -314,67 +477,46 @@ var exec = (string, columns, options = {}) => {
|
|
|
314
477
|
rowLength++;
|
|
315
478
|
}
|
|
316
479
|
}
|
|
317
|
-
if (options.hard && options.wordWrap !== false &&
|
|
480
|
+
if (options.hard && options.wordWrap !== false && word.width > columns) {
|
|
318
481
|
const remainingColumns = columns - rowLength;
|
|
319
|
-
const breaksStartingThisLine = 1 + Math.floor((
|
|
320
|
-
const breaksStartingNextLine = Math.floor((
|
|
482
|
+
const breaksStartingThisLine = 1 + Math.floor((word.width - remainingColumns - 1) / columns);
|
|
483
|
+
const breaksStartingNextLine = Math.floor((word.width - 1) / columns);
|
|
321
484
|
if (breaksStartingNextLine < breaksStartingThisLine) {
|
|
322
485
|
rows.push("");
|
|
486
|
+
rowLength = 0;
|
|
323
487
|
}
|
|
324
|
-
wrapWord(rows, word, columns);
|
|
488
|
+
rowLength = wrapWord(rows, word.value, columns, rowLength);
|
|
325
489
|
continue;
|
|
326
490
|
}
|
|
327
|
-
if (rowLength +
|
|
491
|
+
if (rowLength + word.width > columns && rowLength > 0 && word.width > 0) {
|
|
328
492
|
if (options.wordWrap === false && rowLength < columns) {
|
|
329
|
-
wrapWord(rows, word, columns);
|
|
493
|
+
rowLength = wrapWord(rows, word.value, columns, rowLength);
|
|
330
494
|
continue;
|
|
331
495
|
}
|
|
332
496
|
rows.push("");
|
|
497
|
+
rowLength = 0;
|
|
333
498
|
}
|
|
334
|
-
if (rowLength +
|
|
335
|
-
wrapWord(rows, word, columns);
|
|
499
|
+
if (rowLength + word.width > columns && options.wordWrap === false) {
|
|
500
|
+
rowLength = wrapWord(rows, word.value, columns, rowLength);
|
|
336
501
|
continue;
|
|
337
502
|
}
|
|
338
|
-
rows[rows.length - 1] += word;
|
|
503
|
+
rows[rows.length - 1] += word.value;
|
|
504
|
+
rowLength += word.width;
|
|
339
505
|
}
|
|
340
506
|
if (options.trim !== false) {
|
|
341
507
|
rows = rows.map((row) => stringVisibleTrimSpacesRight(row));
|
|
342
508
|
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
escapeUrl = groups.uri.length === 0 ? void 0 : groups.uri;
|
|
354
|
-
}
|
|
355
|
-
} else if (character === ANSI_ESCAPE_CSI) {
|
|
356
|
-
const { groups } = ANSI_ESCAPE_CSI_REGEX.exec(preString.slice(preStringIndex)) || { groups: {} };
|
|
357
|
-
if (groups.sgr !== void 0) {
|
|
358
|
-
applySgrParameters(groups.sgr, activeStyles);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
if (pre[index + 1] === "\n") {
|
|
362
|
-
if (escapeUrl) {
|
|
363
|
-
returnValue += wrapAnsiHyperlink("");
|
|
364
|
-
}
|
|
365
|
-
returnValue += getClosingSgrSequence(activeStyles);
|
|
366
|
-
} else if (character === "\n") {
|
|
367
|
-
const openingStyles = [...activeStyles];
|
|
368
|
-
applyLeadingSgrResets(preString.slice(preStringIndex + 1), openingStyles);
|
|
369
|
-
returnValue += getOpeningSgrSequence(openingStyles);
|
|
370
|
-
if (escapeUrl) {
|
|
371
|
-
returnValue += wrapAnsiHyperlink(escapeUrl);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
preStringIndex += character.length;
|
|
375
|
-
}
|
|
376
|
-
return returnValue;
|
|
509
|
+
return restoreStylesAcrossRows(rows.join("\n"));
|
|
510
|
+
};
|
|
511
|
+
var normalizeText = (string) => {
|
|
512
|
+
let normalizedString = "";
|
|
513
|
+
forEachSegment(string, (plainText) => {
|
|
514
|
+
normalizedString += plainText.normalize();
|
|
515
|
+
}, (escape) => {
|
|
516
|
+
normalizedString += escape;
|
|
517
|
+
});
|
|
518
|
+
return normalizedString;
|
|
377
519
|
};
|
|
378
520
|
function wrapAnsi(string, columns, options) {
|
|
379
|
-
return String(string)
|
|
521
|
+
return normalizeText(String(string)).replaceAll("\r\n", "\n").split("\n").map((line) => exec(expandTabs(line), columns, options)).join("\n");
|
|
380
522
|
}
|