refactor(highlights): split highlighting utilities into modules

- Create textMatching module for text search utilities
- Create domUtils module for DOM manipulation helpers
- Create htmlMatching module for HTML highlight application
- Reduce highlightMatching.tsx from 217 lines to 59 lines
- All files now under 210 lines
This commit is contained in:
Gigi
2025-10-07 21:54:41 +01:00
parent 9ae918f744
commit 59ecc29b9c
4 changed files with 195 additions and 163 deletions

View File

@@ -0,0 +1,46 @@
import { Highlight } from '../../types/highlights'
export interface HighlightMatch {
highlight: Highlight
startIndex: number
endIndex: number
}
/**
* Normalize whitespace for flexible matching
*/
export const normalizeWhitespace = (str: string) => str.replace(/\s+/g, ' ').trim()
/**
* Find all occurrences of highlight text in the content
*/
export function findHighlightMatches(
content: string,
highlights: Highlight[]
): HighlightMatch[] {
const matches: HighlightMatch[] = []
for (const highlight of highlights) {
if (!highlight.content || highlight.content.trim().length === 0) {
continue
}
const searchText = highlight.content.trim()
let startIndex = 0
let index = content.indexOf(searchText, startIndex)
while (index !== -1) {
matches.push({
highlight,
startIndex: index,
endIndex: index + searchText.length
})
startIndex = index + searchText.length
index = content.indexOf(searchText, startIndex)
}
}
return matches.sort((a, b) => a.startIndex - b.startIndex)
}