先前的两篇文章,我们了解了所见即所得编辑器的原理,接下来,我们就要开始在知晓原理情况下搞点事情了,给所见即所得加持上AI的能力。本文,我们将给所见即所得编辑器,当然是基于Tiptap实现的,增加AI能力,大致分为三个功能点
。
/
唤起一个菜单,我们可以选择基于已有的文本进行续写,其大概的体验如下所示:
文本扩写
,风格改写
,文本翻译
等等一些操作,其操作体验如下所示:上面,我们领略了一下AI加持后的Tiptap编辑器的样子,看起来时机已经有点NotionAi
的影子了。那么,为啥要自己实现呢?因为Notion 引入 ChatGPT辅助创作,这种体验真的很好,沉浸式的编辑体验,但是缺点也是很大。
说一千,到一万,反正,我们就是得自己造轮子了。
实际上,我们首先空格,呼出一个对话框和ChatGPT对话的功能是在 Extension 实现的 addProseMirrorPlugins做的,如下,我们需要监听 event.code === 'Space'
事件,一旦用户敲击空格,就呼出对话框,对话框就的职责就是和ChatGPT对话,最后将对话的内容插入到编辑器editor的光标处即可,整个流程图如下:
其核心代码如下所示。
addProseMirrorPlugins() {
const editor = this.editor;
const { enableAIChat } = this.options;
return [
new Plugin({
key: new PluginKey('ai-event-handler'),
props: {
handleKeyDown(_, event) {
if (event.code === 'Space') {
const nodeText = getTextContentFromNodes(editor.state.selection.$from);
// 唤起对话框,与ChatGPT对话
// 将对话类容格式化为document,插入到 editor 的focus 处
return false;
}
}
}
})
];
}
举一个例子,如果你想让选中的文本加粗,是可以这么玩的
// Execute two commands at once
editor.chain().toggleBold().focus().run()
如果我们想在光标处增加内容,比如AI的返回响应,该怎么办呢?
其实很简单,我们看看这个
// Plain text
editor.commands.insertContent('Example Text')
// HTML
editor.commands.insertContent('<h1>Example Text</h1>')
通过editor的commands的insertContent API 去插入内容即可。
所以,整体上来讲,给所见即所得编辑器增加AI加持的能力,无非就是这些API的调用。
那么,后续我们可能还要实现 /
,弹出菜单,和实现选中文本弹出菜单,其实现思路和敲击空格键呼出对话框的功能极其类似,就不一一介绍。完整的demo体验可以去utools插件市场,安装 aition
体验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。