网站前期设计,苏州网站建设系统电话,公司网站忘了怎么做,如何做切片网站core-concepts 前言#xff1a;这篇文章来介绍一下 Tiptap 编辑器的一些核心概念
#xff08;一#xff09;结构
1、 Schemas
定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema#xff0c;…core-concepts 前言这篇文章来介绍一下 Tiptap 编辑器的一些核心概念
一结构
1、 Schemas
定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema它规定了可以出现在文档中的节点的类型以及它们的嵌套方式。例如它可能规定顶层节点可以包含一个或多个块block段落节点可以包括任意数量的拥有各种标记的行内节点。ProseMirror 给出了基本的 schema并且允许自定义 schema。 一个简单的 schema 示例
// 底层 ProseMirror schema
{nodes: {doc: {content: block,},paragraph: {content: inline*,group: block,parseDOM: [{ tag: p }],toDOM: () [p, 0],},text: {group: inline,},},
}
在上面的 schema 的定义中我们定义了三个节点
doc它是文档的根节点它的内容由 content 属性定义可以是一个或多个块级元素block 是正则表达式的写法小加号表示一个或多个。paragraph 节点它自身是块级元素由 group 属性指定由于定义的节点只有它是块级元素所以根节点的子节点只允许出现 paragraph 节点。它的内容 inline* 指的是0个或多个行内节点所以它只能包含 text 节点。parseDOM 定义了如何从粘贴的 HTML 中解析节点。 toDOM 定义了 paragraph 节点如何在 DOM 中渲染。text 节点这个节点就很简单了行内纯文本 在 Tiptap 中节点、标记和扩展都在各自的文件中独立定义便于拆分逻辑最终引擎会将所有的定义合并在一起。
schema 是严格的文档中不能出现任何 schema 不允许的节点。 例如如果你想编辑器中粘贴了 This is strongimportant/strong 但是没有扩展可以解析 strong 标签那么文档中会直接显示 This is important 可以通过监听器可以监听解析失败的事件 contentError 在这个事件中还会接收到一个参数 disableCollaboration它是一个函数调用这个函数可以重新初始化编辑器并且不会将出错的内容同步给其他用户。不过协同编辑的功能是收费的大概率还是需要自己的团队重新开发。 这个方法的调用有以下两种
直接在创建编辑器的时候设置监听器
new Editor({enableContentCheck: true,content: invalidContent,onContentError({ editor, error, disableCollaboration }) {// your handler here},...options,
})通过 on() 方法监听
const editor new Editor({enableContentCheck: true,content: invalidContent,...options,
})editor.on(contentError, ({ editor, error, disableCollaboration }) {// your handler here
})2、Marks
标记可以附加到每一个节点上用来给节点的某些特殊的部分增加样式或者注释文本。 在 schema 中必须指定可以允许的 marks 的类型和上面的 schema 中指定 nodes 的写法类似。 默认情况下带有行内内容的节点会允许所有的在 schema 中定义的 marks 应用于它们的子节点但是可以在节点的 marks 属性中进行自定义。 例如下面这个简单的 schema允许 strong 和 em 标记应用于 paragraphs 中的文本但是不允许应用于 headings 中的文本
const markSchema new Schema({nodes: {doc: {content: block},paragraph: {group: block, content: text*, marks: _},heading: {group: block, content: text*, marks: },text: {inline: true}},marks: {strong: {},em: {}}
})标记集合会被解析成标记的所有名称以空格分隔的字符串的形式_ 会作为一个通配符匹配所有的标记而空字符串表示不允许任何的标记。 Tiptap 中提供了一系列 marks 扩展
3、commands
Commands 是以编程的方式改变编辑器内容。编辑器提供了很多很多的命令以编程的方式添加、改变编辑器内容或者更改选区。
① 执行 command
通过编辑器实例上的 commands 属性调用 command
editor.commands.setBold()像酱紫执行命令就可以让文本加粗
② 链式执行 command
大多数的命令都可以合并到一次调用中这会比单独调用函数更加高效。下面的例子是让选中的文本加粗
editor.chain().focus().toggleBold().run()chain() 用来开启新的执行链run() 方法用来实际执行所有的命令。这些命令很可能都是通过点击按钮触发的但是按钮通常不在编辑器内部所有可能会需要先执行 focus 聚焦于编辑器然后再执行 toggleBold 方法加粗选中的文本。所以大部分命令在执行前都会先链式调用 focus()这样用户就可以继续进行编辑操作。 执行链上的方法是排着队执行的。一个执行链上的方法会被合并到一个 transaction 中一个执行链只会触发一次更新监听器。 默认情况下ProseMirror 是不支持链式操作的我们需要通过 Transaction mapping 在命令执行链中更新位置。 下面是一个例子链式执行删除和插入命令
// 添加两个自定义命令演示两个 transaction 步骤之间的映射
addCommands() {return {delete: () ({ tr }) {const { $from, $to } tr.selection// 使用 tr.mapping.map 在 transaction 步骤之间映射位置const from tr.mapping.map($from.pos)const to tr.mapping.map($to.pos)tr.delete(from, to)return true},insert: (content: string) ({ tr }) {const { $from } tr.selection// 使用 tr.mapping.map 在 transaction 步骤之间映射位置const pos tr.mapping.map($from.pos)tr.insertText(content, pos)return true},}
}
现在就可以执行下面的操作确保插入内容时位置不会错误
editor.chain().delete().insert(foo).run()③ 自定义命令中的链
当链接到一个命令的时候事务会处于保留状态。如果你想链式调用自定义命令你需要使用当前的事务并且将你的自定义命令添加到当前的调用链上如以下代码
addCommands() {return {customCommand: attributes ({ chain }) {// Doesn’t work:// return editor.chain() …// Does work:return chain().insertContent(foo!).insertContent(bar!).run()},}
}④ 行内命令
如果命令中执行的代码比较简单可以直接写成行内命令的形式
editor.chain().focus().command(({ tr }) {// manipulate the transactiontr.insertText(hey, that’s cool!)return true}).run()⑤ 空运行命令
在执行某些命令之前可以使用 can() 方法来判断这个命令能不能执行例如在菜单中的按钮能不能显示等。这个方法不会执行任何修改而只是会判断后面跟的命令是否可以执行。
editor.can().toggleBold()can() 方法也可以和 chain() 一起使用来判断是否执行链上所有的方法都可以执行
editor.can().chain().toggleBold().toggleItalic().run()如果链式操作中的所有命令都能执行can() 方法才会返回 true。如果其中有自定义命令切记要返回布尔值。 就是说上面一连串的方法最后返回的是个布尔值不会有任何的修改。
⑥ 尝试命令
如果有一连串的命令运行一个命令成功后就不再往后执行就可以使用 first 命令。好像有 if~else~ 的作用或者是替代 can() 判断的作用。 例如下面的例子backspace 键会首先去尝试撤销一个输入规则如果成功的话就执行这个操作如果失败的话就执行下一个命令删除选区内容
editor.first(({ commands }) [() commands.undoInputRule(),() commands.deleteSelection(),// …
])下面的写法作用相同
export default () ({ commands }) {return commands.first([() commands.undoInputRule(),() commands.deleteSelection(),// …])}就是说如果当前焦点是一个列表点击删除键会列表输入规则删除变成普通的文本输入
⑦ 关键命令列表
内容
命令描述clearContent()删除整个文档insertContent()在当前位置插入一个节点或者HTML字符串insertContentAt()在指定位置插入一个节点或者HTML字符串setContent()用新内容替代整篇文档的内容
节点标记
命令描述clearNodes()将节点变成简单的段落createParagraphNear()在当前位置的附近创建一个段落deleteNode()删除节点extendMarkRange()将文本选择范围扩展到当前标记。exitCode()停止代码编辑joinBackward()和后一个节点合并joinForward()和前一个节点合并lift()提升当前的选区到上一个层级例如将二层的列表项变成一层的列表项liftEmptyBlock()提升空块的层例如空的列表项点回车时会将当前列表项提升为单独的一行空引用点击回车会退出引用newlineInCode()在代码中添加换行符resetAttributes()将一些节点或标记的属性重置为默认值setMark()给标记添加一个新属性setNode()将一个指定范围的内容替换为新节点splitBlock()在光标处分割当前元素派生一个新节点toggleMark()切换标记toggleWrap()切换指定的包裹标签例如 toggleWrap(‘bulletList’) 切换当前元素是否放在列表中undoInputRule()撤销输入规则即变成普通文本unsetAllMarks()删除当前选区的所有标记unsetMark()删除当前选区的指定的标记updateAttributes()更新节点或标记的属性
列表
命令描述liftListItem()提升列表项等级sinkListItem()降低列表项等级splitListItem()将一个列表项拆分为两个列表项。toggleList()切换列表类型切换普通文本和列表wrapInList()将一个节点包装在一个列表中
选区
命令描述blur()从编辑器中移除焦点deleteRange()删除指定 rangedeleteSelection()删除 selectionenter()触发回车行为 例如分割p标签、创建新的一行等focus()聚焦编辑器到指定的位置keyboardShortcut()触发指定的键盘快捷键scrollIntoView()滚动视图到选区位置selectAll()选中整个文档selectNodeBackward()向后选中一个节点selectNodeForward()向前选中一个节点selectParentNode()选中父节点setNodeSelection()创建一个 NodeSelectionsetTextSelection()创建一个 TextSelection 文章转载自: http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.rqfnl.cn.gov.cn.rqfnl.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.kghss.cn.gov.cn.kghss.cn http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn http://www.morning.lxwjx.cn.gov.cn.lxwjx.cn http://www.morning.mkczm.cn.gov.cn.mkczm.cn http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn http://www.morning.rzpkt.cn.gov.cn.rzpkt.cn http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn http://www.morning.jgcyn.cn.gov.cn.jgcyn.cn http://www.morning.qhrlb.cn.gov.cn.qhrlb.cn http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn http://www.morning.bchgl.cn.gov.cn.bchgl.cn http://www.morning.mrfbp.cn.gov.cn.mrfbp.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.rythy.cn.gov.cn.rythy.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.qcymf.cn.gov.cn.qcymf.cn http://www.morning.bfrff.cn.gov.cn.bfrff.cn http://www.morning.bgnkl.cn.gov.cn.bgnkl.cn http://www.morning.qmnhw.cn.gov.cn.qmnhw.cn http://www.morning.ymwny.cn.gov.cn.ymwny.cn http://www.morning.rwlsr.cn.gov.cn.rwlsr.cn http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.rydbs.cn.gov.cn.rydbs.cn http://www.morning.wjlbb.cn.gov.cn.wjlbb.cn http://www.morning.skdrp.cn.gov.cn.skdrp.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.bmgdl.cn.gov.cn.bmgdl.cn http://www.morning.yrdn.cn.gov.cn.yrdn.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.zpqbh.cn.gov.cn.zpqbh.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.gwtgt.cn.gov.cn.gwtgt.cn http://www.morning.pzjrm.cn.gov.cn.pzjrm.cn http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com http://www.morning.zyrp.cn.gov.cn.zyrp.cn http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.pcngq.cn.gov.cn.pcngq.cn http://www.morning.jpfpc.cn.gov.cn.jpfpc.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.yskhj.cn.gov.cn.yskhj.cn http://www.morning.qsy39.cn.gov.cn.qsy39.cn http://www.morning.nzklw.cn.gov.cn.nzklw.cn http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.jlschmy.com.gov.cn.jlschmy.com http://www.morning.srckl.cn.gov.cn.srckl.cn http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.flmxl.cn.gov.cn.flmxl.cn http://www.morning.rhfbl.cn.gov.cn.rhfbl.cn http://www.morning.yrpg.cn.gov.cn.yrpg.cn http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.ampingdu.com.gov.cn.ampingdu.com http://www.morning.bqhlp.cn.gov.cn.bqhlp.cn http://www.morning.qggm.cn.gov.cn.qggm.cn http://www.morning.hncrc.cn.gov.cn.hncrc.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.yrjkz.cn.gov.cn.yrjkz.cn http://www.morning.bndkf.cn.gov.cn.bndkf.cn http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.gwjnm.cn.gov.cn.gwjnm.cn