mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-28 06:21:33 +00:00
fix(tui): trim markdown wrap spaces (#22062)
* fix(tui): trim markdown wrap spaces Use trim-aware wrapping for markdown prose so word-wrapped continuation lines do not keep boundary spaces. * fix(tui): simplify markdown wrap nodes Keep trim-aware wrapping on the rendered markdown text node while leaving nested inline segments as plain virtual text. * fix(tui): trim definition row wrapping Apply trim-aware wrapping to markdown definition rows so continuation lines match other prose rows. * fix(tui): trim list and quote wrapping Put trim-aware wrapping on the rendered list and quote rows that own markdown inline layout. * fix(tui): preserve markdown nesting with trim wrap Move list and quote indentation into layout padding so trim-aware wrapping does not erase nested markdown structure. * fix(tui): trim only soft wrap spaces Change trim-aware wrapping to remove whitespace only at soft-wrap boundaries so original leading inline spaces stay verbatim. * fix(tui): preserve extra boundary whitespace Trim only one soft-wrap boundary whitespace character so wrap-trim avoids leading continuations without collapsing intentional spacing. * fix(tui): align styled wrap-trim mapping Update styled text remapping to skip the single whitespace removed at soft-wrap boundaries without dropping preserved indentation. * fix(tui): clean wrap trim test helpers Clarify boundary-trim wording and strip OSC escapes from markdown render test output. * fix(tui): strip osc before ansi in markdown tests Remove OSC escapes from raw render output before SGR/CSI cleanup so markdown render assertions stay plain text.
This commit is contained in:
parent
78b0008f44
commit
a7e7921dbc
5 changed files with 147 additions and 68 deletions
|
|
@ -77,6 +77,32 @@ function truncate(text: string, columns: number, position: 'start' | 'middle' |
|
|||
return sliceFit(text, 0, columns - 1) + ELLIPSIS
|
||||
}
|
||||
|
||||
function trimSoftWrapBoundaries(text: string, maxWidth: number): string {
|
||||
return text
|
||||
.split('\n')
|
||||
.map(line => {
|
||||
const pieces = wrapAnsi(line, maxWidth, { trim: false, hard: true }).split('\n')
|
||||
|
||||
if (pieces.length === 1) {
|
||||
return pieces[0]!
|
||||
}
|
||||
|
||||
for (let index = 0; index < pieces.length - 1; index++) {
|
||||
const current = pieces[index]!
|
||||
const next = pieces[index + 1]!
|
||||
|
||||
if (/\s$/.test(current)) {
|
||||
pieces[index] = current.replace(/\s$/, '')
|
||||
} else if (/^\s/.test(next)) {
|
||||
pieces[index + 1] = next.replace(/^\s/, '')
|
||||
}
|
||||
}
|
||||
|
||||
return pieces.join('\n')
|
||||
})
|
||||
.join('\n')
|
||||
}
|
||||
|
||||
function computeWrap(text: string, maxWidth: number, wrapType: Styles['textWrap']): string {
|
||||
if (wrapType === 'wrap') {
|
||||
return wrapAnsi(text, maxWidth, { trim: false, hard: true })
|
||||
|
|
@ -87,7 +113,7 @@ function computeWrap(text: string, maxWidth: number, wrapType: Styles['textWrap'
|
|||
}
|
||||
|
||||
if (wrapType === 'wrap-trim') {
|
||||
return wrapAnsi(text, maxWidth, { trim: true, hard: true })
|
||||
return trimSoftWrapBoundaries(text, maxWidth)
|
||||
}
|
||||
|
||||
if (wrapType!.startsWith('truncate')) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue