SyntaxHighlighter配合CKEditor插件轻松打造代码语法着色

下面我来详细讲解一下使用SyntaxHighlighter配合CKEditor插件打造代码语法着色的完整攻略。

准备工作

在开始使用SyntaxHighlighter配合CKEditor插件打造代码语法着色之前,需要做一些准备工作。

下载SyntaxHighlighter

首先需要下载 SyntaxHighlighter。可以选择下载最新版本的zip文件或者使用npm安装。

引入SyntaxHighlighter文件

下载完成后,需要在页面中引入SyntaxHighlighter文件。可以复制/dist目录下的文件到项目中,然后在HTML文件中引入。

<link rel="stylesheet" href="path/to/syntaxhighlighter/styles/shCore.css" />
<script src="path/to/syntaxhighlighter/scripts/shCore.js"></script>

下载CKEditor

接着需要下载 CKEditor,同样可以选择下载最新版本的zip文件或者使用npm安装。

引入CKEditor

下载完成后,需要在页面中引入CKEditor文件。可以复制/build目录下的文件到项目中,然后在HTML文件中引入。

<script src="path/to/ckeditor/ckeditor.js"></script>

集成SyntaxHighlighter和CKEditor

准备工作完成后,可以开始使用SyntaxHighlighter配合CKEditor插件打造代码语法着色,具体步骤如下:

设置SyntaxHighlighter

首先需要在页面中初始化SyntaxHighlighter,可以通过以下代码实现:

SyntaxHighlighter.all();

这段代码会找到页面中所有含有class="brush: [language]"<pre>标签,并对其中的代码进行着色。

编写CKEditor插件

然后需要编写一个CKEditor插件,用于插入含有SyntaxHighlighter所需要的代码块。具体步骤如下:

安装CKEditor插件生成器

首先需要安装CKEditor插件生成器。可以通过以下命令进行安装:

npm install -g @ckeditor/ckeditor5-dev

生成插件

生成插件需要指定一些参数,可参考以下样例:

$ cked g plugin syntaxhighlighter --template=default --className=SyntaxHighlighter --packageName=syntaxhighlighter
$ cd syntaxhighlighter
$ npm install

其中参数含义如下:
- plugin syntaxhighlighter:指插件名为syntaxhighlighter
- --template=default:指用默认模板(即只有一个JS文件和一个CSS文件)生成插件
- --className=SyntaxHighlighter:指定插件的类名为SyntaxHighlighter
- --packageName=syntaxhighlighter:指定该插件的包名为syntaxhighlighter

通过以上命令生成的插件包含一个js文件和一个css文件,需要将它们放到对应的目录下。

配置插件

生成插件后,需要在生成的目录下,修改./src/index.js来实现插件的功能。下面是一个插入含有SyntaxHighlighter的代码块的简单示例:

import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
import Widget from '@ckeditor/ckeditor5-widget/src/widget';
import Command from '@ckeditor/ckeditor5-core/src/command';
import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils';

const SYNTAX_HIGHLIGHTER = 'SyntaxHighlighter';

export default class SyntaxHighlighter extends Plugin {
    static get requires() {
        return [Widget];
    }

    static get pluginName() {
        return SYNTAX_HIGHLIGHTER;
    }

    init() {
        const editor = this.editor;
        const schema = editor.model.schema;

        // Register the widget and command.
        schema.register( 'syntaxHighlighter', {
            isObject: true,
            allowWhere: '$block',
            allowAttributes: ['language', 'code']
        } );

        editor.ui.components.get( 'toolbar' ).add( 'SyntaxHighlighter', {
            label: 'Insert syntax highlighter block',
            command: 'syntaxHighlighter',
            icon: 'terminal'
        } );

        editor.commands.add( 'syntaxHighlighter', new SyntaxHighlighterCommand( editor ) );

        // Allow nesting this model element in blocks and as document child.
        editor.model.schema.extend( '$block', { allowContentOf: 'syntaxHighlighter' } );
        editor.model.schema.addChildCheck((context, childDefinition) => {
            if (context.endsWith('syntaxHighlighter') && childDefinition.name == '$block') {
                return true;
            }
        });

        // Allow inserting this content by pasting it.
        editor.conversion.elementToElement({
            model: 'syntaxHighlighter',
            view: {
                name: 'pre',
                classes: 'brush: [language]'
            }
        });
    }
}

