@jrichman/ink 6.4.5 → 6.4.7
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/build/components/App.d.ts +2 -0
- package/build/components/App.js +2 -1
- package/build/components/App.js.map +1 -1
- package/build/components/AppContext.d.ts +2 -0
- package/build/components/AppContext.js.map +1 -1
- package/build/components/Box.d.ts +1 -0
- package/build/data-limited-lru-map.js +11 -1
- package/build/data-limited-lru-map.js.map +1 -1
- package/build/dom.d.ts +2 -0
- package/build/dom.js +29 -20
- package/build/dom.js.map +1 -1
- package/build/index.d.ts +4 -2
- package/build/index.js +3 -1
- package/build/index.js.map +1 -1
- package/build/ink.d.ts +7 -0
- package/build/ink.js +30 -4
- package/build/ink.js.map +1 -1
- package/build/layout.d.ts +18 -0
- package/build/layout.js +54 -0
- package/build/layout.js.map +1 -0
- package/build/measure-element.d.ts +29 -1
- package/build/measure-element.js +515 -0
- package/build/measure-element.js.map +1 -1
- package/build/measure-text.js +21 -14
- package/build/measure-text.js.map +1 -1
- package/build/render-node-to-output.d.ts +7 -1
- package/build/render-node-to-output.js +53 -16
- package/build/render-node-to-output.js.map +1 -1
- package/build/render.d.ts +11 -0
- package/build/render.js +2 -0
- package/build/render.js.map +1 -1
- package/build/renderer.d.ts +2 -1
- package/build/renderer.js +135 -1
- package/build/renderer.js.map +1 -1
- package/build/selection.d.ts +44 -0
- package/build/selection.js +370 -0
- package/build/selection.js.map +1 -0
- package/build/styles.d.ts +8 -0
- package/build/styles.js.map +1 -1
- package/build/text-wrap.d.ts +1 -0
- package/build/text-wrap.js +13 -0
- package/build/text-wrap.js.map +1 -1
- package/build/vertical-gap.d.ts +17 -0
- package/build/vertical-gap.js +20 -0
- package/build/vertical-gap.js.map +1 -0
- package/package.json +1 -1
- package/build/wrap-text.d.ts +0 -6
- package/build/wrap-text.js +0 -120
- package/build/wrap-text.js.map +0 -1
package/build/measure-element.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import Yoga from 'yoga-layout';
|
|
2
2
|
import { getScrollLeft, getScrollTop } from './scroll.js';
|
|
3
|
+
import squashTextNodes from './squash-text-nodes.js';
|
|
4
|
+
import { toStyledCharacters, inkCharacterWidth, styledCharsToString, } from './measure-text.js';
|
|
5
|
+
import { wrapOrTruncateStyledChars } from './text-wrap.js';
|
|
6
|
+
import getMaxWidth from './get-max-width.js';
|
|
7
|
+
import { processLayout } from './layout.js';
|
|
3
8
|
/**
|
|
4
9
|
Measure the dimensions of a particular `<Box>` element.
|
|
5
10
|
*/
|
|
@@ -186,5 +191,515 @@ export const getHorizontalScrollbarBoundingBox = (node, offset) => {
|
|
|
186
191
|
},
|
|
187
192
|
};
|
|
188
193
|
};
|
|
194
|
+
export const collectSortedFragments = (node) => {
|
|
195
|
+
const fragments = [];
|
|
196
|
+
const collect = (currentNode, coords, isSelectable) => {
|
|
197
|
+
const { x, y, visualX, visualY } = coords;
|
|
198
|
+
let v = 0;
|
|
199
|
+
let h = 0;
|
|
200
|
+
let currentSelectable = isSelectable;
|
|
201
|
+
const { userSelect } = currentNode.style;
|
|
202
|
+
if (userSelect === 'none') {
|
|
203
|
+
currentSelectable = false;
|
|
204
|
+
}
|
|
205
|
+
else if (userSelect === 'text' || userSelect === 'all') {
|
|
206
|
+
currentSelectable = true;
|
|
207
|
+
}
|
|
208
|
+
if (currentNode.nodeName === 'ink-text' ||
|
|
209
|
+
currentNode.nodeName === 'ink-virtual-text') {
|
|
210
|
+
if (currentSelectable) {
|
|
211
|
+
const text = getText(currentNode);
|
|
212
|
+
fragments.push({
|
|
213
|
+
node: currentNode,
|
|
214
|
+
text,
|
|
215
|
+
x,
|
|
216
|
+
y,
|
|
217
|
+
visualX,
|
|
218
|
+
visualY,
|
|
219
|
+
width: currentNode.yogaNode?.getComputedWidth() ?? 0,
|
|
220
|
+
height: currentNode.yogaNode?.getComputedHeight() ?? 0,
|
|
221
|
+
});
|
|
222
|
+
return { v: 0, h: 0, hasContent: true };
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
v: currentNode.yogaNode?.getComputedHeight() ?? 0,
|
|
226
|
+
h: currentNode.yogaNode?.getComputedWidth() ?? 0,
|
|
227
|
+
hasContent: false,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
if (currentNode.nodeName === 'ink-box' ||
|
|
231
|
+
currentNode.nodeName === 'ink-root') {
|
|
232
|
+
if (!currentNode.yogaNode ||
|
|
233
|
+
currentNode.yogaNode.getDisplay() === Yoga.DISPLAY_NONE) {
|
|
234
|
+
return { v: 0, h: 0, hasContent: false };
|
|
235
|
+
}
|
|
236
|
+
const borderTop = currentNode.yogaNode.getComputedBorder(Yoga.EDGE_TOP);
|
|
237
|
+
const borderBottom = currentNode.yogaNode.getComputedBorder(Yoga.EDGE_BOTTOM);
|
|
238
|
+
const borderLeft = currentNode.yogaNode.getComputedBorder(Yoga.EDGE_LEFT);
|
|
239
|
+
const borderRight = currentNode.yogaNode.getComputedBorder(Yoga.EDGE_RIGHT);
|
|
240
|
+
v += borderTop + borderBottom;
|
|
241
|
+
h += borderLeft + borderRight;
|
|
242
|
+
const flexDirection = currentNode.yogaNode.getFlexDirection();
|
|
243
|
+
const isColumn = flexDirection === Yoga.FLEX_DIRECTION_COLUMN ||
|
|
244
|
+
flexDirection === Yoga.FLEX_DIRECTION_COLUMN_REVERSE;
|
|
245
|
+
let siblingRemovedH = 0;
|
|
246
|
+
let siblingRemovedV = 0;
|
|
247
|
+
let childHasContent = false;
|
|
248
|
+
for (const child of currentNode.childNodes) {
|
|
249
|
+
if (child.yogaNode) {
|
|
250
|
+
const parentBorderLeft = currentNode.yogaNode.getComputedBorder(Yoga.EDGE_LEFT);
|
|
251
|
+
const childX = x +
|
|
252
|
+
child.yogaNode.getComputedLeft() -
|
|
253
|
+
parentBorderLeft -
|
|
254
|
+
siblingRemovedH;
|
|
255
|
+
const childY = y + child.yogaNode.getComputedTop() - borderTop - siblingRemovedV;
|
|
256
|
+
const childVisualX = visualX + child.yogaNode.getComputedLeft();
|
|
257
|
+
const childVisualY = visualY + child.yogaNode.getComputedTop();
|
|
258
|
+
const res = collect(child, {
|
|
259
|
+
x: childX,
|
|
260
|
+
y: childY,
|
|
261
|
+
visualX: childVisualX,
|
|
262
|
+
visualY: childVisualY,
|
|
263
|
+
}, currentSelectable);
|
|
264
|
+
if (res.hasContent) {
|
|
265
|
+
childHasContent = true;
|
|
266
|
+
}
|
|
267
|
+
if (isColumn) {
|
|
268
|
+
siblingRemovedV += res.v;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
siblingRemovedH += res.h;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (isColumn) {
|
|
276
|
+
v += siblingRemovedV;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
h += siblingRemovedH;
|
|
280
|
+
}
|
|
281
|
+
if (!childHasContent && userSelect === 'none') {
|
|
282
|
+
return {
|
|
283
|
+
v: currentNode.yogaNode.getComputedHeight(),
|
|
284
|
+
h: currentNode.yogaNode.getComputedWidth(),
|
|
285
|
+
hasContent: false,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
return { v, h, hasContent: childHasContent };
|
|
289
|
+
}
|
|
290
|
+
return { v: 0, h: 0, hasContent: false };
|
|
291
|
+
};
|
|
292
|
+
const { v, h } = collect(node, { x: 0, y: 0, visualX: 0, visualY: 0 }, true);
|
|
293
|
+
fragments.sort((a, b) => {
|
|
294
|
+
if (a.y !== b.y) {
|
|
295
|
+
return a.y - b.y;
|
|
296
|
+
}
|
|
297
|
+
return a.x - b.x;
|
|
298
|
+
});
|
|
299
|
+
return { fragments, removedVertical: v, removedHorizontal: h };
|
|
300
|
+
};
|
|
301
|
+
export const getText = (node) => {
|
|
302
|
+
if (node.nodeName === '#text') {
|
|
303
|
+
return node.nodeValue;
|
|
304
|
+
}
|
|
305
|
+
if (node.nodeName === 'ink-text' || node.nodeName === 'ink-virtual-text') {
|
|
306
|
+
const text = squashTextNodes(node);
|
|
307
|
+
const styledChars = toStyledCharacters(text);
|
|
308
|
+
const plainText = styledChars.map(char => char.value).join('');
|
|
309
|
+
const textWrap = node.style.textWrap ?? 'wrap';
|
|
310
|
+
if (textWrap.startsWith('truncate')) {
|
|
311
|
+
const maxWidth = getMaxWidth(node.yogaNode);
|
|
312
|
+
const lines = wrapOrTruncateStyledChars(styledChars, maxWidth, textWrap);
|
|
313
|
+
return styledCharsToString(lines[0]);
|
|
314
|
+
}
|
|
315
|
+
return plainText;
|
|
316
|
+
}
|
|
317
|
+
if (node.nodeName === 'ink-box' || node.nodeName === 'ink-root') {
|
|
318
|
+
if (!node.yogaNode) {
|
|
319
|
+
return '';
|
|
320
|
+
}
|
|
321
|
+
const { state, lineBottom } = processLayout(node, {
|
|
322
|
+
initialState: () => ({ result: '' }),
|
|
323
|
+
onNewline(count, state) {
|
|
324
|
+
state.result += '\n'.repeat(count);
|
|
325
|
+
},
|
|
326
|
+
onSpace(count, state) {
|
|
327
|
+
state.result += ' '.repeat(count);
|
|
328
|
+
},
|
|
329
|
+
onText(fragment, state) {
|
|
330
|
+
state.result += fragment.text;
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
// Trailing newlines
|
|
334
|
+
const { removedVertical } = collectSortedFragments(node);
|
|
335
|
+
const height = node.yogaNode?.getComputedHeight() ?? 0;
|
|
336
|
+
const innerHeight = height - removedVertical;
|
|
337
|
+
if (innerHeight > lineBottom) {
|
|
338
|
+
state.result += '\n'.repeat(innerHeight - lineBottom);
|
|
339
|
+
}
|
|
340
|
+
return state.result;
|
|
341
|
+
}
|
|
342
|
+
return '';
|
|
343
|
+
};
|
|
344
|
+
const handleVerticalGap = (fragment, state, y, options) => {
|
|
345
|
+
if (fragment.y < state.lineBottom) {
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
if (state.trailingCandidate !== -1) {
|
|
349
|
+
return state.trailingCandidate;
|
|
350
|
+
}
|
|
351
|
+
const gap = fragment.y - state.lineBottom;
|
|
352
|
+
const newlines = state.offset > 0 ? 1 + gap : gap;
|
|
353
|
+
if (y < fragment.visualY) {
|
|
354
|
+
if (options?.snapToGap === 'end') {
|
|
355
|
+
return state.offset + newlines;
|
|
356
|
+
}
|
|
357
|
+
if (options?.snapToGap === 'start') {
|
|
358
|
+
return state.offset;
|
|
359
|
+
}
|
|
360
|
+
if (newlines > 0) {
|
|
361
|
+
const distance = fragment.visualY - y;
|
|
362
|
+
const clampedDistance = Math.min(distance, newlines);
|
|
363
|
+
return state.offset + newlines - clampedDistance;
|
|
364
|
+
}
|
|
365
|
+
return state.offset;
|
|
366
|
+
}
|
|
367
|
+
if (newlines > 0) {
|
|
368
|
+
state.offset += newlines;
|
|
369
|
+
state.currentX = 0;
|
|
370
|
+
state.lineBottom = fragment.y;
|
|
371
|
+
}
|
|
372
|
+
return undefined;
|
|
373
|
+
};
|
|
374
|
+
const handleHorizontalGap = (fragment, state, x, y, options) => {
|
|
375
|
+
const gap = fragment.x - state.currentX;
|
|
376
|
+
if (y >= fragment.visualY &&
|
|
377
|
+
y < fragment.visualY + 1 &&
|
|
378
|
+
x < fragment.visualX) {
|
|
379
|
+
if (options?.snapToGap === 'end') {
|
|
380
|
+
return state.offset + gap;
|
|
381
|
+
}
|
|
382
|
+
if (options?.snapToGap === 'start') {
|
|
383
|
+
return state.offset;
|
|
384
|
+
}
|
|
385
|
+
if (gap > 0) {
|
|
386
|
+
const distance = fragment.visualX - x;
|
|
387
|
+
const clampedDistance = Math.min(distance, gap);
|
|
388
|
+
return state.offset + gap - clampedDistance;
|
|
389
|
+
}
|
|
390
|
+
return state.offset;
|
|
391
|
+
}
|
|
392
|
+
if (gap > 0) {
|
|
393
|
+
state.offset += gap;
|
|
394
|
+
state.currentX = fragment.x;
|
|
395
|
+
}
|
|
396
|
+
return undefined;
|
|
397
|
+
};
|
|
398
|
+
const handleContentMatch = (fragment, state, x, y, options) => {
|
|
399
|
+
const isVerticalMatch = y >= fragment.visualY && y < fragment.visualY + fragment.height;
|
|
400
|
+
const isHorizontalMatch = x >= fragment.visualX && x <= fragment.visualX + fragment.width;
|
|
401
|
+
if (isVerticalMatch && (isHorizontalMatch || x < fragment.visualX)) {
|
|
402
|
+
return (state.offset +
|
|
403
|
+
getTextOffset(fragment.node, x - fragment.visualX, y - fragment.visualY, options));
|
|
404
|
+
}
|
|
405
|
+
if (isVerticalMatch && x > fragment.visualX + fragment.width) {
|
|
406
|
+
state.trailingCandidate =
|
|
407
|
+
state.offset +
|
|
408
|
+
getTextOffset(fragment.node, x - fragment.visualX, y - fragment.visualY, options);
|
|
409
|
+
}
|
|
410
|
+
return undefined;
|
|
411
|
+
};
|
|
412
|
+
const processFragment = (fragment, state, x, y, options) => {
|
|
413
|
+
const verticalResult = handleVerticalGap(fragment, state, y, options);
|
|
414
|
+
if (verticalResult !== undefined) {
|
|
415
|
+
return verticalResult;
|
|
416
|
+
}
|
|
417
|
+
const horizontalResult = handleHorizontalGap(fragment, state, x, y, options);
|
|
418
|
+
if (horizontalResult !== undefined) {
|
|
419
|
+
return horizontalResult;
|
|
420
|
+
}
|
|
421
|
+
const contentResult = handleContentMatch(fragment, state, x, y, options);
|
|
422
|
+
if (contentResult !== undefined) {
|
|
423
|
+
return contentResult;
|
|
424
|
+
}
|
|
425
|
+
state.offset += fragment.text.length;
|
|
426
|
+
const newlines = (fragment.text.match(/\n/g) ?? []).length;
|
|
427
|
+
if (newlines > 0) {
|
|
428
|
+
const lastNewlineIndex = fragment.text.lastIndexOf('\n');
|
|
429
|
+
state.currentX = fragment.text.length - lastNewlineIndex - 1;
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
state.currentX += fragment.text.length;
|
|
433
|
+
}
|
|
434
|
+
state.lineBottom = Math.max(state.lineBottom, fragment.y + fragment.height);
|
|
435
|
+
return undefined;
|
|
436
|
+
};
|
|
437
|
+
const getTextOffsetForTextNode = (node, x, y, options) => {
|
|
438
|
+
if (y < 0) {
|
|
439
|
+
return 0;
|
|
440
|
+
}
|
|
441
|
+
const text = squashTextNodes(node);
|
|
442
|
+
const styledChars = toStyledCharacters(text);
|
|
443
|
+
const maxWidth = getMaxWidth(node.yogaNode);
|
|
444
|
+
const textWrap = node.style.textWrap ?? 'wrap';
|
|
445
|
+
const lines = wrapOrTruncateStyledChars(styledChars, maxWidth, textWrap);
|
|
446
|
+
let currentY = 0;
|
|
447
|
+
for (const line of lines) {
|
|
448
|
+
if (y === currentY) {
|
|
449
|
+
let currentX = 0;
|
|
450
|
+
for (const char of line) {
|
|
451
|
+
const charWidth = inkCharacterWidth(char.value);
|
|
452
|
+
if (x < currentX + charWidth) {
|
|
453
|
+
const index = styledChars.indexOf(char);
|
|
454
|
+
if (index !== -1) {
|
|
455
|
+
let currentOffset = 0;
|
|
456
|
+
for (let i = 0; i < index; i++) {
|
|
457
|
+
currentOffset += styledChars[i].value.length;
|
|
458
|
+
}
|
|
459
|
+
if (options?.snapToChar === 'end' && x >= currentX) {
|
|
460
|
+
currentOffset += char.value.length;
|
|
461
|
+
}
|
|
462
|
+
return currentOffset;
|
|
463
|
+
}
|
|
464
|
+
return getText(node).length;
|
|
465
|
+
}
|
|
466
|
+
currentX += charWidth;
|
|
467
|
+
}
|
|
468
|
+
const lastChar = line.at(-1);
|
|
469
|
+
if (lastChar) {
|
|
470
|
+
const index = styledChars.indexOf(lastChar);
|
|
471
|
+
if (index !== -1) {
|
|
472
|
+
let currentOffset = 0;
|
|
473
|
+
for (let i = 0; i <= index; i++) {
|
|
474
|
+
currentOffset += styledChars[i].value.length;
|
|
475
|
+
}
|
|
476
|
+
return currentOffset;
|
|
477
|
+
}
|
|
478
|
+
return getText(node).length;
|
|
479
|
+
}
|
|
480
|
+
// If we are here, we finished the line loop.
|
|
481
|
+
// This happens if the line is empty, or if x was greater than the line width.
|
|
482
|
+
// But wait, if x < 0, we should have returned inside the loop (first char).
|
|
483
|
+
// Unless the line is empty.
|
|
484
|
+
// If the line is empty, we should return the offset at the start of this line.
|
|
485
|
+
// We need to find the offset corresponding to the start of this line.
|
|
486
|
+
// Since we don't track offsets easily, we can find the first char of the line (if any) or the char after the previous line.
|
|
487
|
+
// However, the issue in the test was returning 1 instead of 5.
|
|
488
|
+
// This means it matched index 1.
|
|
489
|
+
// Index 1 is '2'.
|
|
490
|
+
// This means `x` was interpreted as matching '2'.
|
|
491
|
+
// This implies `x` was not < width of '1'.
|
|
492
|
+
// If `x` was 1.
|
|
493
|
+
// `visualX` must have been 0.
|
|
494
|
+
// But we saw `visualX` should be 2.
|
|
495
|
+
// Let's look at the logs I added.
|
|
496
|
+
// I need to run the test again and see the logs.
|
|
497
|
+
// I missed checking the logs in the previous turn output because I was focused on the failure message.
|
|
498
|
+
// The logs should be in the output.
|
|
499
|
+
return 0;
|
|
500
|
+
}
|
|
501
|
+
currentY++;
|
|
502
|
+
}
|
|
503
|
+
return getText(node).length;
|
|
504
|
+
};
|
|
505
|
+
export const getTextOffset = (node, x, y, options) => {
|
|
506
|
+
if (node.nodeName === '#text') {
|
|
507
|
+
return 0;
|
|
508
|
+
}
|
|
509
|
+
if (node.nodeName === 'ink-text' || node.nodeName === 'ink-virtual-text') {
|
|
510
|
+
return getTextOffsetForTextNode(node, x, y, options);
|
|
511
|
+
}
|
|
512
|
+
if (node.nodeName === 'ink-box' || node.nodeName === 'ink-root') {
|
|
513
|
+
const { fragments, removedVertical } = collectSortedFragments(node);
|
|
514
|
+
const state = {
|
|
515
|
+
offset: 0,
|
|
516
|
+
currentX: 0,
|
|
517
|
+
lineBottom: 0,
|
|
518
|
+
trailingCandidate: -1,
|
|
519
|
+
};
|
|
520
|
+
for (const fragment of fragments) {
|
|
521
|
+
const result = processFragment(fragment, state, x, y, options);
|
|
522
|
+
if (result !== undefined) {
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (state.trailingCandidate !== -1) {
|
|
527
|
+
return state.trailingCandidate;
|
|
528
|
+
}
|
|
529
|
+
const height = node.yogaNode?.getComputedHeight() ?? 0;
|
|
530
|
+
const innerHeight = height - removedVertical;
|
|
531
|
+
if (innerHeight > state.lineBottom) {
|
|
532
|
+
const gap = innerHeight - state.lineBottom;
|
|
533
|
+
if (y >= state.lineBottom) {
|
|
534
|
+
// This logic uses logical Y (lineBottom) and visual Y (y).
|
|
535
|
+
// This is potentially buggy if they diverge.
|
|
536
|
+
// But we don't have a better way to map trailing empty lines without more info.
|
|
537
|
+
// Assuming trailing lines match logical height.
|
|
538
|
+
const relativeY = y - state.lineBottom;
|
|
539
|
+
return state.offset + Math.min(relativeY, gap);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
return state.offset;
|
|
543
|
+
}
|
|
544
|
+
return 0;
|
|
545
|
+
};
|
|
546
|
+
const findNodeInSquashed = (root, offset) => {
|
|
547
|
+
let currentOffset = 0;
|
|
548
|
+
const findNode = (node) => {
|
|
549
|
+
if (node.nodeName === '#text') {
|
|
550
|
+
const { length } = node.nodeValue;
|
|
551
|
+
if (offset >= currentOffset && offset <= currentOffset + length) {
|
|
552
|
+
return { node, offset: offset - currentOffset };
|
|
553
|
+
}
|
|
554
|
+
currentOffset += length;
|
|
555
|
+
}
|
|
556
|
+
else if (node.nodeName === 'ink-text' ||
|
|
557
|
+
node.nodeName === 'ink-virtual-text') {
|
|
558
|
+
for (const child of node.childNodes) {
|
|
559
|
+
const result = findNode(child);
|
|
560
|
+
if (result) {
|
|
561
|
+
return result;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return undefined;
|
|
566
|
+
};
|
|
567
|
+
return findNode(root);
|
|
568
|
+
};
|
|
569
|
+
export const findNodeAtOffset = (node, targetOffset) => {
|
|
570
|
+
if (node.nodeName === '#text') {
|
|
571
|
+
return { node, offset: Math.min(targetOffset, node.nodeValue.length) };
|
|
572
|
+
}
|
|
573
|
+
if (node.nodeName === 'ink-text' || node.nodeName === 'ink-virtual-text') {
|
|
574
|
+
return findNodeInSquashed(node, targetOffset);
|
|
575
|
+
}
|
|
576
|
+
if (node.nodeName === 'ink-box' || node.nodeName === 'ink-root') {
|
|
577
|
+
if (!node.yogaNode) {
|
|
578
|
+
return undefined;
|
|
579
|
+
}
|
|
580
|
+
const { fragments } = collectSortedFragments(node);
|
|
581
|
+
let currentOffset = 0;
|
|
582
|
+
let lineBottom = 0;
|
|
583
|
+
let currentX = 0;
|
|
584
|
+
for (const fragment of fragments) {
|
|
585
|
+
if (fragment.y >= lineBottom) {
|
|
586
|
+
const gap = fragment.y - lineBottom;
|
|
587
|
+
const newlines = currentOffset > 0 ? 1 + gap : gap;
|
|
588
|
+
if (newlines > 0) {
|
|
589
|
+
if (targetOffset < currentOffset + newlines) {
|
|
590
|
+
return findNodeInSquashed(fragment.node, 0);
|
|
591
|
+
}
|
|
592
|
+
currentOffset += newlines;
|
|
593
|
+
currentX = 0;
|
|
594
|
+
lineBottom = fragment.y;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
if (fragment.x > currentX) {
|
|
598
|
+
const spaces = fragment.x - currentX;
|
|
599
|
+
if (targetOffset < currentOffset + spaces) {
|
|
600
|
+
return findNodeInSquashed(fragment.node, 0);
|
|
601
|
+
}
|
|
602
|
+
currentOffset += spaces;
|
|
603
|
+
currentX = fragment.x;
|
|
604
|
+
}
|
|
605
|
+
const textLength = fragment.text.length;
|
|
606
|
+
if (targetOffset < currentOffset + textLength) {
|
|
607
|
+
return findNodeInSquashed(fragment.node, targetOffset - currentOffset);
|
|
608
|
+
}
|
|
609
|
+
currentOffset += textLength;
|
|
610
|
+
const newlinesInText = (fragment.text.match(/\n/g) ?? []).length;
|
|
611
|
+
if (newlinesInText > 0) {
|
|
612
|
+
const lastNewlineIndex = fragment.text.lastIndexOf('\n');
|
|
613
|
+
currentX = fragment.text.length - lastNewlineIndex - 1;
|
|
614
|
+
}
|
|
615
|
+
else {
|
|
616
|
+
currentX += fragment.text.length;
|
|
617
|
+
}
|
|
618
|
+
lineBottom = Math.max(lineBottom, fragment.y + fragment.height);
|
|
619
|
+
}
|
|
620
|
+
if (fragments.length > 0) {
|
|
621
|
+
const lastFragment = fragments.at(-1);
|
|
622
|
+
const { text } = lastFragment;
|
|
623
|
+
return findNodeInSquashed(lastFragment.node, text.length);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
return undefined;
|
|
627
|
+
};
|
|
628
|
+
export const hitTest = (node, x, y) => {
|
|
629
|
+
const { fragments } = collectSortedFragments(node);
|
|
630
|
+
let bestMatch;
|
|
631
|
+
for (const fragment of fragments) {
|
|
632
|
+
let vDist = 0;
|
|
633
|
+
let hDist = 0;
|
|
634
|
+
// Calculate vertical distance
|
|
635
|
+
if (y < fragment.visualY) {
|
|
636
|
+
vDist = fragment.visualY - y;
|
|
637
|
+
}
|
|
638
|
+
else if (y >= fragment.visualY + fragment.height) {
|
|
639
|
+
vDist = y - (fragment.visualY + fragment.height - 1);
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
vDist = 0;
|
|
643
|
+
}
|
|
644
|
+
// Calculate horizontal distance
|
|
645
|
+
if (x < fragment.visualX) {
|
|
646
|
+
hDist = fragment.visualX - x;
|
|
647
|
+
}
|
|
648
|
+
else if (x > fragment.visualX + fragment.width) {
|
|
649
|
+
hDist = x - (fragment.visualX + fragment.width);
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
hDist = 0;
|
|
653
|
+
}
|
|
654
|
+
// Prioritize exact matches (vDist=0, hDist=0)
|
|
655
|
+
if (vDist === 0 && hDist === 0) {
|
|
656
|
+
bestMatch = { fragment, vDist, hDist };
|
|
657
|
+
break;
|
|
658
|
+
}
|
|
659
|
+
if (bestMatch) {
|
|
660
|
+
// Compare with best match
|
|
661
|
+
// Priority:
|
|
662
|
+
// 1. Vertical distance (smaller is better)
|
|
663
|
+
// 2. Horizontal distance (smaller is better)
|
|
664
|
+
if (vDist < bestMatch.vDist) {
|
|
665
|
+
bestMatch = { fragment, vDist, hDist };
|
|
666
|
+
}
|
|
667
|
+
else if (vDist === bestMatch.vDist && hDist < bestMatch.hDist) {
|
|
668
|
+
bestMatch = { fragment, vDist, hDist };
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
bestMatch = { fragment, vDist, hDist };
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
if (bestMatch) {
|
|
676
|
+
const { fragment } = bestMatch;
|
|
677
|
+
const relativeX = x - fragment.visualX;
|
|
678
|
+
const relativeY = y - fragment.visualY;
|
|
679
|
+
const offsetInSquashed = getTextOffset(fragment.node, relativeX, relativeY);
|
|
680
|
+
let currentOffset = 0;
|
|
681
|
+
const findNode = (n) => {
|
|
682
|
+
if (n.nodeName === '#text') {
|
|
683
|
+
const { length } = n.nodeValue;
|
|
684
|
+
if (offsetInSquashed >= currentOffset &&
|
|
685
|
+
offsetInSquashed <= currentOffset + length) {
|
|
686
|
+
return { node: n, offset: offsetInSquashed - currentOffset };
|
|
687
|
+
}
|
|
688
|
+
currentOffset += length;
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
for (const child of n.childNodes) {
|
|
692
|
+
const result = findNode(child);
|
|
693
|
+
if (result) {
|
|
694
|
+
return result;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return undefined;
|
|
699
|
+
};
|
|
700
|
+
return findNode(fragment.node);
|
|
701
|
+
}
|
|
702
|
+
return undefined;
|
|
703
|
+
};
|
|
189
704
|
export default measureElement;
|
|
190
705
|
//# sourceMappingURL=measure-element.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure-element.js","sourceRoot":"","sources":["../src/measure-element.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"measure-element.js","sourceRoot":"","sources":["../src/measure-element.ts"],"names":[],"mappings":"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"}
|
package/build/measure-text.js
CHANGED
|
@@ -77,22 +77,20 @@ export function toStyledCharacters(text) {
|
|
|
77
77
|
if (!nextFirstCodePoint) {
|
|
78
78
|
break;
|
|
79
79
|
}
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
//
|
|
80
|
+
// Unicode Mark category includes:
|
|
81
|
+
// - Combining Diacritical Marks (U+0300-036F)
|
|
82
|
+
// - Thai combining characters (U+0E31-0E3A, U+0E47-0E4E)
|
|
83
|
+
// - Variation selectors (U+FE00-FE0F)
|
|
84
|
+
// - Combining enclosing keycap (U+20E3)
|
|
85
|
+
// - And many other combining marks across Unicode
|
|
86
|
+
const isUnicodeMark = /\p{Mark}/u.test(nextCharacter.value);
|
|
87
|
+
// Skin tone modifiers (emoji modifiers, not in Mark category)
|
|
83
88
|
const isSkinToneModifier = nextFirstCodePoint >= 0x1_f3_fb && nextFirstCodePoint <= 0x1_f3_ff;
|
|
89
|
+
// Zero-width joiner (used in emoji sequences)
|
|
84
90
|
const isZeroWidthJoiner = nextFirstCodePoint === 0x20_0d;
|
|
85
|
-
|
|
86
|
-
// Tags block (U+E0000 - U+E007F)
|
|
91
|
+
// Tags block (U+E0000 - U+E007F, used for flag emoji)
|
|
87
92
|
const isTagsBlock = nextFirstCodePoint >= 0xe_00_00 && nextFirstCodePoint <= 0xe_00_7f;
|
|
88
|
-
|
|
89
|
-
const isCombiningMark = nextFirstCodePoint >= 0x03_00 && nextFirstCodePoint <= 0x03_6f;
|
|
90
|
-
const isCombining = isVariationSelector ||
|
|
91
|
-
isSkinToneModifier ||
|
|
92
|
-
isZeroWidthJoiner ||
|
|
93
|
-
isKeycap ||
|
|
94
|
-
isTagsBlock ||
|
|
95
|
-
isCombiningMark;
|
|
93
|
+
const isCombining = isUnicodeMark || isSkinToneModifier || isZeroWidthJoiner || isTagsBlock;
|
|
96
94
|
if (!isCombining) {
|
|
97
95
|
break;
|
|
98
96
|
}
|
|
@@ -131,7 +129,16 @@ export function inkCharacterWidth(text) {
|
|
|
131
129
|
if (width !== undefined) {
|
|
132
130
|
return width;
|
|
133
131
|
}
|
|
134
|
-
|
|
132
|
+
let calculatedWidth;
|
|
133
|
+
try {
|
|
134
|
+
calculatedWidth = currentStringWidth(text);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore errors and use default width of 1.
|
|
138
|
+
// We catch this result to avoid throwing exceptions repeatedly.
|
|
139
|
+
calculatedWidth = 1;
|
|
140
|
+
console.warn(`Failed to calculate string width for ${JSON.stringify(text)}`);
|
|
141
|
+
}
|
|
135
142
|
widthCache.set(text, calculatedWidth);
|
|
136
143
|
return calculatedWidth;
|
|
137
144
|
}
|