5

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 时生成另一种格式。

你怎么看?

4

1 回答 1

1

这可能是一个非常无知的答案——但我一直在考虑用 CKEditor 做这样的事情。我的想法(我还没有尝试过)是连接到撤消/重做缓冲区,并将其用作一种通过网络来回发送的穷人的 OT。它可能需要编写您自己的撤消/重做缓冲区(或显着扩展已经存在的缓冲区)。然后,所有编辑将成为一系列命令模式实例,撤消/重做缓冲区成为可播放命令的巨大列表。

就像我说的,我还没有尝试过实现这个。出于多种原因,这可能是一个糟糕的主意。这是我使用 CKEditor 实现某种协作编辑功能的第一个想法。

于 2014-01-26T13:15:39.513 回答