class SyntaxHighlighterCommand extends Command {
    execute(options) {
        this.editor.model.change(writer => {
            writer.insertText('[language]Type your code here[/language]', this.editor.model.document.selection.getFirstPosition());
        });
    }
}

function syntaxHighlighterToWidget() {
    return (modelItem, viewWriter) => {
        if (modelItem.name == 'syntaxHighlighter') {
            const pre = viewWriter.createContainerElement('pre', { class: 'brush: ' + modelItem.getAttribute('language') });
            const code = viewWriter.createRawElement('code', {}, modelItem.getAttribute('code') || 'Type your code here');
            viewWriter.insert(viewWriter.createPositionAt(pre, 0), code);
            return toWidget(pre, viewWriter);
        }
    };
}

export function toWidgetSyntaxHighlighter(viewElement) {
    return toWidget(viewElement, DEFAULT_WIDGET_CONFIG);
}

配置CKEditor

最后将生成的插件引入到CKEditor中,可以通过使用自定义构建来达到这个目的。具体步骤如下:

配置build-config.js

在CKEditor安装目录下,找到build-config.js文件,并在其中添加以下代码:

module.exports = {
    plugins: [
        // ... 其他自定义插件
        require('./path/to/syntaxhighlighter/src/index.js')
    ],
    // ... 其他配置
};

记得将['./path/to/syntaxhighlighter']替换成实际路径。

构建CKEditor

修改node_modules/ckeditor5-build-classic/build/ckeditor.js文件,删除以下三行:

import Alignment from '../../ckeditor5-alignment/src/alignment';
ClassicEditor.builtinPlugins.push( Alignment );

然后执行构建命令:

npm run build

执行完毕后,在./build目录下将生成一个新的构建好的CKEditor。

示例

以上就是使用SyntaxHighlighter配合CKEditor插件打造代码语法着色的详细攻略。下面是两条示例说明:

示例1

假设我们要在文章中插入一段html代码,并使用SyntaxHighlighter着色处理。首先需要在html文件中加入以下代码:

<link rel="stylesheet" href="path/to/syntaxhighlighter/styles/shCore.css" />
<script src="path/to/syntaxhighlighter/scripts/shCore.js"></script>
<script src="path/to/ckeditor/ckeditor.js"></script>
<script src="path/to/syntaxhighlighter-ckeditor-plugin.js"></script>

其中syntaxhighlighter-ckeditor-plugin.js是我们自己编写的CKEditor插件。其次,需要在适当的位置加入一个<pre>标签,不过需要加上语言的类名,可以参考以下代码:

<pre class="brush: html">
    &lt;p&gt;Hello world!&lt;/p&gt;
</pre>

最后,在CKEditor编辑器中点击插入语法高亮代码的按钮,选择HTML语言即可插入含有SyntaxHighlighter的代码块。

示例2

假设我们要在文章中插入一段Javascript代码。与示例1类似,首先需要在html文件中加入以下代码:

<link rel="stylesheet" href="path/to/syntaxhighlighter/styles/shCore.css" />
<script src="path/to/syntaxhighlighter/scripts/shCore.js"></script>
<script src="path/to/ckeditor/ckeditor.js"></script>
<script src="path/to/syntaxhighlighter-ckeditor-plugin.js"></script>

其次,需要在适当的位置加入一个<pre>标签,不过需要加上语言的类名,可以参考以下代码:

<pre class="brush: javascript">
    var a = 1;
    var b = 2;
    console.log(a + b);
</pre>

