From 54dcbfc4736027b352396163ca63d61d19352b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Thu, 5 Mar 2020 21:05:01 +0100 Subject: [PATCH] add basic extension manager --- packages/tiptap-core/src/Editor.ts | 24 +++++++++++--- packages/tiptap-core/src/Extension.ts | 4 +-- packages/tiptap-core/src/ExtensionManager.ts | 34 ++++++++++++++++++++ packages/tiptap-core/src/Node.ts | 2 +- packages/tiptap-document-extension/index.ts | 2 +- packages/tiptap-text-extension/index.ts | 11 +++++++ packages/tiptap-text-extension/package.json | 17 ++++++++++ src/pages/tests/Basic.vue | 6 ++-- 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 packages/tiptap-core/src/ExtensionManager.ts create mode 100644 packages/tiptap-text-extension/index.ts create mode 100644 packages/tiptap-text-extension/package.json diff --git a/packages/tiptap-core/src/Editor.ts b/packages/tiptap-core/src/Editor.ts index b1ebbbe6..7952c7c0 100644 --- a/packages/tiptap-core/src/Editor.ts +++ b/packages/tiptap-core/src/Editor.ts @@ -11,6 +11,8 @@ import {exampleSetup} from "prosemirror-example-setup" import elementFromString from './utils/elementFromString' import injectCSS from './utils/injectCSS' +import ExtensionManager from './ExtensionManager' + type EditorContent = string | JSON interface Options { @@ -24,10 +26,12 @@ export class Editor { private lastCommand = Promise.resolve() - private schema: Schema = new Schema({ - nodes: addListNodes(schema.spec.nodes, "paragraph block*", "block"), - marks: schema.spec.marks - }) + schema: Schema + + // private schema: Schema = new Schema({ + // nodes: addListNodes(schema.spec.nodes, "paragraph block*", "block"), + // marks: schema.spec.marks + // }) selection = { from: 0, to: 0 } @@ -39,8 +43,12 @@ export class Editor { extensions: [], } + extensionManager: ExtensionManager + constructor(options: Options) { this.options = { ...this.options, ...options } + this.extensionManager = new ExtensionManager(this.options.extensions, this) + this.schema = this.createSchema() this.view = this.createView() this.registerCommand('focus', require('./commands/focus').default) this.registerCommand('insertText', require('./commands/insertText').default) @@ -55,6 +63,14 @@ export class Editor { return this.view.state } + private createSchema() { + return new Schema({ + // topNode: this.options.topNode, + nodes: this.extensionManager.nodes, + marks: this.extensionManager.marks, + }) + } + private createState() { return EditorState.create({ doc: this.createDocument(this.options.content), diff --git a/packages/tiptap-core/src/Extension.ts b/packages/tiptap-core/src/Extension.ts index 1fdd6525..87a8b6ff 100644 --- a/packages/tiptap-core/src/Extension.ts +++ b/packages/tiptap-core/src/Extension.ts @@ -23,9 +23,7 @@ export default abstract class Extension { this.editor = editor } - get type(): any { - return 'extension' - } + public type = 'extension' get update(): any { return () => {} diff --git a/packages/tiptap-core/src/ExtensionManager.ts b/packages/tiptap-core/src/ExtensionManager.ts new file mode 100644 index 00000000..dbff14e0 --- /dev/null +++ b/packages/tiptap-core/src/ExtensionManager.ts @@ -0,0 +1,34 @@ +import { keymap } from 'prosemirror-keymap' +import { Editor } from './Editor' + +export default class ExtensionManager { + + extensions: [any?] + + constructor(extensions: any = [], editor: Editor) { + // extensions.forEach(extension => { + // extension.bindEditor(editor) + // extension.init() + // }) + this.extensions = extensions + } + + get nodes() { + return this.extensions + .filter(extension => extension.type === 'node') + .reduce((nodes, { name, schema }) => ({ + ...nodes, + [name]: schema, + }), {}) + } + + get marks() { + return this.extensions + .filter(extension => extension.type === 'mark') + .reduce((marks, { name, schema }) => ({ + ...marks, + [name]: schema, + }), {}) + } + +} diff --git a/packages/tiptap-core/src/Node.ts b/packages/tiptap-core/src/Node.ts index 5ff5a31d..f89f4c6d 100644 --- a/packages/tiptap-core/src/Node.ts +++ b/packages/tiptap-core/src/Node.ts @@ -6,7 +6,7 @@ export default abstract class Node extends Extension { super(options) } - // protected type = 'node' + public type = 'node' // get type() { // return 'node' diff --git a/packages/tiptap-document-extension/index.ts b/packages/tiptap-document-extension/index.ts index d8924149..2127e6c6 100644 --- a/packages/tiptap-document-extension/index.ts +++ b/packages/tiptap-document-extension/index.ts @@ -2,7 +2,7 @@ import { Node } from '@tiptap/core' export default class Document extends Node { - name = 'document' + name = 'doc' schema = { content: 'block+', diff --git a/packages/tiptap-text-extension/index.ts b/packages/tiptap-text-extension/index.ts new file mode 100644 index 00000000..48e1face --- /dev/null +++ b/packages/tiptap-text-extension/index.ts @@ -0,0 +1,11 @@ +import { Node } from '@tiptap/core' + +export default class Text extends Node { + + name = 'text' + + schema = { + group: 'inline', + } + +} \ No newline at end of file diff --git a/packages/tiptap-text-extension/package.json b/packages/tiptap-text-extension/package.json new file mode 100644 index 00000000..4046db36 --- /dev/null +++ b/packages/tiptap-text-extension/package.json @@ -0,0 +1,17 @@ +{ + "name": "@tiptap/text-extension", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-text-extension.js", + "umd:main": "dist/tiptap-text-extension.umd.js", + "module": "dist/tiptap-text-extension.mjs", + "unpkg": "dist/tiptap-text-extension.js", + "jsdelivr": "dist/tiptap-text-extension.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x" + } +} diff --git a/src/pages/tests/Basic.vue b/src/pages/tests/Basic.vue index 524083ed..0b3c8dcb 100644 --- a/src/pages/tests/Basic.vue +++ b/src/pages/tests/Basic.vue @@ -6,8 +6,9 @@