TL;DR:我想破解 CKEditor 的内部结构,以便它为富文本(而不是 HTML)生成另一种格式,我想请专家就该想法的可行性发表意见。
我正在开发一个需要协作式富文本编辑器(如 Google Docs)的项目,并且我计划使用操作转换库(ShareJS)来实现它。但是由于标签嵌套规则,操作转换很难用 HTML 实现。例如,一个幼稚的 OT 实现很容易产生这种垃圾:
<b>overlapping bold <i>and</b> italic text.</i>
在 HTML 中表示此类文本的正确方法更像是这样:
<b>overlapping bold </b>
<b><i>and</i></b>
<i> italic text.</i>
或者更好的是,像这样:
<span class="bold">overlapping bold </span>
<span class="bold italic">and</span>
<span class="italic"> italic text.</span>
但是,要获得这些表示,OT 实现需要了解 HTML 标记嵌套的所有规则以及如何纠正错误的合并。
我一直在考虑一种可能的解决方案,它使用完全不强制标签嵌套规则的另一种标记形式。像这样的东西:
BOLD (start: 0, length: 20)
ITALIC (start: 17, length: 16)
TEXT:overlapping bold and italic text.
使用这样的格式,我可以使用普通的 OT 库来管理正在进行的 diff/rebase/merge 操作,然后在最后一刻将生成的文档转换为 HTML,然后更新协作双方的 GUI。
实现这一点的最简单方法是向 CKEditor 询问其 HTML 输出,然后在事后以新格式重建文档。但是 OT 会要求我在每次按键时都执行这种转换,这似乎有点过于重量级了。出于性能原因,我想知道是否可以覆盖 CKEditor 中的默认 HTML 编写器,要求它在遍历 DOM 时生成另一种格式。
你怎么看?