normalize.js
1.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* Normaliza texto para búsqueda:
* - Convierte a minúsculas
* - Elimina acentos/diacríticos
* - Elimina espacios extra
*/
export function normalizeText(text) {
if (!text) return '';
return text
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '') // Elimina diacríticos
.replace(/\s+/g, ' ') // Espacios múltiples a uno
.trim();
}
/**
* Resalta coincidencias en el texto
* @param {string} text - Texto original
* @param {string} query - Búsqueda del usuario
* @returns {string} HTML con <mark> en coincidencias
*/
export function highlightMatch(text, query) {
if (!query || !text) return text;
const normalizedQuery = normalizeText(query);
const normalizedText = normalizeText(text);
// Encontrar posición en texto normalizado
const index = normalizedText.indexOf(normalizedQuery);
if (index === -1) return text;
// Aplicar highlight en texto original (misma posición)
const before = text.slice(0, index);
const match = text.slice(index, index + query.length);
const after = text.slice(index + query.length);
return `${before}<mark class="bg-yellow-200 rounded px-0.5">${match}</mark>${after}`;
}