最后,在CKEditor编辑器中点击插入语法高亮代码的按钮,选择Javascript语言即可插入含有SyntaxHighlighter的代码块。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SyntaxHighlighter配合CKEditor插件轻松打造代码语法着色 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • SpringBoot YAML语法基础详细整理

    SpringBoot YAML语法基础详细整理 什么是YAML? YAML是一种人类可读的数据序列化格式,它被广泛应用于各种编程语言中,包括Java。YAML以比JSON和XML更清晰的方式来表示数据,同时具有更好的阅读性和易懂性。 YAML的基本语法 键值对 使用冒号将键和值分开,键和值之间必须有空格。 foo: bar 列表 使用短横线表示项,项和项之间…

    html 2023年5月30日
    00
  • 详解XML中的代码注释书写方法

    下面是详解“详解XML中的代码注释书写方法”的完整攻略。 标准XML代码注释格式 在XML中,我们使用<!–和–>进行注释。这两个符号之间的内容都会被视为注释,在XML解析时会被忽略。 例如,在下面的示例中,我们使用XML注释来描述XML文件的版本、作者和创建时间: <?xml version="1.0" encod…

    html 2023年5月30日
    00
  • Python中json库的操作指南

    下面是详细讲解“Python中json库的操作指南”的完整攻略。 什么是JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语言的子集,但也可以使用其它编程语言来解析生成。JSON的特点是数据结构简单清晰,易于读写,同时也易于机器解析和生成。 JSON在Python中的操作 Py…

    html 2023年5月30日
    00
  • Django 视图层(view)的使用

    下面我就为您详细讲解Django视图层(view)的使用攻略。 一、什么是Django视图层? Django的视图层就是处理HTTP请求并返回HTTP响应的地方。视图层是Django中最核心的组件之一,它用于实现业务逻辑和处理用户请求,同时可以直接和数据库交互。 二、视图层的基本结构 Django的视图层的一般结构包括: from django.shortc…

    html 2023年5月30日
    00
  • PHP截取汉字乱码问题解决方法mb_substr函数的应用

    下面是详细的“PHP截取汉字乱码问题解决方法mb_substr函数的应用”的攻略: 1. 问题背景 在使用PHP编写网页或者应用时,经常需要对字符串进行截取。但是对于包含中文字符的字符串,采用普通的截取方法会导致乱码的问题。这时可以使用PHP内置函数mb_substr()来解决这个问题。 2. mb_substr函数 mb_substr()函数是PHP中专门…

    html 2023年5月31日
    00
  • Win11打开软件出现乱码怎么办? Win11系统出现乱码的解决办法

    当Win11系统打开软件时出现乱码,可以按照以下步骤进行解决: 1. 修改系统语言 Win11系统默认的语言设置会影响软件的界面显示,如果系统语言设置不正确,便会出现乱码的情况。因此,建议修改Win11系统语言为正确的语言。 点击“开始菜单”,选择“设置”。 选择“时间和语言”,选择“区域与语言”。 选择“首选语言”,添加或选择正确的语言,将其设为默认语言。…

    html 2023年5月31日
    00
  • HTML基础知识——css样式表,样式属性,格式与布局详解

    HTML基础知识——CSS样式表、样式属性、格式与布局详解 CSS样式表 CSS(Cascading Style Sheets),即层叠样式表,是一种用来描述文档(特别是网页)样式的语言。CSS样式表通常包含一系列的规则(rules),每个规则由一个选择器和一组样式属性构成。 以下是一个简单的CSS规则: h1 { color: red; font-size…

    html 2023年5月30日
    00
  • 麒麟9010怎么样 麒麟9010详细介绍

    以下是关于麒麟9010的详细介绍: 麒麟9010的概述 麒麟9010是华为公司推出的一款高端移动处理器,采用7nm工艺制造,拥有高性能和低功耗的特点。该处理器采用了三星的M4架构和Cortex-A55架构,配备了Mali-G76 GPU,支持5G网络和Wi-Fi 6技术,具有出色的图形处理和网络连接能力。 麒麟9010的性能 麒麟9010处理器的主频高达2.…

    html 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部