markdown.service.ts 1002 B

1234567891011121314151617181920212223242526
  1. import { Injectable } from '@angular/core';
  2. import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
  3. import { marked } from 'marked';
  4. /**
  5. * Markdown → SafeHtml 渲染器。
  6. *
  7. * 用于把 LLM 返回的 markdown 文本转成可绑定到 [innerHTML] 的安全 HTML。
  8. * 内容来源是受信任的后端代理(fmode LLM 网关),未引入 DOMPurify 以减小包体;
  9. * 若未来接入用户提供的 markdown,建议补一道 DOMPurify。
  10. */
  11. @Injectable({ providedIn: 'root' })
  12. export class MarkdownService {
  13. constructor(private sanitizer: DomSanitizer) {
  14. marked.setOptions({
  15. gfm: true,
  16. breaks: true, // 单换行视为 <br>,更贴近聊天显示
  17. });
  18. }
  19. /** 渲染完整 markdown,绑定到 [innerHTML]。流式过程也可调用(marked 容忍不完整 markdown)。 */
  20. render(text: string): SafeHtml {
  21. const html = marked.parse(text || '', { async: false }) as string;
  22. return this.sanitizer.bypassSecurityTrustHtml(html);
  23. }
  24. }