Spaces:
Running
Running
import { escapeRegExp } from "./escapeRegExp"; | |
export function filterMatches( | |
matches: { match: string; index: number; element: string }[] | |
): { match: string; index: number; element: string }[] { | |
const filtered: { match: string; index: number; element: string }[] = []; | |
for (const current of matches) { | |
const isContained = filtered.some( | |
(existing) => current.index >= existing.index && current.index < existing.index + existing.match.length | |
); | |
if (!isContained) { | |
filtered.push(current); | |
} | |
} | |
return filtered; | |
} | |
export function getAllMatches(sortedAbbreviations: string[], input: string) { | |
const allMatches: { match: string; index: number; element: string }[] = []; | |
sortedAbbreviations.forEach((element) => { | |
const escapedElement = escapeRegExp(element); | |
const regex = new RegExp(`(?<=\\s|^|["(])(${escapedElement})(?=\\s|$|[,.!?:;")])`, "g"); | |
let match: RegExpExecArray | null; | |
while ((match = regex.exec(input)) !== null) { | |
allMatches.push({ match: match[0], index: match.index, element }); | |
} | |
}); | |
return allMatches; | |
} | |
export function highlightMatches(input: string, matches: { match: string; index: number; element: string }[]): string { | |
const filteredMatches = filterMatches(matches); | |
filteredMatches.sort((a, b) => a.index - b.index); | |
let highlightedString = input; | |
let offset = 0; | |
for (const match of filteredMatches) { | |
const startIndex = match.index + offset; | |
const endIndex = startIndex + match.match.length; | |
highlightedString = | |
highlightedString.slice(0, startIndex) + | |
`<a href="#" class="abbreviation">${match.element}</a>` + | |
highlightedString.slice(endIndex); | |
offset += `<a href="#" class="abbreviation">${match.element}</a>`.length - match.match.length; | |
} | |
return highlightedString; | |
} | |