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" 对象,以处理 paragraph
和 bold
˛属性.
在 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 回答来说过于宽泛。这就是为什么我会保持简短的答案。
不幸的是,我没有看到在您的情况下使用 DataController
s Mapper
的简单合理的方法。这意味着您将需要以一种或另一种方式破解它。
此外,通常情况下,Mapper
仅在向下转换中使用,因此仅在您执行 DataController#toView
时使用。记住这一点。我们从来不需要在加载数据时使用 Mapper
。
我正在考虑破解它的最简单方法,但老实说,我认为您将不得不修改 DataController
或者只准备一段与 [=13 类似的代码=].创建您自己的 Mapper
实例并且不要清除代码中的绑定。
或者,您可以创建自己的 MyMapper
和 MyDataController
类 来扩展 CKE5 类。 MyDataController
可以覆盖 #mapper
属性 -> this.mapper = new MyMapper()
。并且 MyMapper
可以在清除时发送某种事件。在那种情况下,您可以复制映射器数据供您使用。
最后一个选择是在 CKE5 Github 上创建一个问题。我可以看到,在 DataController#toView
中,清除可以移至方法的开头。该更改不应产生不利结果,并且可以在下一次 toView
调用之前使用映射器。如果您创建问题,我们可能会在内部讨论此更改并可能实施它。
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" 对象,以处理 paragraph
和 bold
˛属性.
在 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 回答来说过于宽泛。这就是为什么我会保持简短的答案。
不幸的是,我没有看到在您的情况下使用 DataController
s Mapper
的简单合理的方法。这意味着您将需要以一种或另一种方式破解它。
此外,通常情况下,Mapper
仅在向下转换中使用,因此仅在您执行 DataController#toView
时使用。记住这一点。我们从来不需要在加载数据时使用 Mapper
。
我正在考虑破解它的最简单方法,但老实说,我认为您将不得不修改 DataController
或者只准备一段与 [=13 类似的代码=].创建您自己的 Mapper
实例并且不要清除代码中的绑定。
或者,您可以创建自己的 MyMapper
和 MyDataController
类 来扩展 CKE5 类。 MyDataController
可以覆盖 #mapper
属性 -> this.mapper = new MyMapper()
。并且 MyMapper
可以在清除时发送某种事件。在那种情况下,您可以复制映射器数据供您使用。
最后一个选择是在 CKE5 Github 上创建一个问题。我可以看到,在 DataController#toView
中,清除可以移至方法的开头。该更改不应产生不利结果,并且可以在下一次 toView
调用之前使用映射器。如果您创建问题,我们可能会在内部讨论此更改并可能实施它。