From 41d68ec8594eef4ae603863065f621b8e3664f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Mon, 12 Oct 2020 10:32:54 +0200 Subject: [PATCH] add basic node interface --- packages/core/index.ts | 1 + packages/core/src/Node.ts | 15 +++++++++++++-- packages/core/src/utils/getSchema.ts | 19 +++++++++++-------- packages/extension-paragraph/index.ts | 16 +++++++++++++--- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/packages/core/index.ts b/packages/core/index.ts index eb825360..82b838f5 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -5,6 +5,7 @@ export { Editor, Command, CommandsSpec } export { default as ComponentRenderer } from './src/ComponentRenderer' export { default as Extension } from './src/Extension' export { default as Node } from './src/Node' +export * from './src/Node' export { default as Mark } from './src/Mark' export { Extensions } from './src/types' diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index 57781224..2720fa81 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -32,9 +32,20 @@ // } // } +import { DOMOutputSpec, DOMOutputSpecArray } from 'prosemirror-model' import Extension from './Extension' -export default class Node extends Extension { +export interface INode { + type: string + topNode: boolean + group: string + content: string + createAttributes(): any + parseHTML(): any + renderHTML(props: number): DOMOutputSpec +} + +export default class Node extends Extension implements INode { type = 'node' @@ -53,7 +64,7 @@ export default class Node extends Extension { } renderHTML() { - return [] + return null } } diff --git a/packages/core/src/utils/getSchema.ts b/packages/core/src/utils/getSchema.ts index 0de03985..80f0ab27 100644 --- a/packages/core/src/utils/getSchema.ts +++ b/packages/core/src/utils/getSchema.ts @@ -14,15 +14,18 @@ export default function getSchema(extensions: Extensions): Schema { const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[] const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[] - const nodes = Object.fromEntries(nodeExtensions.map(node => { + const nodes = Object.fromEntries(nodeExtensions.map(extension => { + + const schema: NodeSpec = { + content: extension.content, + group: extension.group, + parseDOM: extension.parseHTML(), + toDOM: node => extension.renderHTML({ node, attributes: { class: 'hee' } }), + } + return [ - node.name, - { - content: node.content, - group: node.group, - parseDOM: node.parseHTML(), - toDOM: node.renderHTML, - } as unknown as NodeSpec, + extension.name, + schema, ] })) diff --git a/packages/extension-paragraph/index.ts b/packages/extension-paragraph/index.ts index 4fc34881..f4d48c8e 100644 --- a/packages/extension-paragraph/index.ts +++ b/packages/extension-paragraph/index.ts @@ -1,4 +1,5 @@ -import { Command, Node } from '@tiptap/core' +import { Command, Node, INode } from '@tiptap/core' +import { DOMOutputSpecArray } from 'prosemirror-model' // import ParagraphComponent from './paragraph.vue' // export type ParagraphCommand = () => Command @@ -28,7 +29,7 @@ import { Command, Node } from '@tiptap/core' // })) // .create() -export default class Paragraph extends Node { +export default class Paragraph extends Node implements INode { name = 'paragraph' @@ -36,6 +37,15 @@ export default class Paragraph extends Node { content = 'inline*' + createAttributes() { + return { + // default rendering + class: { + default: 'jooo', + }, + } + } + parseHTML() { return [ { tag: 'p' }, @@ -43,7 +53,7 @@ export default class Paragraph extends Node { } renderHTML() { - return ['p', 0] + return ['p', 0] as const } }