halo-admin/docs/extension-points/editor.md

74 lines
1.4 KiB
Markdown
Raw Normal View History

feat: add editor extension point (#781) #### 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: <img width="1664" alt="image" src="https://user-images.githubusercontent.com/21301288/208406097-60258cba-cff6-436f-bd50-6d8c27ea9a53.png"> <img width="1662" alt="image" src="https://user-images.githubusercontent.com/21301288/208406174-d4649365-3448-4581-a452-f9781502eac6.png"> <img width="1920" alt="image" src="https://user-images.githubusercontent.com/21301288/208407570-db10e956-cd6a-4e0d-801e-b794ad0261bc.png"> <img width="1920" alt="image" src="https://user-images.githubusercontent.com/21301288/208407607-fd595957-5278-40c2-a3b5-fb73c1de429c.png"> #### 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 端支持扩展集成其他编辑器 ```
2022-12-22 04:14:29 +00:00
# 编辑器集成扩展点
## 定义方式
```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
<template>
<div>
<textarea :value="raw" @input="onRawUpdate" />
<div v-html="content" />
</div>
</template>
<script lang="ts" setup>
import { watch } from "vue";
import marked from "marked";
const props = withDefaults(
defineProps<{
raw?: string;
content: string;
}>(),
{
raw: "",
content: "",
}
);
const emit = defineEmits<{
(event: "update:raw", value: string): void;
(event: "update:content", value: string): void;
}>();
function onRawUpdate(e: Event) {
const raw = (e.target as HTMLTextAreaElement).value;
emit("update:raw", raw);
}
watch(
() => props.raw,
() => {
emit("update:content", marked(props.raw));
}
);
</script>
```