MCPcopy Create free account
hub / github.com/MoonshotAI/kimi-code / segmentWithMarkers

Function segmentWithMarkers

packages/pi-tui/src/components/editor.ts:40–92  ·  view source on GitHub ↗

* A segmenter that wraps Intl.Segmenter and merges graphemes that fall * within paste markers into single atomic segments. This makes cursor * movement, deletion, word-wrap, etc. treat paste markers as single units. * * Only markers whose numeric ID exists in `validIds` are merged.

(
	text: string,
	baseSegmenter: Intl.Segmenter,
	validIds: Set<number>,
)

Source from the content-addressed store, hash-verified

38 * Only markers whose numeric ID exists in `validIds` are merged.
39 */
40function segmentWithMarkers(
41 text: string,
42 baseSegmenter: Intl.Segmenter,
43 validIds: Set<number>,
44): Iterable<Intl.SegmentData> {
45 // Fast path: no paste markers in the text or no valid IDs.
46 if (validIds.size === 0 || !text.includes("[paste #")) {
47 return baseSegmenter.segment(text);
48 }
49
50 // Find all marker spans with valid IDs.
51 const markers: Array<{ start: number; end: number }> = [];
52 for (const m of text.matchAll(PASTE_MARKER_REGEX)) {
53 const id = Number.parseInt(m[1]!, 10);
54 if (!validIds.has(id)) continue;
55 markers.push({ start: m.index, end: m.index + m[0].length });
56 }
57 if (markers.length === 0) {
58 return baseSegmenter.segment(text);
59 }
60
61 // Build merged segment list.
62 const baseSegments = baseSegmenter.segment(text);
63 const result: Intl.SegmentData[] = [];
64 let markerIdx = 0;
65
66 for (const seg of baseSegments) {
67 // Skip past markers that are entirely before this segment.
68 while (markerIdx < markers.length && markers[markerIdx]!.end <= seg.index) {
69 markerIdx++;
70 }
71
72 const marker = markerIdx < markers.length ? markers[markerIdx]! : null;
73
74 if (marker && seg.index >= marker.start && seg.index < marker.end) {
75 // This segment falls inside a marker.
76 // If this is the first segment of the marker, emit a merged segment.
77 if (seg.index === marker.start) {
78 const markerText = text.slice(marker.start, marker.end);
79 result.push({
80 segment: markerText,
81 index: marker.start,
82 input: text,
83 });
84 }
85 // Otherwise skip (already merged into the first segment).
86 } else {
87 result.push(seg);
88 }
89 }
90
91 return result;
92}
93
94/**
95 * Represents a chunk of text for word-wrap layout.

Callers 1

segmentMethod · 0.85

Calls 3

hasMethod · 0.65
segmentMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected