Fix log search filtering to match against plain text instead of ANSI escape codes

Move styles array outside the parse loop in ansiToHtml so styles accumulate across sequences, and use stripAnsi when filtering live logs so search matches visible text.
This commit is contained in:
Chris Wanstrath 2026-03-18 11:23:06 -07:00
parent a824d62058
commit 1e4d66cbe4
2 changed files with 3 additions and 3 deletions

View File

@ -34,6 +34,7 @@ export function ansiToHtml(text: string): string {
let result = ''
let last = 0
let open = false
const styles: string[] = []
let match: RegExpExecArray | null
while ((match = ESC.exec(text)) !== null) {
@ -41,7 +42,6 @@ export function ansiToHtml(text: string): string {
last = match.index + match[0].length
const codes = match[1] ? match[1].split(';').map(Number) : [0]
const styles: string[] = []
for (const code of codes) {
if (code === 0) {

View File

@ -1,6 +1,6 @@
import { define } from '@because/forge'
import type { App, LogLine as LogLineType } from '../../shared/types'
import { ansiToHtml } from '../ansi'
import { ansiToHtml, stripAnsi } from '../ansi'
import { getLogDates, getLogsForDate } from '../api'
import { isNarrow } from '../state'
import { LogLine, LogsContainer, LogsHeader, LogTime, Section, SectionTitle } from '../styles'
@ -92,7 +92,7 @@ function LogsContent() {
const state = getState(currentApp.name)
const isLive = state.selectedDate === 'live'
const filteredLiveLogs = filterLogs(currentApp.logs ?? [], state.searchFilter, l => l.text)
const filteredLiveLogs = filterLogs(currentApp.logs ?? [], state.searchFilter, l => stripAnsi(l.text))
const filteredHistoricalLogs = filterLogs(state.historicalLogs, state.searchFilter, l => l)
return (