import MarkdownIt from "markdown-it";
import mdTasksLists from 'markdown-it-task-lists';
-import code from '../services/code';
import Clipboard from "../services/clipboard";
import {debounce} from "../services/util";
this.pageId = this.$opts.pageId;
this.textDirection = this.$opts.textDirection;
this.imageUploadErrorText = this.$opts.imageUploadErrorText;
+ this.serverUploadLimitText = this.$opts.serverUploadLimitText;
this.markdown = new MarkdownIt({html: true});
this.markdown.use(mdTasksLists, {label: true});
this.displayStylesLoaded = false;
this.input = this.elem.querySelector('textarea');
- this.htmlInput = this.elem.querySelector('input[name=html]');
- this.cm = code.markdownEditor(this.input);
+
+ this.cm = null;
+ this.Code = null;
+ const cmLoadPromise = window.importVersioned('code').then(Code => {
+ this.cm = Code.markdownEditor(this.input);
+ this.Code = Code;
+ return this.cm;
+ });
this.onMarkdownScroll = this.onMarkdownScroll.bind(this);
const displayLoad = () => {
this.displayDoc = this.display.contentDocument;
- this.init();
+ this.init(cmLoadPromise);
};
if (this.display.contentDocument.readyState === 'complete') {
});
}
- init() {
+ init(cmLoadPromise) {
let lastClick = 0;
toolbarLabel.closest('.markdown-editor-wrap').classList.add('active');
});
- window.$events.listen('editor-markdown-update', value => {
- this.cm.setValue(value);
- this.updateAndRender();
+ cmLoadPromise.then(cm => {
+ this.codeMirrorSetup(cm);
+
+ // Refresh CodeMirror on container resize
+ const resizeDebounced = debounce(() => this.Code.updateLayout(cm), 100, false);
+ const observer = new ResizeObserver(resizeDebounced);
+ observer.observe(this.elem);
});
- this.codeMirrorSetup();
this.listenForBookStackEditorEvents();
// Scroll to text if needed.
// Set body content
this.displayDoc.body.className = 'page-content';
this.displayDoc.body.innerHTML = html;
- this.htmlInput.value = html;
// Copy styles from page head and set custom styles for editor
this.loadStylesIntoDisplay();
topElem.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth'});
}
- codeMirrorSetup() {
- const cm = this.cm;
+ codeMirrorSetup(cm) {
const context = this;
// Text direction
// cm.setOption('direction', this.textDirection);
cm.setOption('direction', 'ltr'); // Will force to remain as ltr for now due to issues when HTML is in editor.
// Custom key commands
- let metaKey = code.getMetaKey();
+ let metaKey = this.Code.getMetaKey();
const extraKeys = {};
// Insert Image shortcut
extraKeys[`${metaKey}-Alt-I`] = function(cm) {
actionInsertImage() {
const cursorPos = this.cm.getCursor('from');
window.ImageManager.show(image => {
+ const imageUrl = image.thumbs.display || image.url;
let selectedText = this.cm.getSelection();
- let newText = "[](" + image.url + ")";
+ let newText = "[](" + image.url + ")";
this.cm.focus();
this.cm.replaceSelection(newText);
this.cm.setCursor(cursorPos.line, cursorPos.ch + newText.length);
this.insertDrawing(resp.data, cursorPos);
DrawIO.close();
}).catch(err => {
- window.$events.emit('error', trans('errors.image_upload_error'));
- console.log(err);
+ this.handleDrawingUploadError(err);
});
});
}
this.cm.focus();
DrawIO.close();
}).catch(err => {
- window.$events.emit('error', this.imageUploadErrorText);
- console.log(err);
+ this.handleDrawingUploadError(err);
});
});
}
+ handleDrawingUploadError(error) {
+ if (error.status === 413) {
+ window.$events.emit('error', this.serverUploadLimitText);
+ } else {
+ window.$events.emit('error', this.imageUploadErrorText);
+ }
+ console.log(error);
+ }
+
// Make the editor full screen
actionFullScreen() {
const alreadyFullscreen = this.elem.classList.contains('fullscreen');