You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止CKEditor 4将Jinja代码合并为单行?

解决CKEditor 4.x保留Jinja模板代码格式的问题

我明白你遇到的痛点——切换CKEditor的视图后,Jinja代码的空格和换行被自动合并,破坏了模板的可读性。结合你的现有配置,我们可以通过调整编辑器核心设置和CodeMirror插件配置来解决这个问题,以下是具体方案:

1. 完善Jinja标签的保护规则

首先确保所有Jinja语法标签都被加入protectedSource,包括你之前注释掉的{{ }}。这一步会告诉CKEditor不要解析或修改这些Jinja代码块,避免视图切换时的格式破坏:

// 替换原有的protectedSource配置
CKEDITOR.config.protectedSource.push(/\{\%[\s\S]*?\%\}/g); // Jinja {% %}
CKEDITOR.config.protectedSource.push(/\{\{[\s\S]*?\}\}/g); // Jinja {{ }}
CKEDITOR.config.protectedSource.push(/\{\#[\s\S]*?\#\}/g); // Jinja {# #}

2. 关闭CKEditor的自动格式化行为

添加以下配置,禁用编辑器默认的HTML压缩和格式清理逻辑:

CKEDITOR.editorConfig = function( config ) {
    // ... 保留你原有的配置项 ...
    
    // 禁用自动段落包装(你已设置,保留即可)
    config.autoParagraph = false;
    // 禁止编辑器自动填充空区块的内容
    config.fillEmptyBlocks = false;
    // 保留空段落元素,避免Jinja标签被误删
    config.preserveEmptyParagraph = true;
    // 允许所有自定义内容,不过滤Jinja相关标签
    config.extraAllowedContent = '*(*);*{*}';
    // 设置回车和换行模式,避免自动添加<br>或<p>破坏格式
    config.enterMode = CKEDITOR.ENTER_BR;
    config.shiftEnterMode = CKEDITOR.ENTER_P;
};

3. 配置CodeMirror插件保留源码格式

针对你使用的CodeMirror插件,增加以下配置,确保源码视图中的缩进、换行和空格被完整保留:

config.codemirror = {
    mode: 'django',
    // 保留缩进格式
    preserveIndent: true,
    // 显示行号(可选,提升源码可读性)
    lineNumbers: true,
    // 禁止自动格式化粘贴的内容
    autoFormatOnPaste: false,
    // 禁止删除时自动调整格式
    autoFormatOnDelete: false,
    // 使用Tab键缩进(可选,匹配你的代码风格)
    indentWithTabs: true,
    // 设置缩进宽度(可选)
    indentUnit: 4
};

修改后的完整config.js示例

/**
 * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
 * For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
 */
CKEDITOR.editorConfig = function( config ) {
 // Define changes to default configuration here. For example:
 config.removePlugins = 'easyimage, cloudservices';
 config.height = 800;
 config.toolbarCanCollapse = true;
 /* skin */
 config.skin = 'office2013';
 config.extraPlugins = 'codemirror,placeholder,textindent,floating-tools,textselection,tableresizerowandcolumn,quicktable';
 // Codemirror配置
 config.codemirror = {
 mode: 'django',
 preserveIndent: true,
 lineNumbers: true,
 autoFormatOnPaste: false,
 autoFormatOnDelete: false,
 indentWithTabs: true,
 indentUnit: 4
 };
 config.toolbar = 'Basic';
 
 // 新增格式保护配置
 config.autoParagraph = false;
 config.fillEmptyBlocks = false;
 config.preserveEmptyParagraph = true;
 config.extraAllowedContent = '*(*);*{*}';
 config.enterMode = CKEDITOR.ENTER_BR;
 config.shiftEnterMode = CKEDITOR.ENTER_P;
};
/* Protected code in editor */
CKEDITOR.config.protectedSource.push(/&lt;\?[\s\S]*?\?&gt;/g); // PHP
CKEDITOR.config.protectedSource.push(/\{\%[\s\S]*?\%\}/g); // Jinja {% %}
CKEDITOR.config.protectedSource.push(/\{\{[\s\S]*?\}\}/g); // Jinja {{ }}
CKEDITOR.config.protectedSource.push(/\{\#[\s\S]*?\#\}/g); // Jinja {# #}

验证效果

配置完成后重新加载编辑器:

  • 在源码视图输入带空格和换行的Jinja代码
  • 切换到所见即所得视图再返回源码视图
  • 检查代码是否保持原始的空格和换行格式

这个方案同时调整了CKEditor核心的格式化规则和CodeMirror的源码编辑行为,应该能达到你想要的效果,和Summernote的表现一致。

内容的提问来源于stack exchange,提问作者Houy Narun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:26:52