CKEditor5视图-模型位置和范围转换

CKEditor5 view-model position and range conversion

engine/conversion/mapper class 实现了我需要的功能,但是,我有几个关于如何最有效地 get/build 这个对象的问题。

我想让 Mapper 对象处于可以同时进行两种方式(模型到视图和视图到模型)转换的状态。

a) 有没有办法从 DataController(例如事件)中获取 Mapper

b) 如果我必须构建自己的 Mapper 那么最好的方法是什么?

我真的很想避免修改 DataController,但是,我更喜欢最有可能与未来 CKEditor5 版本向前兼容的解决方案。

更新(更多上下文): 基本上这个问题是在 toData 方法的 DataProcessor 中使用 的后续问题。

我从手头的任务开始,在我解释了我到底想用与原始问题更相关的职位做什么之后。

所以,我需要将编辑器数据转换为 BBCode(到目前为止还不错),但是我不知道 HTML 有什么用(另一个插件会为 [=18 设置模式) =] 和 italic 等)。因此,我想使用该模型进行一些转换,例如,即使我必须自己将属性转换为标签,以这种方式从模型转换文本节点似乎更容易。

然而,尽管我的另一个问题警告说它可能变得太复杂了,我最好还是转换一下,例如从 DOM(我仍然不同意),我决定让它更复杂一点,并从视图和模型转换。现在,我们来到这个问题。

我的转换计划如下:

a) 将 viewFragment 转换为 modelFragment。在这里,我想以两种方式在它们之间提供所有位置转换。

b) 在转换管道上向下传递,其中有一些用于处理元素和文本节点的通用框架,具有一组可扩展的 "conversion rule" 对象,以处理 paragraphbold˛属性.

在 b) 中,每个 "conversion rule" 可以决定他们想要转换的内容(视图、模型、转换为视图到 DOM 或 Markdown 或其他)然后 return文本中的转换结果,指向下一个要处理的元素之前的模型位置,以及视图中的相同位置。

因此,例如,<p><b>text</b></p><p>...</p> 作为文本,数据处理器将在模型和视图以及文档片段中的第一个 p 之前获得一个位置。当所有魔法发生时,它将 return 一个对象,它具有 {result:'[b]text[/b]\n\n', modelPos:'[par]...[/par]ˇ[par]...[/par]', viewPos: '<p><b>text</b></p>ˇ<p>...</p>'},其中 ˇ 将是对象指向适当位置的位置。

我希望它有点清楚,我正在尝试做什么,它有点长,因为我试图描述问题,所以你可以更好地判断我尝试应用到它的解决方案。

不幸的是,您描述的问题非常复杂,可能对于 SO 回答来说过于宽泛。这就是为什么我会保持简短的答案。

不幸的是,我没有看到在您的情况下使用 DataControllers Mapper 的简单合理的方法。这意味着您将需要以一种或另一种方式破解它。

此外,通常情况下,Mapper 仅在向下转换中使用,因此仅在您执行 DataController#toView 时使用。记住这一点。我们从来不需要在加载数据时使用 Mapper

我正在考虑破解它的最简单方法,但老实说,我认为您将不得不修改 DataController 或者只准备一段与 [=13 类似的代码=].创建您自己的 Mapper 实例并且不要清除代码中的绑定。

或者,您可以创建自己的 MyMapperMyDataController 类 来扩展 CKE5 类。 MyDataController 可以覆盖 #mapper 属性 -> this.mapper = new MyMapper()。并且 MyMapper 可以在清除时发送某种事件。在那种情况下,您可以复制映射器数据供您使用。

最后一个选择是在 CKE5 Github 上创建一个问题。我可以看到,在 DataController#toView 中,清除可以移至方法的开头。该更改不应产生不利结果,并且可以在下一次 toView 调用之前使用映射器。如果您创建问题,我们可能会在内部讨论此更改并可能实施它。