如何防止CKEditor删除<html>、<head>和<body>标签

问题描述 投票:0回答:2

我的问题与另一篇文章中描述的问题基本相同,只是它涉及CKeditor 4,而我实际上正在处理该模块的版本5

简而言之:如果我尝试在 ckeditor 中编辑 html 文档,例如

<html>
<head>
<meta http-equiv="Content-Type" content="text/html" />
</head>
<body>
<p>test</p>
</body>
</html>

使用源插件显示它或保存后保留的唯一可见的东西是清楚的

<p>test</p>

我的ckeditor配置是(我评论了我所做的无用尝试,对此进行了进一步描述)

/* multiple plugins import */

class Editor extends DecoupledDocumentEditor {
  constructor(document) {
    super(document);
    // this.data.processor = new XmlDataProcessor( document); // attempt without Html processor
    // this.editing.view.domConverter.preElements =["pre","style","head","html","body","meta"];
    // this.editing.view.domConverter.unsafeElements = ["script"]; // attempts on the view converter
    // this.data.processor.domConverter.preElements =["pre","style","head","html","body","meta"];
    // this.data.processor.domConverter.unsafeElements = ["script"]; // attempts on the data converter
  }
}

// Plugins to be included in the build.
Editor.builtinPlugins = [
        /* List of plugins, for clarity I only left the relevant ones */
    Essentials,
    GeneralHtmlSupport,
    SourceEditing   
];

编辑器的实例化是通过

完成的
DecoupledDocumentEditor
    .create(this.options.textArea.val(), {
        language: Bosecr.config.LOCALE,
        htmlSupport: {
            allow: [
                { // to keep all the html tags and their attributes
                    name: /.*/,
                    attributes: true,
                    classes: true,
                    styles: true
                }
            ]
        },
        updateSourceElementOnDestroy: true
        })  
    .then(editor => {
        console.log("view.preElements : " + editor.editing.view.domConverter.preElements);
        console.log("view.unsafeElements : " + editor.editing.view.domConverter.unsafeElements);
        console.log("data.preElements : " + editor.data.processor.domConverter.preElements);
        console.log("data.unsafeElements : " + editor.data.processor.domConverter.unsafeElements);
        // editor.editing.view.domConverter.preElements=["pre","style","head","html","body"];
        // editor.editing.view.domConverter.unsafeElements=["scripts"]; 
        
        this.options.toolbarArea.append( editor.ui.view.toolbar.element );
        this.options.textArea.append(editor.ui.getEditableElement());
        this.options.widgets.editor = editor;
    })
    .catch(error => {
        alert("error occured during editor creation : " + error);
    });

我已经尝试过了

  • 添加插件通用 Html 支持并将其配置为允许一切 => 它在允许 div 具有自制样式的类方面做得很好。但它似乎在
    <body>
    标签之外没有任何效果。
  • 我还尝试用
    HtmlDataProcessor
    替换
    XMLDataProcessor
    => 这带来的问题多于解决方案,因为
    <br>
    (非自关闭)和
    &nbsp;
    会阻塞问题。

我不确定为什么、何时或如何删除标签的内容。我可以想象两种情况:要么只保留

<body>
的内容(其余所有内容都被丢弃),要么只删除特定标签(是否有可配置的列表?)

作为一个疯狂的猜测,我尝试对 DomConverter 进行操作,它似乎是在 ckeditor“引擎”的 2 个位置定义的:既针对

editing.view
又针对
data.processor
。我尝试在
preElements
列表中添加 html, body, meta, head 标签,但没有任何明显效果。为了确定一下,我尝试了这个

  • 创建编辑器后(在
    then()
    函数内)
  • 在创建之前通过覆盖 ckeditor 配置中的
    constructor

我有一种感觉,我正在接近解决方案,而且我的需求并不那么奇怪,以至于这个新版本的 CKEditor 不允许它(事实上,它在以前的版本通过简单的布尔参数:

fullPage: true

所以我一定错过了一些东西。有谁知道我可以如何或朝哪个方向进一步调查?

javascript html ckeditor5
2个回答
0
投票

嗯,我不知道我一开始是怎么想念它的,现在我找到了解决方案,它看起来很简单。

实际上,这只是官方文档中。除了一般的 html 支持功能之外,我还必须激活全页 html 编辑功能。

这显然是在模块定义中完成的:

/* multiple plugins import */
/*GeneralHtmlSupport is for the extra html support like homemade div,
while FullPage is for the out-of-the-<body> content */
import {GeneralHtmlSupport, FullPage} from '@ckeditor/ckeditor5-html-support';

class Editor extends DecoupledDocumentEditor {
/* overriding the constructor is actually useless*/
}

// Plugins to be included in the build.
Editor.builtinPlugins = [
        /* List of plugins, for clarity I only left the relevant ones */
    Essentials,
    FullPage,        // declare the new FullPage plugin
    GeneralHtmlSupport,
    SourceEditing   
];

0
投票

我按照他们的 nextjs 设置指南定制了 ckeditor5。它已经包含了我需要的 GeneralHtmlSupport、SourceEditing 插件并且工作正常。但是,当我添加 FullPage 时,它不起作用。我以与您相同的方式添加了它(由于它是本地构建,因此需要再次构建它并运行 npm 的额外步骤),但它不起作用,仍然会删除“脱离主体”的内容。

有什么想法我可以研究一下吗?

© www.soinside.com 2019 - 2024. All rights reserved.