diff --git a/packages/runtime/src/host/text-measure.ts b/packages/runtime/src/host/text-measure.ts index 714fe57..8cd34f5 100644 --- a/packages/runtime/src/host/text-measure.ts +++ b/packages/runtime/src/host/text-measure.ts @@ -37,13 +37,14 @@ export type WrapMode = NonNullable; * `slice-ansi` can overshoot when a wide character straddles the boundary, so * we reduce the slice position until the result fits. */ -function safeSliceEnd(text: string, maxCols: number): string { +export function safeSliceEnd(text: string, maxCols: number): string { if (maxCols <= 0) return ""; - let sliced = sliceAnsi(text, 0, maxCols); + let end = maxCols; + let sliced = sliceAnsi(text, 0, end); let w = stringWidth(sliced); - while (w > maxCols && maxCols > 0) { - maxCols--; - sliced = sliceAnsi(text, 0, maxCols); + while (w > maxCols && end > 0) { + end--; + sliced = sliceAnsi(text, 0, end); w = stringWidth(sliced); } return sliced; diff --git a/packages/runtime/src/paint/paint.ts b/packages/runtime/src/paint/paint.ts index fddf53e..1c65d28 100644 --- a/packages/runtime/src/paint/paint.ts +++ b/packages/runtime/src/paint/paint.ts @@ -19,7 +19,7 @@ import type { BoxProps, } from "../host/nodes.ts"; import { createRoot as createIsoRoot } from "../host/nodes.ts"; -import { wrapText } from "../host/text-measure.ts"; +import { wrapText, safeSliceEnd } from "../host/text-measure.ts"; import { attachYoga, detachYoga, @@ -29,19 +29,6 @@ import { export type Transformer = (line: string, lineIndex: number) => string; -function safeSliceEnd(text: string, maxCols: number): string { - if (maxCols <= 0) return ""; - let end = maxCols; - let sliced = sliceAnsi(text, 0, end); - let w = stringWidth(sliced); - while (w > maxCols && end > 0) { - end--; - sliced = sliceAnsi(text, 0, end); - w = stringWidth(sliced); - } - return sliced; -} - interface ClipRect { x1: number | undefined; x2: number | undefined;