fix(studio): 修复流式返回时空间引用角标渲染错乱
Streamdown 的 parseIncompleteMarkdown 会把流式途中未闭合的 [[cite:N 当作未完成链接改写成 [[cite:N](streamdown:incomplete-link),导致 rehypeCitations 匹配失败、引用闪成坏链接。送入渲染前剥除未完成的引用 标记,待 ]] 到齐再由 rehype 渲染为上标。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
33276dae76
commit
95dec0e72e
1 file changed
+16
-1
@@ -358,6 +358,20 @@ function MessageImage({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// While a notebook citation marker is still streaming in (e.g. "[[cite:64" or
|
||||||
|
// "[[cite:101]"), Streamdown's parseIncompleteMarkdown treats the trailing
|
||||||
|
// unclosed "[" as an incomplete link and rewrites it to
|
||||||
|
// "[[cite:64](streamdown:incomplete-link)", which the rehypeCitations regex can
|
||||||
|
// no longer match — so the citation flickers as a broken link mid-stream. We
|
||||||
|
// strip the half-arrived marker so it stays hidden until the closing "]]"
|
||||||
|
// arrives, at which point rehypeCitations renders it. A complete
|
||||||
|
// "[[cite:101]]" has no trailing incomplete marker, so this is a no-op.
|
||||||
|
const INCOMPLETE_CITE_TAIL = /\[\[(?:c(?:i(?:t(?:e(?::\d*\]?)?)?)?)?)?$/;
|
||||||
|
|
||||||
|
function stripIncompleteCitationMarker(content: string): string {
|
||||||
|
return content.replace(INCOMPLETE_CITE_TAIL, '');
|
||||||
|
}
|
||||||
|
|
||||||
function MessageContent_({
|
function MessageContent_({
|
||||||
className,
|
className,
|
||||||
message,
|
message,
|
||||||
@@ -460,7 +474,8 @@ function MessageContent_({
|
|||||||
? stripArtifactTag(stripUploadedFilesTag(rawContent))
|
? stripArtifactTag(stripUploadedFilesTag(rawContent))
|
||||||
: '';
|
: '';
|
||||||
}
|
}
|
||||||
return applyInlineCitations(rawContent ?? '', displaySources);
|
const withCitations = applyInlineCitations(rawContent ?? '', displaySources);
|
||||||
|
return stripIncompleteCitationMarker(withCitations);
|
||||||
}, [rawContent, isHuman, displaySources]);
|
}, [rawContent, isHuman, displaySources]);
|
||||||
const parsedHumanContent = useMemo(
|
const parsedHumanContent = useMemo(
|
||||||
() =>
|
() =>
|
||||||
|
|||||||
Reference in new issue
Block a user