"dropzone": "^5.9.3",
"markdown-it": "^13.0.1",
"markdown-it-task-lists": "^2.1.1",
+ "snabbdom": "^3.5.0",
"sortablejs": "^1.15.0"
},
"devDependencies": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/snabbdom": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.5.0.tgz",
+ "integrity": "sha512-Ff5BKG18KrrPuskHJlA9aujPHqEabItaDl96l7ZZndF4zt5AYSczz7ZjjgQAX5IBd5cd25lw9NfgX21yVUJ+9g==",
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
"node_modules/sortablejs": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz",
"object-inspect": "^1.9.0"
}
},
+ "snabbdom": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.5.0.tgz",
+ "integrity": "sha512-Ff5BKG18KrrPuskHJlA9aujPHqEabItaDl96l7ZZndF4zt5AYSczz7ZjjgQAX5IBd5cd25lw9NfgX21yVUJ+9g=="
+ },
"sortablejs": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz",
"dropzone": "^5.9.3",
"markdown-it": "^13.0.1",
"markdown-it-task-lists": "^2.1.1",
+ "snabbdom": "^3.5.0",
"sortablejs": "^1.15.0"
}
}
import mdTasksLists from 'markdown-it-task-lists';
import Clipboard from "../services/clipboard";
import {debounce} from "../services/util";
-
+import {patchDomFromHtmlString} from "../services/vdom";
import DrawIO from "../services/drawio";
class MarkdownEditor {
updateAndRender() {
const content = this.cm.getValue();
this.input.value = content;
+
const html = this.markdown.render(content);
window.$events.emit('editor-html-change', html);
window.$events.emit('editor-markdown-change', content);
// Set body content
+ const target = this.getDisplayTarget();
this.displayDoc.body.className = 'page-content';
- this.displayDoc.body.innerHTML = html;
+ patchDomFromHtmlString(target, html);
// Copy styles from page head and set custom styles for editor
this.loadStylesIntoDisplay();
}
+ getDisplayTarget() {
+ const body = this.displayDoc.body;
+
+ if (body.children.length === 0) {
+ const wrap = document.createElement('div');
+ this.displayDoc.body.append(wrap);
+ }
+
+ return body.children[0];
+ }
+
loadStylesIntoDisplay() {
if (this.displayStylesLoaded) return;
this.displayDoc.documentElement.classList.add('markdown-editor-display');
--- /dev/null
+import {
+ init,
+ attributesModule,
+ toVNode
+} from "snabbdom";
+
+let patcher;
+
+/**
+ * @returns {Function}
+ */
+function getPatcher() {
+ if (patcher) return patcher;
+
+
+ patcher = init([
+ attributesModule,
+ ]);
+
+ return patcher;
+}
+
+/**
+ * @param {Element} domTarget
+ * @param {String} html
+ */
+export function patchDomFromHtmlString(domTarget, html) {
+ const contentDom = document.createElement('div');
+ contentDom.innerHTML = html;
+ getPatcher()(toVNode(domTarget), toVNode(contentDom));
+}
\ No newline at end of file