如何实现可与纯文本占位符一起使用的占位符插件?

时间:2019-03-19 17:53:42

标签: ckeditor5

我正在尝试实现一个插件,该插件可将__firstName__类型的纯文本占位符转换为<placeholder key="__firstName__"></placeholder>这样的模型,反之亦然。

我遵循了implementing an inline widget上的教程,该教程对入门非常有帮助。

我完成了upcast部分的工作,该部分用于解析文本,将其拆分并创建文本元素和占位符元素。所以:

<p>Hi __firstName__,</p>

成为:

<$root>
    <paragraph>
        "Hi "
        <placeholder key="__firstName__">
        </placeholder>
        ","
    </paragraph>
</$root>

我现在正在努力使dataDowncast部分正常工作。我仅对dataDowncast进行了这些更改,返回的是文本,而不是其中包含文本的元素:

conversion.for('dataDowncast').elementToElement({
    model: 'placeholder',
    view: (modelItem, viewWriter) => {
        var key = modelItem.getAttribute('key');

        return viewWriter.createText(key);
    }
});

我现在面临两个问题。

1 .: dataDowncast的结果是:

<p>Hi _,_firstName__</p>

占位符之后的所有内容似乎都向左移动,换句话说,似乎完全忽略了占位符长度(-1)。 elementToElement甚至意味着除文本以外的其他元素吗?还是只需要以某种方式通知作者有关文本的长度?

2 .:如果模型中有两个以上的占位符:

<$root>
    <paragraph>
        <placeholder key="__firstName__">
        </placeholder>
        <placeholder key="__lastName__">
        </placeholder>
        <placeholder key="__salutation__">
        </placeholder>
    </paragraph>
</$root>

dataDowncast引发此错误:

Uncaught TypeError: Cannot read property 'name' of undefined
at Mapper.getModelLength (mapper.js:428)
at Mapper._findPositionIn (mapper.js:493)
at Mapper.on (mapper.js:94)
at Mapper.fire (emittermixin.js:211)
at Mapper.toViewPosition (mapper.js:277)
at DowncastDispatcher.modelViewSplitOnInsert (converters.js:214)
at DowncastDispatcher.fire (emittermixin.js:211)
at DowncastDispatcher._testAndFire (downcastdispatcher.js:473)
at DowncastDispatcher.convertInsert (downcastdispatcher.js:184)
at DataController.toView (datacontroller.js:207)

这可能是结果错误。

依赖项使用:

"@ckeditor/ckeditor5-editor-inline": "12.0.0",    
"@ckeditor/ckeditor5-widget": "11.0.0",

没有插件可用。

1 个答案:

答案 0 :(得分:0)

  

elementToElement()甚至意味着要用文本代替元素吗?

所有3个elementToElement()助手(双向,上投和下投)都期望在两端(在模型和视图中)都具有元素。他们将一个元素转换为另一个元素。

通常,有4种基本类型的转换器:

  • 在模型元素和视图元素之间,
  • 在模型属性和视图元素之间(然后必须为AttributeElement
  • 在模型和视图属性之间,
  • 从模型标记到视图突出显示或元素。

可以为较大的视图结构块编写自定义转换器(当较大的视图块由模型中的单个事物表示时),但这适用于视图的不可编辑部分(例如小部件的主体) )。在内容的可编辑部分中,视图中的所有内容都必须映射到模型中的某物,因为视图中的每个位置都必须映射到模型中的某个位置。反之亦然。

在您的情况下,问题在于将模型元素转换为视图文本时,该模型元素未映射到视图中的任何内容。这打破了一系列的事情-从位置映射到其他一些代码段,它们希望它们也可以映射元素。

从理论上讲,可能可以在此处覆盖位置和元素的映射方式。 CKEditor 5的Mapper为此提供了一些机制(检查事件),但是我不会这样做。它需要非常深入的知识和测试(即使我不确定也需要多少工作)。

因此,do follow the placeholder guide将模型元素转换为视图元素,反之亦然。