Contribute to this guide

指南代码块

代码块功能允许您插入和编辑预格式化的代码块。它非常适合以吸引人、易于阅读的形式呈现与编程相关的內容。

# 演示

使用代码块工具栏按钮 插入代码块 和类型下拉菜单插入所需的代码块。或者,使用 ````` 开头一行,自动格式化功能 将其格式化为代码块。要添加代码块下面的段落,只需按 Enter 三次。

此演示展示了一组有限的功能。访问 功能丰富的编辑器示例 以查看更多实际应用。

每个代码块都具有 分配的特定编程语言(例如“Java”或“CSS”;可以配置),并支持基本编辑工具,例如 使用键盘更改行缩进

# 安装

⚠️ 新的导入路径

版本 42.0.0 开始,我们更改了导入路径的格式。本指南使用新的、更短的格式。如果您使用的是 CKEditor 5 的旧版本,请参考 旧版设置中的软件包 指南。

安装编辑器 后,将功能添加到插件列表和工具栏配置中

import { ClassicEditor, CodeBlock } from 'ckeditor5';

ClassicEditor
    .create( document.querySelector( '#editor' ), {
        plugins: [ CodeBlock, /* ... */ ],
        toolbar: [ 'codeBlock', /* ... */ ]
    } )
    .then( /* ... */ )
    .catch( /* ... */ );

# 配置代码块语言

每个代码块都可以分配一种编程语言。代码块的语言用 `<code>` 元素的 CSS 类表示,在编辑和编辑器数据中都是如此。

<pre><code class="language-javascript">window.alert( 'Hello world!' )</code></pre>

可以配置哪些语言可供用户使用。您可以使用 codeBlock.languages 配置并定义您自己的语言。例如,以下编辑器仅支持两种语言(CSS 和 HTML)

ClassicEditor
    .create( document.querySelector( '#editor' ), {
        codeBlock: {
            languages: [
                { language: 'css', label: 'CSS' },
                { language: 'html', label: 'HTML' }
            ]
        }
    } )
    .then( /* ... */ )
    .catch( /* ... */ );

默认情况下,数据和编辑中的 `<code>` 元素的 CSS 类是使用 `language` 属性生成的(以“language-”为前缀)。您可以通过指定可选的 `class` 属性来自定义它。您可以设置 **多个类**,但 **只有第一个类** 将用作定义语言类。

ClassicEditor
    .create( document.querySelector( '#editor' ), {
        codeBlock: {
            languages: [
                // Do not render the CSS class for the plain text code blocks.
                { language: 'plaintext', label: 'Plain text', class: '' },

                // Use the "php-code" class for PHP code blocks.
                { language: 'php', label: 'PHP', class: 'php-code' },

                // Use the "js" class for JavaScript code blocks.
                // Note that only the first ("js") class will determine the language of the block when loading data.
                { language: 'javascript', label: 'JavaScript', class: 'js javascript js-code' },

                // Python code blocks will have the default "language-python" CSS class.
                { language: 'python', label: 'Python' }
            ]
        }
    } )
    .then( /* ... */ )
    .catch( /* ... */ );

配置中定义的第一个语言被认为是默认语言。这意味着它将应用于从数据中加载的、未指定 CSS `class` 的代码块(或与 配置 不匹配的 `class`)。它还将在使用工具栏按钮创建新代码块时使用。默认情况下,它是“纯文本”(`language-plaintext` CSS 类)。

# 与代码高亮器的集成

虽然在 CKEditor 5 中 编辑时无法进行实时代码块高亮显示 (了解更多信息),但内容可以在前端显示时进行高亮显示(例如,在博客文章或网站内容中)。

代码语言 配置 有助于与外部代码高亮器集成(例如,highlight.jsPrism)。请参考您选择的高亮器文档,确保 `codeBlock.languages` 中配置的 CSS 类与高亮器的代码语法自动检测功能相匹配。

# 提示和技巧

# 编辑代码块周围的文本

在某些情况下,可能没有明显的方法在代码块之前或之后设置光标并输入文本。当代码块前或后紧跟着一个小部件(例如表格)时,或者当代码块是文档的第一个或最后一个子节点(或两者都是)时,就会出现这种情况。

  • 要在 **代码块之前** 输入文本:将选择置于代码块第一行的开头,然后按 Enter。将选择移至创建的空行,然后再次按 Enter。将在代码块之前创建一个新的段落,您可以在此段落中输入文本。

    The animation shows typing before the code blocks in CKEditor 5 rich text editor.

  • 要在 **代码块之后** 输入文本:将选择置于代码块最后行的末尾,然后按 Enter 三次。将在代码块之后创建一个新的段落,您可以在此段落中输入文本。

    The animation shows typing after the code blocks in CKEditor 5 rich text editor.

# 更改行缩进

您可以使用键盘快捷键和工具栏按钮更改代码的缩进。

  • 要 **增加** 缩进:选择要缩进的行(或多行)。按 Tab 键或按工具栏中的“增加缩进”按钮。
  • 要 **减少** 缩进:选择要减少缩进的行(或多行)。按 Shift+Tab 键或按工具栏中的“减少缩进”按钮。

The animation shows changing indentation inside code blocks in CKEditor 5 rich text editor.

这种方式创建的缩进可以更改。使用 codeBlock.indentSequence 配置来选择其他你喜欢的字符(或字符序列)(例如,四个空格)。默认情况下,缩进使用单个制表符(\t)字符。

可以通过将 codeBlock.indentSequence 配置设置为 false 来关闭缩进工具及其关联的按键。

# 保留行缩进

为了加快编辑速度,在代码块中键入时,当按下 Enter 并创建新行时,会保留当前行的缩进。如果要更改新行的缩进,请查看 一些简单的方法

The animation shows preserving indentation inside code blocks in CKEditor 5 rich text editor.

以下是一些您可能会发现有用的类似 CKEditor 5 功能

  • 基本文本样式 – 将 code 格式用于短的内联代码块。
  • 块引用 – 在富文本内容中包含块引用或摘录。
  • 块缩进 – 为文本块(如段落或列表)设置缩进。
  • 自动格式化 – 使用 Markdown 代码动态格式化内容。

如果您想在 WYSIWYG 编辑器中使用内联代码格式化,请查看具有内联 <code> 元素支持的 基本文本样式功能

# 通用 API

CodeBlock 插件注册

  • 带有下拉菜单的 'codeBlock' 分割按钮,允许选择代码块的语言。

  • 'codeBlock' 命令。

    该命令将选定的 WYSIWYG 编辑器内容转换为代码块。如果未选择任何内容,它将在选择位置创建一个新的代码块。

    您可以在执行命令时选择代码块使用的语言。语言将在编辑器模型中设置,并反映在编辑视图和编辑器(数据)输出中可见的 CSS 类中。

    editor.execute( 'codeBlock', { language: 'css' } );
    

    执行命令时,您可以使用由 codeBlock.languages 配置定义的语言。默认语言列表如下

    codeBlock.languages: [
        { language: 'plaintext', label: 'Plain text' }, // The default language.
        { language: 'c', label: 'C' },
        { language: 'cs', label: 'C#' },
        { language: 'cpp', label: 'C++' },
        { language: 'css', label: 'CSS' },
        { language: 'diff', label: 'Diff' },
        { language: 'html', label: 'HTML' },
        { language: 'java', label: 'Java' },
        { language: 'javascript', label: 'JavaScript' },
        { language: 'php', label: 'PHP' },
        { language: 'python', label: 'Python' },
        { language: 'ruby', label: 'Ruby' },
        { language: 'typescript', label: 'TypeScript' },
        { language: 'xml', label: 'XML' }
    ]
    

    注意:如果您在选择位于代码块中的情况下,使用特定的 language 执行命令,并使用额外的 forceValue: true 参数,它将更新此特定块的语言。

    editor.execute( 'codeBlock', { language: 'java', forceValue: true } );
    

    注意:如果选择已位于代码块中,执行命令将把代码块转换回纯文本段落。

  • 'indentCodeBlock''outdentCodeBlock' 命令。

    这两个命令都由 TabShift+Tab 按键使用,如 关于缩进的部分 所述。

    • 当选择位于代码块中的任何位置时,'indentCodeBlock' 命令启用,它允许增加代码行的缩进。缩进字符(序列)可以使用 codeBlock.indentSequence 配置进行配置。
    • 'outdentCodeBlock' 命令在选择中任何代码行的缩进可以减少时启用。执行它将从这些行中删除缩进字符(序列),如 codeBlock.indentSequence 配置。

我们建议使用官方的 CKEditor 5 检查器 进行开发和调试。它将为您提供有关编辑器状态的大量有用信息,例如内部数据结构、选择、命令等等。

# 贡献

该功能的源代码在 GitHub 上的 https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-code-block 中提供。