如何使每个元素分开。当前,每个元素都合并为一个<span>
元素
<span style="font-family:wingdings;">.4=??????</span>
<span style="font-family:symbol;">QPGH</span>
这是由下面的代码生成的
import Command from '@ckeditor/ckeditor5-core/src/command';
export default class SymbolsCommand extends Command {
execute({ charButtons }) {
const { model } = this.editor;
model.change((writer) => {
const { selection } = model.document;
const position = writer.createPositionAt(selection.getFirstPosition());
console.log(charButtons, 'charButtons');
const renderChars = () => charButtons.map(({ fontFamily, char }) => {
writer.insertText(char, { fontFamily }, position);
});
return renderChars();
});
}
refresh() {
this.isEnabled = true;
}
}
我希望输出
<span style="font-family:wingdings;">=</span>
<span style="font-family:wingdings;">?</span>
<span style="font-family:wingdings;">4</span>
<span style="font-family:symbol;">4</span>
<span style="font-family:symbol;">4</span>
...
答案 0 :(得分:2)
加入类似的<span>
是CKEditor 5的默认行为。原因之一是这些字符也加入了数据模型,并由一个文本节点表示。如果这些字符具有相同的属性,并且将它们分组在一起,则一次或一次插入这些字符都没关系。
防止这种情况发生的方法之一是指定view.AttributeElement#id。不幸的是,这是一个更高级的主题。其中,您将必须提供将在视图中创建属性元素的转换器。
我认为有两种方法可以实现您的目标,这两种方法都需要您添加一个转换器,而不是依靠字体家族插件中的fontFamily
转换器(我认为这是在这里发生的)。
<span>
s 第一个解决方案是为文本引入新的属性(记住扩展schema)并为其提供转换器。我们将其称为属性键symbol
。
对于每个创建的属性范围,转换器将必须逐字符转换给定的文本节点,并且set唯一id。
这是一个更复杂的解决方案,尽管可能更好。
editor.model.conversion.for( 'downcast' ).add( dispatcher => {
dispatcher.on( 'attribute:symbol', ( evt, data, conversionApi ) => {
// Provide your converter here. It should take `data.item`, iterate
// through it's text content (`data.item.data`), use
// `conversionApi.writer` to create attribute elements with unique ids
// and use the writer and `conversionApi.mapper` to place them in the view.
} );
} );
您可以基于https://github.com/ckeditor/ckeditor5-engine/blob/master/src/conversion/downcasthelpers.js引擎中function wrap
的{{1}}建立转换器。
另一种解决方案是插入带有字符的元素,而不是简单地插入文本节点。
在这种情况下,同样,您必须在架构中指定新的模型元素。也许扩展downcasthelpers.js
项。
要进行转换,您可以使用editor.conversion.for()
中的'$text'
个助手。对于下垂,您将必须指定elementToElement
作为回调并在其中设置唯一ID(唯一ID可以只是一个计数器,每次增加一个)。如果view
在向下转换中不起作用(应该在向上转换中起作用),则需要通过elementToElement
提供一个自定义转换器。
此解决方案比较容易,但是我不确定它是否会起作用。很难说哪个更好,因为这还取决于您要实现的目标。我可能会尝试两者,但我会专注于尝试使用第一种方法来实现。
我希望目前有一种更简单的方法可以实现这一目标,但是这种用例很少见,因此该体系结构集中在另一个方向。