Skip to content

Commit

Permalink
Editor Consolidation (#28)
Browse files Browse the repository at this point in the history
- Move insertText to core
- Move styles and apply to core
- Simplify shortcut and button system
- Drop mdarea for now. In the future, we could implement the features we use (list continue, indent) in core.
- Remove admin dist (only admin setting was mdarea)
- Move inline style to css
  • Loading branch information
askvortsov1 authored May 10, 2021
1 parent b78eaad commit 5fd21d2
Show file tree
Hide file tree
Showing 14 changed files with 55 additions and 520 deletions.
3 changes: 0 additions & 3 deletions extend.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@
use s9e\TextFormatter\Configurator;

return [
(new Extend\Frontend('admin'))
->js(__DIR__.'/js/dist/admin.js'),

(new Extend\Frontend('forum'))
->js(__DIR__.'/js/dist/forum.js')
->css(__DIR__.'/less/forum.less'),
Expand Down
1 change: 0 additions & 1 deletion js/admin.js

This file was deleted.

2 changes: 0 additions & 2 deletions js/dist/admin.js

This file was deleted.

1 change: 0 additions & 1 deletion js/dist/admin.js.map

This file was deleted.

12 changes: 0 additions & 12 deletions js/src/admin/index.js

This file was deleted.

21 changes: 3 additions & 18 deletions js/src/forum/components/MarkdownButton.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import Component from 'flarum/Component';
import icon from 'flarum/helpers/icon';
import apply from '../util/apply';

const modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';

export default class MarkdownButton extends Component {
oncreate(vnode) {
Expand All @@ -13,8 +10,8 @@ export default class MarkdownButton extends Component {

view() {
return (
<button className="Button Button--icon Button--link" title={this.title()} data-hotkey={this.attrs.hotkey}
onclick={this.click.bind(this)} onkeydown={this.keydown.bind(this)}>
<button className="Button Button--icon Button--link" title={this.attrs.title} data-hotkey={this.attrs.hotkey}
onkeydown={this.keydown.bind(this)} onclick={this.attrs.onclick}>
{icon(this.attrs.icon)}
</button>
);
Expand All @@ -23,19 +20,7 @@ export default class MarkdownButton extends Component {
keydown(event) {
if (event.key === ' ' || event.key === 'Enter') {
event.preventDefault();
this.click();
this.element.click();
}
}

click() {
return apply(this.element, this.attrs.style);
}

title() {
let tooltip = this.attrs.title;

if (this.attrs.hotkey) tooltip += ` <${modifierKey}-${this.attrs.hotkey}>`;

return tooltip;
}
}
21 changes: 1 addition & 20 deletions js/src/forum/components/MarkdownToolbar.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,9 @@
import Component from 'flarum/Component';

const modifierKey = navigator.userAgent.match(/Macintosh/) ? 'Meta' : 'Control';

export default class MarkdownToolbar extends Component {
oncreate(vnode) {
super.oncreate(vnode);

this.attrs.setShortcutHandler(this.shortcut.bind(this));
}

view(vnode) {
return <div id="MarkdownToolbar" data-for={this.attrs.for} style={{ display: 'inline-block' }}>
return <div class="MarkdownToolbar">
{vnode.children}
</div>;
}

shortcut(event) {
if ((event.metaKey && modifierKey === 'Meta') || (event.ctrlKey && modifierKey === 'Control')) {
const button = this.element.querySelector(`[data-hotkey="${event.key}"]`);

if (button) {
button.click();
event.preventDefault()
}
}
}
}
71 changes: 47 additions & 24 deletions js/src/forum/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,68 @@
* https://github.com/github/markdown-toolbar-element/blob/master/LICENSE
*/

import { extend, override } from 'flarum/extend';
import { extend } from 'flarum/extend';
import TextEditor from 'flarum/components/TextEditor';
import BasicEditorDriver from 'flarum/common/utils/BasicEditorDriver';
import styleSelectedText from 'flarum/common/utils/styleSelectedText';

import MarkdownToolbar from './components/MarkdownToolbar';
import MarkdownButton from './components/MarkdownButton';
import MarkdownEditorDriver from './util/MarkdownEditorDriver';

let shortcutHandler = () => { };
const modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';

app.initializers.add('flarum-markdown', function (app) {
let index = 1;
const styles = {
'header': { prefix: '### ' },
'bold': { prefix: '**', suffix: '**', trimFirst: true },
'italic': { prefix: '_', suffix: '_', trimFirst: true },
'quote': { prefix: '> ', multiline: true, surroundWithNewlines: true },
'code': { prefix: '`', suffix: '`', blockPrefix: '```', blockSuffix: '```' },
'link': { prefix: '[', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' },
'image': { prefix: '![', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' },
'unordered_list': { prefix: '- ', multiline: true, surroundWithNewlines: true },
'ordered_list': { prefix: '1. ', multiline: true, orderedList: true }
}

extend(TextEditor.prototype, 'oninit', function () {
this.textareaId = 'textarea' + (index++);
});
const applyStyle = (id) => {
// This is a nasty hack that breaks encapsulation of the editor.
// In future releases, we'll need to tweak the editor driver interface
// to support triggering events like this.
styleSelectedText(app.composer.editor.el, styles[id]);
}

override(TextEditor.prototype, 'buildEditor', function (_, dom) {
return new MarkdownEditorDriver(dom, this.buildEditorParams());
});
function makeShortcut(id, key) {
return function (e) {
if (e.key === key && (e.metaKey && modifierKey === '⌘' || e.ctrlKey && modifierKey === 'ctrl')) {
applyStyle(id);
}
}
}

extend(TextEditor.prototype, 'buildEditorParams', function (params) {
params.textareaId = this.textareaId;
params.shortcutHandler = shortcutHandler;
app.initializers.add('flarum-markdown', function (app) {
extend(BasicEditorDriver.prototype, 'keyHandlers', function (items) {
items.add('bold', makeShortcut('bold', 'b'));
items.add('italic', makeShortcut('italic', 'i'));
});

extend(TextEditor.prototype, 'toolbarItems', function (items) {
const tooltip = name => app.translator.trans(`flarum-markdown.forum.composer.${name}_tooltip`);
const tooltip = (name, hotkey) => {
return app.translator.trans(`flarum-markdown.forum.composer.${name}_tooltip`) + (hotkey ? ` <${modifierKey}-${hotkey}>` : '');
};

const makeApplyStyle = (id) => {
return () => applyStyle(id);
}

items.add('markdown', (
<MarkdownToolbar for={this.textareaId} setShortcutHandler={handler => shortcutHandler = handler}>
<MarkdownButton title={tooltip('header')} icon="fas fa-heading" style={{ prefix: '### ' }} />
<MarkdownButton title={tooltip('bold')} icon="fas fa-bold" style={{ prefix: '**', suffix: '**', trimFirst: true }} hotkey="b" />
<MarkdownButton title={tooltip('italic')} icon="fas fa-italic" style={{ prefix: '_', suffix: '_', trimFirst: true }} hotkey="i" />
<MarkdownButton title={tooltip('quote')} icon="fas fa-quote-left" style={{ prefix: '> ', multiline: true, surroundWithNewlines: true }} />
<MarkdownButton title={tooltip('code')} icon="fas fa-code" style={{ prefix: '`', suffix: '`', blockPrefix: '```', blockSuffix: '```' }} />
<MarkdownButton title={tooltip('link')} icon="fas fa-link" style={{ prefix: '[', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' }} />
<MarkdownButton title={tooltip('image')} icon="fas fa-image" style={{ prefix: '![', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' }} />
<MarkdownButton title={tooltip('unordered_list')} icon="fas fa-list-ul" style={{ prefix: '- ', multiline: true, surroundWithNewlines: true }} />
<MarkdownButton title={tooltip('ordered_list')} icon="fas fa-list-ol" style={{ prefix: '1. ', multiline: true, orderedList: true }} />
<MarkdownButton title={tooltip('header')} icon="fas fa-heading" onclick={makeApplyStyle('header')} />
<MarkdownButton title={tooltip('bold', 'b')} icon="fas fa-bold" onclick={makeApplyStyle('bold')} />
<MarkdownButton title={tooltip('italic', 'i')} icon="fas fa-italic" onclick={makeApplyStyle('italic')} />
<MarkdownButton title={tooltip('quote')} icon="fas fa-quote-left" onclick={makeApplyStyle('quote')} />
<MarkdownButton title={tooltip('code')} icon="fas fa-code" onclick={makeApplyStyle('code')} />
<MarkdownButton title={tooltip('image')} icon="fas fa-image" onclick={makeApplyStyle('image')} />
<MarkdownButton title={tooltip('unordered_list')} icon="fas fa-list-ul" onclick={makeApplyStyle('unordered_list')} />
<MarkdownButton title={tooltip('ordered_list')} icon="fas fa-list-ol" onclick={makeApplyStyle('ordered_list')} />
</MarkdownToolbar>
), 100);
});
Expand Down
94 changes: 0 additions & 94 deletions js/src/forum/util/MarkdownEditorDriver.js

This file was deleted.

50 changes: 0 additions & 50 deletions js/src/forum/util/apply.js

This file was deleted.

Loading

0 comments on commit 5fd21d2

Please sign in to comment.