snow-editor

small markdown and org-mode editor
Log | Files | Refs | README

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 }