@logtape/pretty 1.0.0-dev.231 → 1.0.0-dev.232

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/wcwidth.ts CHANGED
@@ -9,6 +9,10 @@
9
9
  * Based on Unicode 15.1.0 character width tables.
10
10
  */
11
11
 
12
+ // Pre-compiled regex for ANSI escape sequences
13
+ // deno-lint-ignore no-control-regex
14
+ const ANSI_PATTERN = /\x1b\[[0-9;]*m/g;
15
+
12
16
  /**
13
17
  * Remove all ANSI escape sequences from a string.
14
18
  *
@@ -16,7 +20,7 @@
16
20
  * @returns String with ANSI escape sequences removed
17
21
  */
18
22
  export function stripAnsi(text: string): string {
19
- return text.replace(/\[[0-9;]*m/g, "");
23
+ return text.replace(ANSI_PATTERN, "");
20
24
  }
21
25
 
22
26
  /**
@@ -85,6 +89,208 @@ export function wcwidth(code: number): number {
85
89
  return 1;
86
90
  }
87
91
 
92
+ // Zero-width character ranges (sorted for binary search)
93
+ const ZERO_WIDTH_RANGES: Array<[number, number]> = [
94
+ [0x0300, 0x036F], // Combining Diacritical Marks
95
+ [0x0483, 0x0489], // Hebrew combining marks
96
+ [0x0591, 0x05BD], // Arabic combining marks
97
+ [0x05C1, 0x05C2],
98
+ [0x05C4, 0x05C5],
99
+ [0x0610, 0x061A], // More Arabic combining marks
100
+ [0x064B, 0x065F],
101
+ [0x06D6, 0x06DC],
102
+ [0x06DF, 0x06E4],
103
+ [0x06E7, 0x06E8],
104
+ [0x06EA, 0x06ED],
105
+ [0x0730, 0x074A],
106
+ [0x07A6, 0x07B0],
107
+ [0x07EB, 0x07F3],
108
+ [0x0816, 0x0819],
109
+ [0x081B, 0x0823],
110
+ [0x0825, 0x0827],
111
+ [0x0829, 0x082D],
112
+ [0x0859, 0x085B],
113
+ [0x08D3, 0x08E1],
114
+ [0x08E3, 0x0902],
115
+ [0x0941, 0x0948],
116
+ [0x0951, 0x0957],
117
+ [0x0962, 0x0963],
118
+ [0x09C1, 0x09C4],
119
+ [0x09E2, 0x09E3],
120
+ [0x0A01, 0x0A02],
121
+ [0x0A41, 0x0A42],
122
+ [0x0A47, 0x0A48],
123
+ [0x0A4B, 0x0A4D],
124
+ [0x0A70, 0x0A71],
125
+ [0x0A81, 0x0A82],
126
+ [0x0AC1, 0x0AC5],
127
+ [0x0AC7, 0x0AC8],
128
+ [0x0AE2, 0x0AE3],
129
+ [0x0AFA, 0x0AFF],
130
+ [0x0B41, 0x0B44],
131
+ [0x0B55, 0x0B56],
132
+ [0x0B62, 0x0B63],
133
+ [0x0C3E, 0x0C40],
134
+ [0x0C46, 0x0C48],
135
+ [0x0C4A, 0x0C4D],
136
+ [0x0C55, 0x0C56],
137
+ [0x0C62, 0x0C63],
138
+ [0x0CCC, 0x0CCD],
139
+ [0x0CE2, 0x0CE3],
140
+ [0x0D00, 0x0D01],
141
+ [0x0D3B, 0x0D3C],
142
+ [0x0D62, 0x0D63],
143
+ [0x0DD2, 0x0DD4],
144
+ [0x0E34, 0x0E3A],
145
+ [0x0E47, 0x0E4E],
146
+ [0x0EB4, 0x0EBC],
147
+ [0x0EC8, 0x0ECD],
148
+ [0x0F18, 0x0F19],
149
+ [0x0F71, 0x0F7E],
150
+ [0x0F80, 0x0F84],
151
+ [0x0F86, 0x0F87],
152
+ [0x0F8D, 0x0F97],
153
+ [0x0F99, 0x0FBC],
154
+ [0x102D, 0x1030],
155
+ [0x1032, 0x1037],
156
+ [0x1039, 0x103A],
157
+ [0x103D, 0x103E],
158
+ [0x1058, 0x1059],
159
+ [0x105E, 0x1060],
160
+ [0x1071, 0x1074],
161
+ [0x1085, 0x1086],
162
+ [0x135D, 0x135F],
163
+ [0x1712, 0x1714],
164
+ [0x1732, 0x1734],
165
+ [0x1752, 0x1753],
166
+ [0x1772, 0x1773],
167
+ [0x17B4, 0x17B5],
168
+ [0x17B7, 0x17BD],
169
+ [0x17C9, 0x17D3],
170
+ [0x180B, 0x180D],
171
+ [0x1885, 0x1886],
172
+ [0x1920, 0x1922],
173
+ [0x1927, 0x1928],
174
+ [0x1939, 0x193B],
175
+ [0x1A17, 0x1A18],
176
+ [0x1A58, 0x1A5E],
177
+ [0x1A65, 0x1A6C],
178
+ [0x1A73, 0x1A7C],
179
+ [0x1AB0, 0x1ABE],
180
+ [0x1B00, 0x1B03],
181
+ [0x1B36, 0x1B3A],
182
+ [0x1B6B, 0x1B73],
183
+ [0x1B80, 0x1B81],
184
+ [0x1BA2, 0x1BA5],
185
+ [0x1BA8, 0x1BA9],
186
+ [0x1BAB, 0x1BAD],
187
+ [0x1BE8, 0x1BE9],
188
+ [0x1BEF, 0x1BF1],
189
+ [0x1C2C, 0x1C33],
190
+ [0x1C36, 0x1C37],
191
+ [0x1CD0, 0x1CD2],
192
+ [0x1CD4, 0x1CE0],
193
+ [0x1CE2, 0x1CE8],
194
+ [0x1CF8, 0x1CF9],
195
+ [0x1DC0, 0x1DF9],
196
+ [0x1DFB, 0x1DFF],
197
+ [0x200B, 0x200F], // Zero-width spaces
198
+ [0x202A, 0x202E], // Bidirectional format characters
199
+ [0x2060, 0x2064], // Word joiner, etc.
200
+ [0x2066, 0x206F], // More bidirectional
201
+ [0xFE00, 0xFE0F], // Variation selectors
202
+ [0xFE20, 0xFE2F], // Combining half marks
203
+ ];
204
+
205
+ // Single zero-width characters
206
+ const ZERO_WIDTH_SINGLES = new Set([
207
+ 0x05BF,
208
+ 0x05C7,
209
+ 0x0670,
210
+ 0x0711,
211
+ 0x07FD,
212
+ 0x093A,
213
+ 0x093C,
214
+ 0x094D,
215
+ 0x0981,
216
+ 0x09BC,
217
+ 0x09CD,
218
+ 0x09FE,
219
+ 0x0A3C,
220
+ 0x0A51,
221
+ 0x0A75,
222
+ 0x0ABC,
223
+ 0x0ACD,
224
+ 0x0B01,
225
+ 0x0B3C,
226
+ 0x0B3F,
227
+ 0x0B4D,
228
+ 0x0B82,
229
+ 0x0BC0,
230
+ 0x0BCD,
231
+ 0x0C00,
232
+ 0x0C04,
233
+ 0x0C81,
234
+ 0x0CBC,
235
+ 0x0CBF,
236
+ 0x0CC6,
237
+ 0x0D41,
238
+ 0x0D44,
239
+ 0x0D4D,
240
+ 0x0D81,
241
+ 0x0DCA,
242
+ 0x0DD6,
243
+ 0x0E31,
244
+ 0x0EB1,
245
+ 0x0F35,
246
+ 0x0F37,
247
+ 0x0F39,
248
+ 0x0FC6,
249
+ 0x1082,
250
+ 0x108D,
251
+ 0x109D,
252
+ 0x17C6,
253
+ 0x17DD,
254
+ 0x18A9,
255
+ 0x1932,
256
+ 0x1A1B,
257
+ 0x1A56,
258
+ 0x1A60,
259
+ 0x1A62,
260
+ 0x1A7F,
261
+ 0x1B34,
262
+ 0x1B3C,
263
+ 0x1B42,
264
+ 0x1BE6,
265
+ 0x1BED,
266
+ 0x1CED,
267
+ 0x1CF4,
268
+ 0xFEFF,
269
+ ]);
270
+
271
+ /**
272
+ * Binary search to check if a value is within any range
273
+ */
274
+ function isInRanges(code: number, ranges: Array<[number, number]>): boolean {
275
+ let left = 0;
276
+ let right = ranges.length - 1;
277
+
278
+ while (left <= right) {
279
+ const mid = Math.floor((left + right) / 2);
280
+ const [start, end] = ranges[mid];
281
+
282
+ if (code >= start && code <= end) {
283
+ return true;
284
+ } else if (code < start) {
285
+ right = mid - 1;
286
+ } else {
287
+ left = mid + 1;
288
+ }
289
+ }
290
+
291
+ return false;
292
+ }
293
+
88
294
  /**
89
295
  * Check if a character is zero-width (combining marks, etc.)
90
296
  * Based on wcwidth's zero-width table.
@@ -93,184 +299,7 @@ export function wcwidth(code: number): number {
93
299
  * @returns True if the character has zero display width
94
300
  */
95
301
  function isZeroWidth(code: number): boolean {
96
- return (
97
- // Combining Diacritical Marks
98
- (code >= 0x0300 && code <= 0x036F) ||
99
- // Hebrew combining marks
100
- (code >= 0x0483 && code <= 0x0489) ||
101
- // Arabic combining marks
102
- (code >= 0x0591 && code <= 0x05BD) ||
103
- code === 0x05BF ||
104
- (code >= 0x05C1 && code <= 0x05C2) ||
105
- (code >= 0x05C4 && code <= 0x05C5) ||
106
- code === 0x05C7 ||
107
- // More Arabic combining marks
108
- (code >= 0x0610 && code <= 0x061A) ||
109
- (code >= 0x064B && code <= 0x065F) ||
110
- code === 0x0670 ||
111
- (code >= 0x06D6 && code <= 0x06DC) ||
112
- (code >= 0x06DF && code <= 0x06E4) ||
113
- (code >= 0x06E7 && code <= 0x06E8) ||
114
- (code >= 0x06EA && code <= 0x06ED) ||
115
- code === 0x0711 ||
116
- (code >= 0x0730 && code <= 0x074A) ||
117
- (code >= 0x07A6 && code <= 0x07B0) ||
118
- (code >= 0x07EB && code <= 0x07F3) ||
119
- code === 0x07FD ||
120
- // Various other combining marks
121
- (code >= 0x0816 && code <= 0x0819) ||
122
- (code >= 0x081B && code <= 0x0823) ||
123
- (code >= 0x0825 && code <= 0x0827) ||
124
- (code >= 0x0829 && code <= 0x082D) ||
125
- (code >= 0x0859 && code <= 0x085B) ||
126
- (code >= 0x08D3 && code <= 0x08E1) ||
127
- (code >= 0x08E3 && code <= 0x0902) ||
128
- code === 0x093A ||
129
- code === 0x093C ||
130
- (code >= 0x0941 && code <= 0x0948) ||
131
- code === 0x094D ||
132
- (code >= 0x0951 && code <= 0x0957) ||
133
- (code >= 0x0962 && code <= 0x0963) ||
134
- code === 0x0981 ||
135
- code === 0x09BC ||
136
- (code >= 0x09C1 && code <= 0x09C4) ||
137
- code === 0x09CD ||
138
- (code >= 0x09E2 && code <= 0x09E3) ||
139
- (code >= 0x09FE && code <= 0x09FE) ||
140
- (code >= 0x0A01 && code <= 0x0A02) ||
141
- code === 0x0A3C ||
142
- (code >= 0x0A41 && code <= 0x0A42) ||
143
- (code >= 0x0A47 && code <= 0x0A48) ||
144
- (code >= 0x0A4B && code <= 0x0A4D) ||
145
- code === 0x0A51 ||
146
- (code >= 0x0A70 && code <= 0x0A71) ||
147
- code === 0x0A75 ||
148
- (code >= 0x0A81 && code <= 0x0A82) ||
149
- code === 0x0ABC ||
150
- (code >= 0x0AC1 && code <= 0x0AC5) ||
151
- (code >= 0x0AC7 && code <= 0x0AC8) ||
152
- code === 0x0ACD ||
153
- (code >= 0x0AE2 && code <= 0x0AE3) ||
154
- (code >= 0x0AFA && code <= 0x0AFF) ||
155
- code === 0x0B01 ||
156
- code === 0x0B3C ||
157
- code === 0x0B3F ||
158
- (code >= 0x0B41 && code <= 0x0B44) ||
159
- code === 0x0B4D ||
160
- (code >= 0x0B55 && code <= 0x0B56) ||
161
- (code >= 0x0B62 && code <= 0x0B63) ||
162
- code === 0x0B82 ||
163
- code === 0x0BC0 ||
164
- code === 0x0BCD ||
165
- code === 0x0C00 ||
166
- code === 0x0C04 ||
167
- (code >= 0x0C3E && code <= 0x0C40) ||
168
- (code >= 0x0C46 && code <= 0x0C48) ||
169
- (code >= 0x0C4A && code <= 0x0C4D) ||
170
- (code >= 0x0C55 && code <= 0x0C56) ||
171
- (code >= 0x0C62 && code <= 0x0C63) ||
172
- code === 0x0C81 ||
173
- code === 0x0CBC ||
174
- code === 0x0CBF ||
175
- code === 0x0CC6 ||
176
- (code >= 0x0CCC && code <= 0x0CCD) ||
177
- (code >= 0x0CE2 && code <= 0x0CE3) ||
178
- (code >= 0x0D00 && code <= 0x0D01) ||
179
- (code >= 0x0D3B && code <= 0x0D3C) ||
180
- code === 0x0D41 ||
181
- (code >= 0x0D44 && code <= 0x0D44) ||
182
- code === 0x0D4D ||
183
- (code >= 0x0D62 && code <= 0x0D63) ||
184
- code === 0x0D81 ||
185
- code === 0x0DCA ||
186
- (code >= 0x0DD2 && code <= 0x0DD4) ||
187
- code === 0x0DD6 ||
188
- code === 0x0E31 ||
189
- (code >= 0x0E34 && code <= 0x0E3A) ||
190
- (code >= 0x0E47 && code <= 0x0E4E) ||
191
- code === 0x0EB1 ||
192
- (code >= 0x0EB4 && code <= 0x0EBC) ||
193
- (code >= 0x0EC8 && code <= 0x0ECD) ||
194
- (code >= 0x0F18 && code <= 0x0F19) ||
195
- code === 0x0F35 ||
196
- code === 0x0F37 ||
197
- code === 0x0F39 ||
198
- (code >= 0x0F71 && code <= 0x0F7E) ||
199
- (code >= 0x0F80 && code <= 0x0F84) ||
200
- (code >= 0x0F86 && code <= 0x0F87) ||
201
- (code >= 0x0F8D && code <= 0x0F97) ||
202
- (code >= 0x0F99 && code <= 0x0FBC) ||
203
- code === 0x0FC6 ||
204
- (code >= 0x102D && code <= 0x1030) ||
205
- (code >= 0x1032 && code <= 0x1037) ||
206
- (code >= 0x1039 && code <= 0x103A) ||
207
- (code >= 0x103D && code <= 0x103E) ||
208
- (code >= 0x1058 && code <= 0x1059) ||
209
- (code >= 0x105E && code <= 0x1060) ||
210
- (code >= 0x1071 && code <= 0x1074) ||
211
- code === 0x1082 ||
212
- (code >= 0x1085 && code <= 0x1086) ||
213
- code === 0x108D ||
214
- code === 0x109D ||
215
- (code >= 0x135D && code <= 0x135F) ||
216
- (code >= 0x1712 && code <= 0x1714) ||
217
- (code >= 0x1732 && code <= 0x1734) ||
218
- (code >= 0x1752 && code <= 0x1753) ||
219
- (code >= 0x1772 && code <= 0x1773) ||
220
- (code >= 0x17B4 && code <= 0x17B5) ||
221
- (code >= 0x17B7 && code <= 0x17BD) ||
222
- code === 0x17C6 ||
223
- (code >= 0x17C9 && code <= 0x17D3) ||
224
- code === 0x17DD ||
225
- (code >= 0x180B && code <= 0x180D) ||
226
- (code >= 0x1885 && code <= 0x1886) ||
227
- code === 0x18A9 ||
228
- (code >= 0x1920 && code <= 0x1922) ||
229
- (code >= 0x1927 && code <= 0x1928) ||
230
- code === 0x1932 ||
231
- (code >= 0x1939 && code <= 0x193B) ||
232
- (code >= 0x1A17 && code <= 0x1A18) ||
233
- code === 0x1A1B ||
234
- code === 0x1A56 ||
235
- (code >= 0x1A58 && code <= 0x1A5E) ||
236
- code === 0x1A60 ||
237
- code === 0x1A62 ||
238
- (code >= 0x1A65 && code <= 0x1A6C) ||
239
- (code >= 0x1A73 && code <= 0x1A7C) ||
240
- code === 0x1A7F ||
241
- (code >= 0x1AB0 && code <= 0x1ABE) ||
242
- (code >= 0x1B00 && code <= 0x1B03) ||
243
- code === 0x1B34 ||
244
- (code >= 0x1B36 && code <= 0x1B3A) ||
245
- code === 0x1B3C ||
246
- code === 0x1B42 ||
247
- (code >= 0x1B6B && code <= 0x1B73) ||
248
- (code >= 0x1B80 && code <= 0x1B81) ||
249
- (code >= 0x1BA2 && code <= 0x1BA5) ||
250
- (code >= 0x1BA8 && code <= 0x1BA9) ||
251
- (code >= 0x1BAB && code <= 0x1BAD) ||
252
- code === 0x1BE6 ||
253
- (code >= 0x1BE8 && code <= 0x1BE9) ||
254
- code === 0x1BED ||
255
- (code >= 0x1BEF && code <= 0x1BF1) ||
256
- (code >= 0x1C2C && code <= 0x1C33) ||
257
- (code >= 0x1C36 && code <= 0x1C37) ||
258
- (code >= 0x1CD0 && code <= 0x1CD2) ||
259
- (code >= 0x1CD4 && code <= 0x1CE0) ||
260
- (code >= 0x1CE2 && code <= 0x1CE8) ||
261
- code === 0x1CED ||
262
- code === 0x1CF4 ||
263
- (code >= 0x1CF8 && code <= 0x1CF9) ||
264
- (code >= 0x1DC0 && code <= 0x1DF9) ||
265
- (code >= 0x1DFB && code <= 0x1DFF) ||
266
- (code >= 0x200B && code <= 0x200F) || // Zero-width spaces
267
- (code >= 0x202A && code <= 0x202E) || // Bidirectional format characters
268
- (code >= 0x2060 && code <= 0x2064) || // Word joiner, etc.
269
- (code >= 0x2066 && code <= 0x206F) || // More bidirectional
270
- code === 0xFEFF || // Zero-width no-break space
271
- (code >= 0xFE00 && code <= 0xFE0F) || // Variation selectors
272
- (code >= 0xFE20 && code <= 0xFE2F) // Combining half marks
273
- );
302
+ return ZERO_WIDTH_SINGLES.has(code) || isInRanges(code, ZERO_WIDTH_RANGES);
274
303
  }
275
304
 
276
305
  /**
@@ -281,6 +310,7 @@ function isZeroWidth(code: number): boolean {
281
310
  * @returns True if the character has width 2
282
311
  */
283
312
  function isWideCharacter(code: number): boolean {
313
+ // cSpell: disable
284
314
  return (
285
315
  // Based on wcwidth table_wide.py for Unicode 15.1.0
286
316
  (code >= 0x1100 && code <= 0x115F) || // Hangul Jamo
@@ -380,4 +410,5 @@ function isWideCharacter(code: number): boolean {
380
410
  (code >= 0x20000 && code <= 0x2FFFD) || // CJK Extension B
381
411
  (code >= 0x30000 && code <= 0x3FFFD) // CJK Extension C
382
412
  );
413
+ // cSpell: enable
383
414
  }