CKEditor:PasteFromWord忽略pasteFilter

时间:2017-08-04 08:02:14

标签: javascript ckeditor drupal-8

在CKEditor 4.6.2(目前捆绑在Drupal 8中)默认情况下禁用ACF,以确保某些特殊插件正常工作。所以对于记录:我不想启用ACF并且无法使用allowedContentdisallowedContent。我试图阻止从Word中粘贴一些元素(如h1p[styles])。

为了实现这一点,我尝试将这些添加到pasteFilter,这完全适用于非Word粘贴的内容,但是当从Word粘贴pasteFilter似乎被忽略了?这是一个错误吗?

那么,我该怎么做:

  1. 禁用ACF - 支持特殊的Drupal元素
  2. 保持pastefromword启用 - 检测缩进和列表等特殊字样式。
  3. 所有(包括Word)粘贴添加其他过滤 - 删除一些元素和属性,如h1style="font-family: Verdana"等。

2 个答案:

答案 0 :(得分:3)

处理从Word粘贴的内容需要进行大量的标记处理才能将其转换为干净的语义内容。来自Word过滤器的粘贴非常具体,涵盖了许多边缘情况(特别是嵌套列表)。从Word粘贴它有自己的过滤器而不重用ACF规则的原因是它可能会引起一些冲突 - 它在this issue中有描述。

至于现在,现在有一种开箱即用的方法可以为从Word粘贴的内容添加额外的过滤功能。但是,您可以使用afterPasteFromWord事件来过滤粘贴的数据,例如:

var editor = CKEDITOR.replace( 'editor1' );

editor.on( 'afterPasteFromWord', function( evt ) {
    var filter = editor.activeFilter, // Use activeFilter so it reflects ACF settings.
    // var filter = new CKEDITOR.filter( 'p b' ), // Use custom new filter.
        fragment = CKEDITOR.htmlParser.fragment.fromHtml( evt.data.dataValue ),
        writer = new CKEDITOR.htmlParser.basicWriter();

    filter.applyTo( fragment );
    fragment.writeHtml( writer );
    evt.data.dataValue = writer.getHtml();
} );

请参阅this codepen demo

您还可以参考CKEDITOR.filter.applyToCKEDITOR.editor.activeProperty上的官方文档。

答案 1 :(得分:0)

这是我目前的解决方案,作为插件:

// Activate the ACF filter only when pasting from Word (the opposite of the default).
// Use config.pasteFilter='semantic-content' to filter non-Word pasted content.
// Tested with ckeditor 4.8.
CKEDITOR.plugins.add('filterOnlyOnPaste', {
    init: function(editor) {
        editor.on('setData', function(evt) {
            editor.activeFilter.disabled = true;
        });
        editor.on('instanceReady', function(evt) {
            editor.activeFilter.disabled = true;
        });
        editor.on('afterPasteFromWord', function(e) {
            editor.activeFilter.disabled = false;
            var filter = editor.activeFilter,
                fragment = CKEDITOR.htmlParser.fragment.fromHtml(e.data.dataValue),
                writer = new CKEDITOR.htmlParser.basicWriter();
            filter.applyTo(fragment);
            fragment.writeHtml(writer);
            e.data.dataValue = writer.getHtml();
            editor.activeFilter.disabled = true;
        });
    }
});