From aa62e69dabb78f41804c5b24eacd64010b1ca326 Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Sat, 27 Feb 2021 15:37:19 -0500 Subject: [PATCH] MarkdownEditorDriver should be its own driver. Splitting it out instead of hacking it onto BasicEditorDriver gives us more flexibility in customizing it for markdown area. --- extensions/markdown/js/src/forum/index.js | 31 ++++--------------- .../forum/util/MarkdownAreaEditorDriver.js | 28 +++++++++++++++++ 2 files changed, 34 insertions(+), 25 deletions(-) create mode 100644 extensions/markdown/js/src/forum/util/MarkdownAreaEditorDriver.js diff --git a/extensions/markdown/js/src/forum/index.js b/extensions/markdown/js/src/forum/index.js index 3eaba049b..95057ff08 100644 --- a/extensions/markdown/js/src/forum/index.js +++ b/extensions/markdown/js/src/forum/index.js @@ -9,11 +9,10 @@ import { extend, override } from 'flarum/extend'; import TextEditor from 'flarum/components/TextEditor'; -import BasicEditorDriver from 'flarum/utils/BasicEditorDriver'; -import MarkdownArea from 'mdarea'; import MarkdownToolbar from './components/MarkdownToolbar'; import MarkdownButton from './components/MarkdownButton'; +import MarkdownAreaEditorDriver from './util/MarkdownAreaEditorDriver'; let shortcutHandler = () => { }; @@ -24,31 +23,13 @@ app.initializers.add('flarum-markdown', function (app) { this.textareaId = 'textarea' + (index++); }); + override(TextEditor.prototype, 'buildEditor', function (_, dom) { + return new MarkdownAreaEditorDriver(dom, this.buildEditorParams()); + }); + extend(TextEditor.prototype, 'buildEditorParams', function (params) { params.textareaId = this.textareaId; - }); - - extend(BasicEditorDriver.prototype, 'build', function (_, dom, params) { - this.el.id = params.textareaId; - - // We can't bind shortcutHandler directly in case `build` - // runs before MarkdownToolbar's `oninit`. - this.el.addEventListener('keydown', function (e) { - return shortcutHandler(...arguments); - }); - - this.mdarea = new MarkdownArea(this.el, { - keyMap: { - indent: ['Ctrl+m'], - outdent: ['Ctrl+M'], - inline: [] - } - }); - }); - - override(BasicEditorDriver.prototype, 'destroy', function (original) { - this.mdarea.destroy(); - original(); + params.shortcutHandler = shortcutHandler; }); extend(TextEditor.prototype, 'toolbarItems', function (items) { diff --git a/extensions/markdown/js/src/forum/util/MarkdownAreaEditorDriver.js b/extensions/markdown/js/src/forum/util/MarkdownAreaEditorDriver.js new file mode 100644 index 000000000..0fb835671 --- /dev/null +++ b/extensions/markdown/js/src/forum/util/MarkdownAreaEditorDriver.js @@ -0,0 +1,28 @@ +import MarkdownArea from 'mdarea'; +import BasicEditorDriver from 'flarum/utils/BasicEditorDriver'; + +export default class MarkdownAreaEditorDriver extends BasicEditorDriver { + build(dom, params) { + super.build(dom, params); + this.el.id = params.textareaId; + + // We can't bind shortcutHandler directly in case `build` + // runs before MarkdownToolbar's `oninit`. + this.el.addEventListener('keydown', function (e) { + return params.shortcutHandler(...arguments); + }); + + this.mdarea = new MarkdownArea(this.el, { + keyMap: { + indent: ['Ctrl+m'], + outdent: ['Ctrl+M'], + inline: [] + } + }); + } + + destroy() { + this.mdarea.destroy(); + super.destroy(); + } +}