From 208ba890ef2b3ea2ed813aba78f4adf1c2bf8b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Tue, 31 Mar 2020 22:17:54 +0200 Subject: [PATCH] add extension keymaps --- packages/core/src/Editor.ts | 9 +++++++-- packages/core/src/Extension.ts | 4 ++-- packages/core/src/ExtensionManager.ts | 10 ++++++++++ packages/core/src/commands/focus.ts | 2 +- packages/core/src/utils/magicMethods.ts | 1 + packages/extension-bold/index.ts | 12 ++++++++++++ packages/extension-italic/index.ts | 12 ++++++++++++ 7 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 90aa9938..caa5c99f 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -54,6 +54,9 @@ export class Editor extends EventEmitter { constructor(options: Options) { super() this.options = { ...this.options, ...options } + } + + private init() { this.createExtensionManager() this.createSchema() this.createView() @@ -86,7 +89,7 @@ export class Editor extends EventEmitter { if (this.commands[name]) { throw new Error(`tiptap: command '${name}' is already defined.`) } - + if (getAllMethodNames(this).includes(name)) { throw new Error(`tiptap: '${name}' is a protected name.`) } @@ -103,7 +106,7 @@ export class Editor extends EventEmitter { } private createExtensionManager() { - this.extensionManager = new ExtensionManager(this.options.extensions, this) + this.extensionManager = new ExtensionManager(this.options.extensions, this.proxy) } private createSchema() { @@ -116,8 +119,10 @@ export class Editor extends EventEmitter { } private get plugins() { + console.log(this.extensionManager.plugins) return [ ...this.extensionManager.plugins, + ...this.extensionManager.keymaps, keymap({ Backspace: undoInputRule }), keymap(baseKeymap), dropCursor(), diff --git a/packages/core/src/Extension.ts b/packages/core/src/Extension.ts index 29f0980d..7a32e665 100644 --- a/packages/core/src/Extension.ts +++ b/packages/core/src/Extension.ts @@ -39,8 +39,8 @@ export default abstract class Extension { return [] } - keys(): any { + keys(): { [key: string]: any } { return {} - } + } } diff --git a/packages/core/src/ExtensionManager.ts b/packages/core/src/ExtensionManager.ts index b31e472f..5bcf172c 100644 --- a/packages/core/src/ExtensionManager.ts +++ b/packages/core/src/ExtensionManager.ts @@ -6,9 +6,11 @@ import Node from './Node' export default class ExtensionManager { + editor: Editor extensions: (Extension | Node)[] constructor(extensions: (Extension | Node)[], editor: Editor) { + this.editor = editor this.extensions = extensions this.extensions.forEach(extension => { extension.bindEditor(editor) @@ -46,4 +48,12 @@ export default class ExtensionManager { .toArray() } + get keymaps() { + return collect(this.extensions) + .map(extension => extension.keys()) + .filter(keys => !!Object.keys(keys).length) + .map(keys => keymap(keys)) + .toArray() + } + } diff --git a/packages/core/src/commands/focus.ts b/packages/core/src/commands/focus.ts index b01821dc..00f8b3ee 100644 --- a/packages/core/src/commands/focus.ts +++ b/packages/core/src/commands/focus.ts @@ -5,7 +5,7 @@ import minMax from '../utils/minMax' declare module '../Editor' { interface Editor { - focus(position: Position): Editor + focus(position?: Position): Editor } } diff --git a/packages/core/src/utils/magicMethods.ts b/packages/core/src/utils/magicMethods.ts index 4f1d37a4..c00bbdd1 100644 --- a/packages/core/src/utils/magicMethods.ts +++ b/packages/core/src/utils/magicMethods.ts @@ -25,6 +25,7 @@ export default function magicMethods(clazz: any) { } instance.proxy = new Proxy(instance, instanceHandler) + instance.init() return instance.proxy } diff --git a/packages/extension-bold/index.ts b/packages/extension-bold/index.ts index d54b8c04..016ac1a6 100644 --- a/packages/extension-bold/index.ts +++ b/packages/extension-bold/index.ts @@ -1,6 +1,12 @@ import { Mark } from '@tiptap/core' import { toggleMark } from 'prosemirror-commands' +declare module '@tiptap/core/src/Editor' { + interface Editor { + bold(): Editor, + } +} + export default class Bold extends Mark { name = 'bold' @@ -31,4 +37,10 @@ export default class Bold extends Mark { } } + keys() { + return { + 'Mod-b': () => this.editor.bold(), + } + } + } \ No newline at end of file diff --git a/packages/extension-italic/index.ts b/packages/extension-italic/index.ts index 4927b4ed..cfc5382d 100644 --- a/packages/extension-italic/index.ts +++ b/packages/extension-italic/index.ts @@ -1,6 +1,12 @@ import { Mark } from '@tiptap/core' import { toggleMark } from 'prosemirror-commands' +declare module '@tiptap/core/src/Editor' { + interface Editor { + italic(): Editor, + } +} + export default class Italic extends Mark { name = 'italic' @@ -23,4 +29,10 @@ export default class Italic extends Mark { } } + keys() { + return { + 'Mod-i': () => this.editor.italic(), + } + } + } \ No newline at end of file