previewHtml.js (1266B)
1 import DOMPurify from 'dompurify'; 2 import { MODES } from './editorConstants.js'; 3 4 const MARKDOWN_SANITIZE_OPTIONS = { ADD_ATTR: ['class', 'rel'] }; 5 6 let markedParser = null; 7 let markedLoadPromise = null; 8 let orgToHtmlSync = null; 9 let orgLoadPromise = null; 10 11 export function ensureMarkedLoaded() { 12 if (markedParser) { 13 return Promise.resolve(markedParser); 14 } 15 if (!markedLoadPromise) { 16 markedLoadPromise = import('marked').then((module) => { 17 markedParser = module.marked; 18 return markedParser; 19 }); 20 } 21 return markedLoadPromise; 22 } 23 24 export function ensureOrgLoaded() { 25 if (orgToHtmlSync) { 26 return Promise.resolve(orgToHtmlSync); 27 } 28 if (!orgLoadPromise) { 29 orgLoadPromise = import('./org/pipeline.js').then((module) => { 30 orgToHtmlSync = module.orgToHtmlSync; 31 return orgToHtmlSync; 32 }); 33 } 34 return orgLoadPromise; 35 } 36 37 export function buildPreviewHtml(mode, content) { 38 if (!content || !content.trim()) { 39 return ''; 40 } 41 42 if (mode === MODES.ORG) { 43 if (!orgToHtmlSync) return ''; 44 return orgToHtmlSync(content); 45 } 46 47 if (!markedParser) { 48 return ''; 49 } 50 51 const rawHtml = markedParser.parse(content, { gfm: true, breaks: true }); 52 return DOMPurify.sanitize(rawHtml, MARKDOWN_SANITIZE_OPTIONS); 53 }