mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
99ffd714ce
* refactor: extract markdown core package * refactor: remove old markdown sources * fix: use source paths for markdown core imports * fix: clean markdown package dependency ownership * fix: refresh root shrinkwrap for markdown dependency move
68 lines
1.6 KiB
TypeScript
68 lines
1.6 KiB
TypeScript
function resolveChunkEarlyReturn(text: string, limit: number): string[] | undefined {
|
|
if (!text) {
|
|
return [];
|
|
}
|
|
if (limit <= 0) {
|
|
return [text];
|
|
}
|
|
if (text.length <= limit) {
|
|
return [text];
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function scanParenAwareBreakpoints(text: string): { lastNewline: number; lastWhitespace: number } {
|
|
let lastNewline = -1;
|
|
let lastWhitespace = -1;
|
|
let depth = 0;
|
|
|
|
for (let i = 0; i < text.length; i++) {
|
|
const char = text[i];
|
|
if (char === "(") {
|
|
depth += 1;
|
|
continue;
|
|
}
|
|
if (char === ")" && depth > 0) {
|
|
depth -= 1;
|
|
continue;
|
|
}
|
|
if (depth !== 0) {
|
|
continue;
|
|
}
|
|
if (char === "\n") {
|
|
lastNewline = i;
|
|
} else if (/\s/.test(char)) {
|
|
lastWhitespace = i;
|
|
}
|
|
}
|
|
|
|
return { lastNewline, lastWhitespace };
|
|
}
|
|
|
|
export function chunkText(text: string, limit: number): string[] {
|
|
const early = resolveChunkEarlyReturn(text, limit);
|
|
if (early) {
|
|
return early;
|
|
}
|
|
|
|
const chunks: string[] = [];
|
|
let cursor = 0;
|
|
while (cursor < text.length) {
|
|
if (text.length - cursor <= limit) {
|
|
chunks.push(text.slice(cursor));
|
|
break;
|
|
}
|
|
const windowEnd = Math.min(text.length, cursor + limit);
|
|
const window = text.slice(cursor, windowEnd);
|
|
const { lastNewline, lastWhitespace } = scanParenAwareBreakpoints(window);
|
|
const breakOffset = lastNewline > 0 ? lastNewline : lastWhitespace;
|
|
const end = breakOffset > 0 ? cursor + breakOffset : windowEnd;
|
|
chunks.push(text.slice(cursor, end));
|
|
cursor = end;
|
|
while (cursor < text.length && /\s/.test(text[cursor] ?? "")) {
|
|
cursor += 1;
|
|
}
|
|
}
|
|
return chunks;
|
|
}
|