0

我在玩 CKEEditor5,并尝试创建一个自定义数据处理器。我想在toData转换中使用模型,但是方法是用view/DocumentFragment对象调用的。所以我的问题是如何将其转换为model/DocumentFragment对象(或如何从数据处理器访问模型)。

更新(因为它不适合评论):让我尝试更详细地解释我到底尝试做什么(或者到目前为止我已经做了)。我想出了如何使用访问模型本身,但这似乎是一个糟糕的解决方案,因为您也指出了这一点。

所以基本上我想创建一个DataProcessor将编辑器数据转换为 BBCode,我猜这听起来很合理。

一方面,该toView方法很简单,因为可以假设已经实现了 BBCode 到 HTML 的转换(在我的例子中)。从 HTML 加载编辑器数据似乎很简单(通过 Markdown 处理器使用的相同过程)。

另一方面,从模型数据而不是视图转换为 BBCode 似乎更容易。主要是因为view/DocumentFragment对象和视图树的其余部分几乎只是 DOM 或 HTML 的另一种表示。我真的不在乎粗体是否是<b>或者<strong>我只是想知道text节点是否具有bold属性。

通过使用该模型,我希望使用语义而不是 HTML 中使用的表示。基本上将所有 HTML 标签映射到它们的 BBCode 等价物似乎有点毫无意义(即使 CKE5 在提供一致的 HTML 标签方面做得很好)。所以从我的角度来看,使用模型更有意义。从语义表示转换为“数据格式”比转换为“数据格式”(视图树、DOM、HTML、摩尔斯电码)然后创建“表示图”更容易。

长期以来,阻碍我们使用 RTE 或 WYSIWYG 编辑器的正是从 HTML 转换为 BBCode 的难度。现在 CKE5 有了模型,它似乎很容易转换为任何东西,因为它不仅独立于 HTML 格式,还独立于编辑器中显示的 HTML(这不能说关于视图树,因为它正是编辑器 - 至少它不是 contenteditable 产生的任何东西,但仍然不够好)。

另外:我刚刚做了一个Plugin设置DataProcessor,因为这也是 Markdown 功能所做的(在某处的文档中)。这是个坏主意吗?

再次感谢您的回答。

4

1 回答 1

5

最近,在 CKE5 GitHub 上提出了一个类似的问题。问题是关于获取 JSON 数据作为编辑器输出,但您提出的主题也被部分覆盖。

(...) 如何从数据处理器访问模型

直接在模型上操作存在一定的问题和风险。这不是推荐的东西。它在链接的帖子中进行了解释。

(...) 我的问题是我怎么能把它转换成model/DocumentFragment

这是比直接在模型上操作更好(风险更小)的方法。但是,我不得不问 - 为什么要从模型转换?也许有更好的解决方案来解决您的问题?

要在视图和模型之间进行转换,必须使用DataController#toViewand DataController#toModelDataController实例可在Editor#data. 要在数据处理器中使用它,数据处理器需要访问编辑器实例。

我建议创建自己的编辑器类,扩展 CKE5 编辑器类之一。然后,在新的编辑器类构造函数中,覆盖数据处理器并传递编辑器实例。就像是:

class MyEditor extends ClassicEditor {
  constructor() {
    this.data.processor = new MyDataProcessor( this );
  }
}

class MyDataProcessor() {
  constructor( editor ) {
    this._editor = editor;
  }

  toData( viewDocumentFragment ) {
    const modelDocumentFragment = this._editor.data.toModel( viewDocumentFragment );
    // ...
  }

  toView( modelData ) {
    // ...
    this._editor.data.toView( ... );
    // ...
  }
}

这些只是为了显示方向,而不是工作/测试样本。

不过,我想知道您为什么坚持使用模型而不是视图来生成编辑器输出。

顺便提一句。如果你继续这样实现它,整个过程会有点傻:)。首先,您将获得模型数据,然后将其转换为视图(在数据处理器中),然后编辑器将获取视图数据并将其转换回模型:)。所以也许你也会对覆盖Editor#setData方法感兴趣,这样就不会发生不必要的转换。

于 2017-10-24T11:02:33.603 回答