@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.
Files changed (3) hide show
  1. package/dist-cjser/index.cjs +304 -162
  2. package/index.js +392 -198
  3. package/package.json +9 -13
@@ -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 import_strip_ansi = __toESM(require("@cjser/strip-ansi"), 1);
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 ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;
58
- var ANSI_ESCAPE_REGEX = new RegExp(`^\\u001B(?:\\${ANSI_CSI}(?<sgr>[0-9;]*)${ANSI_SGR_TERMINATOR}|${ANSI_ESCAPE_LINK}(?<uri>[^\\u0007\\u001B]*)(?:\\u0007|\\u001B\\\\))`);
59
- var ANSI_ESCAPE_CSI_REGEX = new RegExp(`^\\u009B(?<sgr>[0-9;]*)${ANSI_SGR_TERMINATOR}`);
60
- var ANSI_SGR_MODIFIER_CLOSE_CODES = new Set(import_ansi_styles.default.codes.values());
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 getGraphemes = (string) => Array.from(segmenter.segment(string), ({ segment }) => segment);
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 codes = sgrParameters.split(";").map((sgrParameter) => sgrParameter === "" ? ANSI_SGR_RESET : Number.parseInt(sgrParameter, 10));
175
+ const parameters = sgrParameters.split(";");
69
176
  const sgrTokens = [];
70
- for (let index = 0; index < codes.length; index++) {
71
- const code = codes[index];
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 >= codes.length) {
191
+ if (index + 1 >= parameters.length) {
77
192
  break;
78
193
  }
79
- const mode = codes[index + 1];
80
- if (mode === ANSI_SGR_COLOR_MODE_256 && Number.isFinite(codes[index + 2])) {
81
- sgrTokens.push([code, mode, codes[index + 2]]);
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 = codes[index + 2];
86
- const green = codes[index + 3];
87
- const blue = codes[index + 4];
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([code]);
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 = (code, sgrToken) => {
118
- if (code >= 30 && code <= 37 || code >= 90 && code <= 97 || code === ANSI_SGR_FOREGROUND_EXTENDED && sgrToken.length > 1) {
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: sgrToken.join(";"),
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 && sgrToken.length > 1) {
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: sgrToken.join(";"),
245
+ open,
129
246
  close: ANSI_SGR_RESET_BACKGROUND
130
247
  };
131
248
  }
132
- if (code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED && sgrToken.length > 1) {
249
+ if (code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED && hasArguments) {
133
250
  return {
134
251
  family: "underlineColor",
135
- open: sgrToken.join(";"),
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 [code] = sgrToken;
281
+ const { code } = sgrToken;
165
282
  if (applySgrResetCode(code, activeStyles)) {
166
283
  return;
167
284
  }
168
- const colorStyle = getColorStyle(code, sgrToken);
285
+ const colorStyle = getColorStyle(sgrToken);
169
286
  if (colorStyle) {
170
287
  upsertActiveStyle(activeStyles, colorStyle);
171
288
  return;
172
289
  }
173
- const close = import_ansi_styles.default.codes.get(code);
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.join(";"),
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 sgrToken of getSgrTokens(sgrParameters)) {
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 remainder = string;
195
- while (remainder.length > 0) {
196
- if (remainder.startsWith(ANSI_ESCAPE) && remainder[1] !== "\\") {
197
- const match = ANSI_ESCAPE_REGEX.exec(remainder);
198
- if (!match) {
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 (remainder.startsWith(ANSI_ESCAPE_CSI)) {
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
- break;
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 wordLengths = (string) => string.split(" ").map((word) => (0, import_string_width.default)(word));
222
- var wrapWord = (rows, word, columns) => {
223
- const characters = getGraphemes(word);
224
- let isInsideEscape = false;
225
- let isInsideLinkEscape = false;
226
- let visible = (0, import_string_width.default)((0, import_strip_ansi.default)(rows.at(-1)));
227
- for (const [index, character] of characters.entries()) {
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
- if (ESCAPES.has(character) && !(isInsideLinkEscape && character === ANSI_ESCAPE && characters[index + 1] === "\\")) {
236
- isInsideEscape = true;
237
- const ansiEscapeLinkCandidate = characters.slice(index + 1, index + 1 + ANSI_ESCAPE_LINK.length).join("");
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
- const words = string.split(" ");
263
- let last = words.length;
264
- while (last > 0) {
265
- if ((0, import_string_width.default)(words[last - 1]) > 0) {
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
- if (last === words.length) {
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
- for (const [index, segment] of segments.entries()) {
283
- expandedLine += segment;
284
- visible += (0, import_string_width.default)(segment);
285
- if (index < segments.length - 1) {
286
- const spaces = TAB_SIZE - visible % TAB_SIZE;
287
- expandedLine += " ".repeat(spaces);
288
- visible += spaces;
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
- let returnValue = "";
298
- let escapeUrl;
299
- const activeStyles = [];
300
- const lengths = wordLengths(string);
450
+ const words = splitWords(string);
301
451
  let rows = [""];
302
- for (const [index, word] of string.split(" ").entries()) {
303
- if (options.trim !== false) {
304
- rows[rows.length - 1] = rows.at(-1).trimStart();
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
- let rowLength = (0, import_string_width.default)(rows.at(-1));
307
- if (index !== 0) {
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 && lengths[index] > columns) {
480
+ if (options.hard && options.wordWrap !== false && word.width > columns) {
318
481
  const remainingColumns = columns - rowLength;
319
- const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);
320
- const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);
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 + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {
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 + lengths[index] > columns && options.wordWrap === false) {
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
- const preString = rows.join("\n");
344
- const pre = getGraphemes(preString);
345
- let preStringIndex = 0;
346
- for (const [index, character] of pre.entries()) {
347
- returnValue += character;
348
- if (character === ANSI_ESCAPE && pre[index + 1] !== "\\") {
349
- const { groups } = ANSI_ESCAPE_REGEX.exec(preString.slice(preStringIndex)) || { groups: {} };
350
- if (groups.sgr !== void 0) {
351
- applySgrParameters(groups.sgr, activeStyles);
352
- } else if (groups.uri !== void 0) {
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).normalize().replaceAll("\r\n", "\n").split("\n").map((line) => exec(expandTabs(line), columns, options)).join("\n");
521
+ return normalizeText(String(string)).replaceAll("\r\n", "\n").split("\n").map((line) => exec(expandTabs(line), columns, options)).join("\n");
380
522
  }