| const PUNCTUATION_REGEX = /\p{P}/gu; |
|
|
| function removeDiacritics(s: string, form: "NFD" | "NFKD" = "NFD"): string { |
| return s.normalize(form).replace(/[\u0300-\u036f]/g, ""); |
| } |
|
|
| export function generateSearchTokens(value: string): string[] { |
| const fullTitleToken = removeDiacritics(value) |
| .replace(PUNCTUATION_REGEX, "") |
| .replaceAll(/\s+/g, "") |
| .toLowerCase(); |
| return [ |
| ...new Set([ |
| ...removeDiacritics(value) |
| .split(/\s+/) |
| .map((word) => word.replace(PUNCTUATION_REGEX, "").toLowerCase()) |
| .filter((word) => word.length), |
| ...(fullTitleToken.length ? [fullTitleToken] : []), |
| ]), |
| ]; |
| } |
|
|
| function escapeForRegExp(s: string): string { |
| return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); |
| } |
|
|
| export function generateQueryTokens(query: string): RegExp[] { |
| return removeDiacritics(query) |
| .split(/\s+/) |
| .map((word) => word.replace(PUNCTUATION_REGEX, "").toLowerCase()) |
| .filter((word) => word.length) |
| .map((token) => new RegExp(`^${escapeForRegExp(token)}`)); |
| } |
|
|