错误: 在流出 Markdown 渲染中缺少段落和代码块前的新行
作者: ibmany-spec创建于 2026年6月22日更新于 2026年9月7日
描述错误
当从OpenAI兼容的API(如Grok或自定义代理网关)中流出响应时,段落和代码块有时会失去它们的前导和后导的新行,导致它们直接合并到上一个输出行,而不会在终端中出现适当的换行.
例如,答复可能表现为: (而不是在"一"之前有双线新线) 还有: Python ' (而不是代码块之前的双线新线)
根由分析
该bug位于"TerminalRender:: render markdown"的"Rust/crates/rusty-ZClaude-cli/src/rest.rs"内:
[必须使用]
pub fn 渲染 markdown( &self, markdown: &str) - > 字符串{
让正态=正态 取消 栅栏(标记下);
让 mut 输出 = 字符串: new ();
//.
用于解析器中的事件: new ext( & normalized, options: all ()) {
自定义活动(...) ;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
输出.trim end (.) to string () // <--- here
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
在流出过程中,“MarkdownStream State::push”解析中间块(使用“find stream safe borderary”划分边界)。
已准备好'块(例如,最多为一行空行代表一段断段)以后行(例如由段边界产生的n')正确结尾。- 然而,
rester.markdown to ansi(和ready)'呼叫rest markdown()',该命令无条件执行`.trim end()'在所显示的字符串上。 - 将所有后接的新行(包括代表段落/块分隔器的结构 “%nn')。
- 由于这些新线被从输出块中剥去,而原来的 " 准备 " 文本被 " 自己 " 消耗殆尽,所以这些新线完全从终端打印中丢失。
- 当下一个块(例如列表项目或代码块开始)被打印时,它直接被输出到上一个文本上,没有任何换行符。
建议的修补
在 " TerminalRender " 中引入一种对流友好的渲染方法,在流块生成时保留后继的白空间/新线,并在 " Markdown Stream State:push " 内使用。
例如:
- 在 " 终端发货人 " ( " Rust/crates/rusty-Claude-cli/src/ress.rs " ):
[必须使用]
pub fn 渲染 mark down stream( &self, mark down: &str) - > 字符串{
让正态=正态 取消 栅栏(标记下);
让 mut 输出 = 字符串: new ();
让 mut state = renderstate: 默认(;)
允许 mut 代码 语言 = 字符串: : new ();
让 mut 代码 缓冲=字符串:: new ();
让 mut in code block=假;
用于解析器中的事件: new ext( & normalized, options: all ()) {
自定义活动( E)
事件,
状态( M),
输出( M),
隐藏代码( M)
& mut 代码 语言,
在 code 块中移动( M),
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
产出 // 不在此调用 trim end( )
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
[必须使用]
阴道fn
. . . . . . .
内容来源: ultraworkers/claw-code