将CKEditor高级内容过滤器应用于字符串

时间:2014-03-06 23:10:11

标签: filter ckeditor paste advanced-custom-fields

如何将CKEditor的高级内容过滤器应用于字符串?

我正在尝试使用editor.on('paste',...)拦截粘贴的内容,获取其ACF过滤值,然后将我自己的转换应用于过滤后的值。在此之后,如果它再次通过ACF就可以了。

2 个答案:

答案 0 :(得分:4)

我最近报告了一张我认为你会感兴趣的票:http://dev.ckeditor.com/ticket/11621。在CKEditor 4.5中引入此功能的可能性非常大。 (修改:此功能已在4.5 - CKEDITOR.config.pasteFilter中转到CKEditor。)

至于你的问题 - 要将ACF应用于HTML字符串,你需要:

  1. 使用CKEDITOR.htmlParser.fragment.fromHtml()解析它。
  2. 在上一步中创建的文档片段上调用filter.applyTo。您可以使用标准editor.filter,也可以使用不同的设置创建自己的实例。
  3. 将文档片段序列化为HTML字符串。
  4. 例如:

        // Create standalone filter passing 'p' and 'b' elements.
    var filter = new CKEDITOR.filter( 'p b' ),
        // Parse HTML string to pseudo DOM structure.
        fragment = CKEDITOR.htmlParser.fragment.fromHtml( '<p><b>foo</b> <i>bar</i></p>' ),
        writer = new CKEDITOR.htmlParser.basicWriter();
    
    filter.applyTo( fragment );
    fragment.writeHtml( writer );
    writer.getHtml(); // -> '<p><b>foo</b> bar</p>'
    

答案 1 :(得分:0)

如果您希望应用克林顿禁止的规则并有选择地对粘贴事件做出反应,则以@Reinmar的答案为基础。

CKEDITOR.on('instanceReady', function(ev) {
  ev.editor.on('paste', function(evt) {
    // Standalone filter based off the existing filter.
    // If the editor is removed, so it our custom filter object.
    // We don't need to pass an editor however.
    // @see https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html
    var filter = new CKEDITOR.filter(evt.editor);
    // Allow all content.
    // @see https://ckeditor.com/docs/ckeditor4/latest/guide/dev_allowed_content_rules.html#special-features
    // Don't set filter.allowedContent property directly, doesn't work.
    var allowed = filter.allow({
      '$1': {
          // Use the ability to specify elements as an object.
          elements: CKEDITOR.dtd,
          attributes: true,
          styles: true,
          classes: true
      }
    });
    if (allowed === false) {
      console.warn('An error occured setting the custom rules.');
      return;
    }
    // Now disllow color attribute & colour background-color, text-decoration styles.
    // Format "elements [attributes, attr2]{styles}(classes)"."
    // Default is '*[color]; *{color, background-color, text-decoration}'.
    filter.disallow('*[color]; *{color, background-color, text-decoration}');
    // Filter it now.
    var fragment = CKEDITOR.htmlParser.fragment.fromHtml(evt.data.dataValue);
    var writer = new CKEDITOR.htmlParser.basicWriter();
    filter.applyTo(fragment);
    fragment.writeHtml(writer);
    var processed_html = writer.getHtml();
    // Set the value of what will be pasted.
    evt.data.dataValue = processed_html;
    console.log('Content filtered.');
    // Clean up - free up memory.
    filter.destroy();
  });
});