From a396aad87f77ae0e04f4b247b96b1496acbc27e0 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 22 Dec 2022 12:14:29 +0800 Subject: [PATCH] feat: add editor extension point (#781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature #### What this PR does / why we need it: 添加编辑器的扩展点,用于扩展集成其他编辑器。 定义一个扩展点的方式: ```ts export default definePlugin({ extensionPoints: { "editor:create": () => { return [ { name: "stackedit", displayName: "StackEdit", component: markRaw(StackEdit), rawType: "markdown", }, ]; }, }, }); ``` 其中 `component` 字段即编辑器组件对象,需要包含 `raw`、`content` 的 prop。 #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/2881 #### Screenshots: image image image image #### Special notes for your reviewer: 目前可用于测试的插件: 1. [plugin-stackedit-1.0.0-SNAPSHOT.jar.zip](https://github.com/halo-dev/console/files/10258488/plugin-stackedit-1.0.0-SNAPSHOT.jar.zip) 2. [plugin-bytemd-1.0.0-SNAPSHOT.jar.zip](https://github.com/halo-dev/console/files/10258490/plugin-bytemd-1.0.0-SNAPSHOT.jar.zip) 测试方式: 1. Console 需要 `pnpm build:packages`。 2. 在 Console 的插件管理上传以上插件。 3. 新建若干文章,使用不同的编辑器。 4. 检查是否能够正常发布和编辑。 5. 检查编辑的时候,是否正确使用了之前的编辑器。 6. 检查主题端是否渲染正常。 一些实现细节: 1. 为了支持更新文章时能够选择发布时的编辑器,会在 post 的 `metadata.annotations` 添加一条 `content.halo.run/preferred-editor` 用于标记使用的什么编辑器。如果编辑器不存在,会使用 content 的 `rawType` 来匹配。 2. 目前没有全局默认编辑器设置,只能在新建文章的时候选择。 #### Does this PR introduce a user-facing change? ```release-note Console 端支持扩展集成其他编辑器 ``` --- docs/extension-points/editor.md | 73 +++++++++++++ packages/shared/src/index.ts | 1 + packages/shared/src/states/editor.ts | 8 ++ packages/shared/src/types/plugin.ts | 3 + src/components/editor/DefaultEditor.vue | 40 ++++--- .../use-editor-extension-points.ts | 43 ++++++++ .../contents/pages/SinglePageEditor.vue | 96 ++++++++++++++--- .../contents/pages/layouts/PageLayout.vue | 34 ++++++ src/modules/contents/posts/PostEditor.vue | 101 +++++++++++++++--- src/modules/contents/posts/PostList.vue | 36 +++++++ 10 files changed, 394 insertions(+), 41 deletions(-) create mode 100644 docs/extension-points/editor.md create mode 100644 packages/shared/src/states/editor.ts create mode 100644 src/composables/use-editor-extension-points.ts diff --git a/docs/extension-points/editor.md b/docs/extension-points/editor.md new file mode 100644 index 00000000..21dd63df --- /dev/null +++ b/docs/extension-points/editor.md @@ -0,0 +1,73 @@ +# 编辑器集成扩展点 + +## 定义方式 + +```ts +import MarkdownEditor from "./components/MarkdownEditor.vue" + +export default definePlugin({ + extensionPoints: { + "editor:create": () => { + return [ + { + name: "markdown-editor", + displayName: "Markdown", + component: markRaw(MarkdownEditor), + rawType: "markdown", + }, + ]; + }, + }, +}); +``` + +- name: 编辑器名称,用于标识编辑器 +- displayName: 编辑器显示名称 +- component: 编辑器组件 +- rawType: 编辑器支持的原始类型,可以完全由插件定义。但必须保证最终能够将渲染后的 html 设置到 content 中。 + +## 组件 + +组件必须设置两个 `v-model` 绑定。即 `v-model:raw` 和 `v-model:content`,以下是示例: + +```vue +