spotmark
Version:
A lightweight, customizable text highlighting library that illuminates matches in a content.
1 lines • 8.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/utils/regex.ts","../src/lib/utils/query.ts","../src/lib/core.ts"],"names":["DEFAULT_OPTIONS","DIACRITICS_MAP","SPECIAL_CHARS","isSpecialCharacter","character","escapeCharacter","replaceCharacterWithDiacritics","lowerCase","diacriticSet","set","getRegexFlags","options","processWordSearch","processed","words","processCharacter","result","processQuery","query","error","createHighlighter","config","__spreadValues","text","queryRegex","flags","regex","match"],"mappings":"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","file":"index.mjs","sourcesContent":["import { HighlightOptions } from './types';\n\nexport const DEFAULT_OPTIONS: HighlightOptions = {\n caseSensitive: false,\n className: 'text-highlight',\n diacritics: true,\n ignorePunctuation: false,\n matchAll: true,\n separateWordSearch: true,\n tag: 'span',\n};\n\nexport const DIACRITICS_MAP: string[] = [\n 'aàáảãạăằắẳẵặâầấẩẫậäåāąæ',\n 'cçćč',\n 'dđď',\n 'eèéẻẽẹêềếểễệëěēę',\n 'iìíỉĩịîïī',\n 'lł',\n 'nñňń',\n 'oòóỏõọôồốổỗộơởỡớờợöøōœ',\n 'rř',\n 'sšśșş',\n 'tťțţ',\n 'uùúủũụưừứửữựûüůū',\n 'yýỳỷỹỵÿ',\n 'zžżź',\n];\n\nexport const SPECIAL_CHARS: string[] = [\n '-',\n '[',\n ']',\n '{',\n '}',\n '(',\n ')',\n '*',\n '+',\n '?',\n '.',\n ',',\n '\\\\',\n '^',\n '$',\n '|',\n '#',\n];\n","import type { HighlightOptions } from '../types';\nimport { DIACRITICS_MAP, SPECIAL_CHARS } from '../constants';\n\nexport const isSpecialCharacter = (character: string): boolean => SPECIAL_CHARS.includes(character);\n\nexport const escapeCharacter = (character: string): string => `\\\\${character}`;\n\nexport const replaceCharacterWithDiacritics = (character: string): string => {\n if (!character) return '';\n\n const lowerCase = character.toLowerCase();\n const diacriticSet = DIACRITICS_MAP.find((set) => set.includes(lowerCase));\n\n if (!diacriticSet) {\n return character;\n }\n\n return character === lowerCase ? `[${diacriticSet}]` : `[${diacriticSet.toUpperCase()}]`;\n};\n\nexport const getRegexFlags = (options: HighlightOptions): string =>\n [options.matchAll && 'g', options.ignorePunctuation && 'u', !options.caseSensitive && 'i'].filter(Boolean).join('');\n","import type { HighlightOptions } from '../types';\nimport { isSpecialCharacter, escapeCharacter, replaceCharacterWithDiacritics } from './regex';\n\nconst processWordSearch = (processed: string): string => {\n const words = processed.split(/\\s+/).filter(Boolean);\n\n if (!words.length) {\n throw new Error('Invalid query: No valid words found after processing');\n }\n\n return words.join('|');\n};\n\nconst processCharacter = (character: string, options: HighlightOptions): string => {\n if (isSpecialCharacter(character)) {\n return escapeCharacter(character);\n }\n\n let result = options.diacritics ? replaceCharacterWithDiacritics(character) : character;\n\n if (options.ignorePunctuation) {\n result += '[\\\\p{P}]*';\n }\n\n return result;\n};\n\nexport const processQuery = (query: string, options: HighlightOptions): string => {\n if (!query) {\n throw new Error('Invalid query: Query must be a non-empty string');\n }\n\n try {\n const characters = Array.from(query);\n const processed = characters.map((character) => processCharacter(character, options)).join('');\n\n return options.separateWordSearch ? processWordSearch(processed) : processed;\n } catch (error) {\n throw new Error(`Failed to process query: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n};\n","import type { HighlightOptions, Highlighter } from './types';\nimport { DEFAULT_OPTIONS } from './constants';\nimport { processQuery } from './utils/query';\nimport { getRegexFlags } from './utils/regex';\n\nexport const createHighlighter = (config?: Partial<HighlightOptions>): Highlighter => {\n const options: HighlightOptions = {\n ...DEFAULT_OPTIONS,\n ...config,\n };\n\n return (text: string, query: string): string => {\n if (!text || typeof text !== 'string') {\n return '';\n }\n\n if (!query || typeof query !== 'string') {\n return text;\n }\n\n try {\n const queryRegex = processQuery(query, options);\n const flags = getRegexFlags(options);\n const regex = new RegExp(queryRegex, flags);\n\n return text.replace(regex, (match) => `<${options.tag} class=\"${options.className}\">${match}</${options.tag}>`);\n } catch (error) {\n console.error('Failed to perform text replacement:', error);\n return text;\n }\n };\n};\n"]}