normalize.js 1.17 KB
/**
 * 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}`;
}