从CKEditor生成非HTML标记

时间:2013-12-08 19:48:49

标签: javascript ckeditor operational-transform

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时生成备用格式。

您怎么看?

1 个答案:

答案 0 :(得分:1)

这可能是一个非常无知的答案 - 但我一直在考虑用CKEditor做这样的事情。我的想法(我还没有尝试过)会挂钩到Undo / Redo缓冲区,并将其作为一种穷人的OT来回传递。它可能需要编写自己的撤销/重做缓冲区(或者显着扩展已有的缓冲区)。然后,所有编辑将成为一系列Command Pattern实例,Undo / Redo缓冲区将成为可播放命令的巨大列表。

就像我说的那样,我还没有尝试过这个。由于一系列原因,这可能是一个糟糕的主意。这是我第一次想到用CKEditor实现某种协作编辑功能。