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; | |
| } | |