1 import {patchDomFromHtmlString} from "../services/vdom";
6 * @param {MarkdownEditor} editor
10 this.container = editor.config.displayEl;
13 this.lastDisplayClick = 0;
15 if (this.container.contentDocument.readyState === 'complete') {
18 this.container.addEventListener('load', this.onLoad.bind(this));
23 this.doc = this.container.contentDocument;
25 this.loadStylesIntoDisplay();
26 this.doc.body.className = 'page-content';
28 // Prevent markdown display link click redirect
29 this.doc.addEventListener('click', this.onDisplayClick.bind(this));
33 * @param {MouseEvent} event
35 onDisplayClick(event) {
36 const isDblClick = Date.now() - this.lastDisplayClick < 300;
38 const link = event.target.closest('a');
40 event.preventDefault();
41 window.open(link.getAttribute('href'));
45 const drawing = event.target.closest('[drawio-diagram]');
46 if (drawing !== null && isDblClick) {
47 this.editor.actions.editDrawing(drawing);
51 this.lastDisplayClick = Date.now();
54 loadStylesIntoDisplay() {
55 this.doc.documentElement.classList.add('markdown-editor-display');
57 // Set display to be dark mode if parent is
58 if (document.documentElement.classList.contains('dark-mode')) {
59 this.doc.documentElement.style.backgroundColor = '#222';
60 this.doc.documentElement.classList.add('dark-mode');
63 this.doc.head.innerHTML = '';
64 const styles = document.head.querySelectorAll('style,link[rel=stylesheet]');
65 for (const style of styles) {
66 const copy = style.cloneNode(true);
67 this.doc.head.appendChild(copy);
72 * Patch the display DOM with the given HTML content.
73 * @param {String} html
76 const body = this.doc.body;
78 if (body.children.length === 0) {
79 const wrap = document.createElement('div');
80 this.doc.body.append(wrap);
83 const target = body.children[0];
85 patchDomFromHtmlString(target, html);
89 * Scroll to the given block index within the display content.
90 * Will scroll to the end if the index is -1.
91 * @param {Number} index
93 scrollToIndex(index) {
94 const elems = this.doc.body?.children[0]?.children;
95 if (elems && elems.length <= index) return;
97 const topElem = (index === -1) ? elems[elems.length-1] : elems[index];
98 topElem.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth'});