Files
LoreMind/web/src/app/shared/markdown.pipe.ts

24 lines
918 B
TypeScript

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import DOMPurify from 'dompurify';
import { marked } from 'marked';
/**
* Pipe markdown → HTML sanitise. Utilise pour le rendu des reponses IA.
* Combine marked (parser) + DOMPurify (anti-XSS) puis bypass la sanitization
* Angular puisque le contenu est deja nettoye.
*
* Configure en mode synchrone (`async: false`) pour eviter une Promise.
*/
@Pipe({ name: 'markdown', standalone: true })
export class MarkdownPipe implements PipeTransform {
constructor(private readonly sanitizer: DomSanitizer) {}
transform(value: string | null | undefined): SafeHtml {
if (!value) return '';
const html = marked.parse(value, { async: false, gfm: true, breaks: true }) as string;
const clean = DOMPurify.sanitize(html);
return this.sanitizer.bypassSecurityTrustHtml(clean);
}
}