/** * Trouve-KA — rendu sécurisé des extraits avec surlignage * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai */ import { Fragment } from "react"; import { cn } from "@/lib/utils"; /** Retire toute balise HTML restante (le contenu distant est non fiable). */ function stripTags(value: string): string { return value.replace(/<[^>]*>/g, ""); } /** Décode les entités HTML courantes (l'ordre garde `&` en dernier). */ function decodeEntities(value: string): string { return value .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, '"') .replace(/�?39;/g, "'") .replace(/ /g, " ") .replace(/&/g, "&"); } interface SnippetProps { html: string; className?: string; } /** * Rend un extrait de recherche sans `dangerouslySetInnerHTML` : seuls les * segments `` du backend deviennent des éléments de surlignage; tout le * reste est traité comme du texte brut (React échappe automatiquement). */ export function Snippet({ html, className }: SnippetProps) { const parts = html.split(/([\s\S]*?)<\/em>/g); return (

{parts.map((part, index) => { const text = decodeEntities(stripTags(part)); if (!text) return null; return index % 2 === 1 ? ( {text} ) : ( {text} ); })}

); }