src/lib/previewHtml.js (view raw)
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 |
import DOMPurify from 'dompurify';
import { MODES } from './editorConstants.js';
import { parseOrgMode } from './parseOrgMode.js';
const SANITIZE_OPTIONS = { ADD_ATTR: ['class', 'rel'] };
let markedParser = null;
let markedLoadPromise = null;
export function ensureMarkedLoaded() {
if (markedParser) {
return Promise.resolve(markedParser);
}
if (!markedLoadPromise) {
markedLoadPromise = import('marked').then((module) => {
markedParser = module.marked;
return markedParser;
});
}
return markedLoadPromise;
}
export function buildPreviewHtml(mode, content) {
if (!content || !content.trim()) {
return '';
}
if (mode === MODES.ORG) {
return DOMPurify.sanitize(parseOrgMode(content), SANITIZE_OPTIONS);
}
if (!markedParser) {
return '';
}
const rawHtml = markedParser.parse(content, { gfm: true, breaks: true });
return DOMPurify.sanitize(rawHtml, SANITIZE_OPTIONS);
}
|