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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import DOMPurify from 'dompurify';
import { MODES } from './editorConstants.js';
const MARKDOWN_SANITIZE_OPTIONS = { ADD_ATTR: ['class', 'rel'] };
let markedParser = null;
let markedLoadPromise = null;
let orgToHtmlSync = null;
let orgLoadPromise = 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 ensureOrgLoaded() {
if (orgToHtmlSync) {
return Promise.resolve(orgToHtmlSync);
}
if (!orgLoadPromise) {
orgLoadPromise = import('./org/pipeline.js').then((module) => {
orgToHtmlSync = module.orgToHtmlSync;
return orgToHtmlSync;
});
}
return orgLoadPromise;
}
export function buildPreviewHtml(mode, content) {
if (!content || !content.trim()) {
return '';
}
if (mode === MODES.ORG) {
if (!orgToHtmlSync) return '';
return orgToHtmlSync(content);
}
if (!markedParser) {
return '';
}
const rawHtml = markedParser.parse(content, { gfm: true, breaks: true });
return DOMPurify.sanitize(rawHtml, MARKDOWN_SANITIZE_OPTIONS);
}
|