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日

相关文章

  • java解析xml汇总_动力节点Java学院整理

    Java解析XML汇总攻略 在Java开发中,我们常常需要解析XML文件,从而获取其中的数据。下面是Java解析XML汇总攻略,包括DOM解析、SAX解析、JDOM解析和DOM4J解析。 DOM解析 DOM(Document Object Model)解析是一种基于节点树的解析方法,可以将XML解析为树形结构,并提供API来访问、修改XML数据。 Java提…

    html 2023年5月30日
    00
  • Python创建xml文件示例

    下面是Python创建XML文件的完整攻略,分为以下几个步骤: 1. 导入所需模块 使用Python创建XML文件需要导入xml.etree.ElementTree模块。 import xml.etree.ElementTree as ET 2. 创建根节点 首先,我们需要创建一个XML文档的根节点,可以使用ET.Element()方法实现,该方法会返回一个…

    html 2023年5月30日
    00
  • HTML5新增加标签和功能概述

    HTML5是在2008年发布的最新版本的HTML,它重点引入了许多新的标记、属性和API,以支持更多的功能和互动性操作,下面是HTML5新增加标签和功能概述的完整攻略: 新标签 HTML5引入了许多新的标记,以下是其中几个较为常用的: 1. header和footer header和footer标签分别用于表示文档或内容的页眉和页脚。其中,header通常用…

    html 2023年5月30日
    00
  • Spring AspectJ 实现AOP的方法你了解吗

    Spring框架提供了两种AOP的实现方式,其中一种是AspectJ的实现方式。AspectJ是一个基于Java语言的AOP的实现框架,使用静态的代码编译和动态的字节码编织来实现AOP。而Spring AspectJ是Spring框架对AspectJ框架进行的整合和封装,使用Spring框架可以更加方便地使用AspectJ来实现AOP。 下面,我们将详细讲解…

    html 2023年5月30日
    00
  • Mac系统新建TXT文档以及出现乱码的解决办法

    下面是详细讲解Mac系统新建TXT文档以及出现乱码的解决办法的攻略: 1. Mac系统新建TXT文档的方法 Mac系统中新建TXT文档有两种方法: 方法一:使用Finder 打开Finder; 在Finder的顶部菜单栏上选择文件 > 新建文件; 文件名后缀名为txt(例如”test.txt”),然后按下回车键; 双击文件名,即可在TextEdit中打…

    html 2023年5月31日
    00
  • CCT是什么币种?CCT币是碳交易货币吗?

    以下是“CCT是什么币种?CCT币是碳交易货币吗?”的完整攻略: CCT是什么币种?CCT币是碳交易货币吗? CCT是一种数字货币,全称为“CyberCTM”,是由CyberCTM Foundation发行的。CCT是基于区块链技术的数字货币,旨在为用户提供更快、更安全、更便捷的支付方式。CCT币不是碳交易货币,它与碳交易没有直接关系。 CCT的特点 CCT…

    html 2023年5月18日
    00
  • 完美解决Java获取文件路径出现乱码的问题

    针对Java获取文件路径出现乱码的问题,可以按照以下步骤来处理: 问题描述 首先需要明确问题。在Java中,使用一些API获取文件路径时,可能会出现路径中存在中文字符、特殊字符等造成乱码的情况,比如: File file = new File("C:/中文路径/test.txt"); String absolutePath = file.…

    html 2023年5月31日
    00
  • html5 input属性使用示例

    HTML5为我们带来了很多新的表单属性,这里将会分享一些常见的input属性使用示例,并且演示如何使用这些属性。 1. placeholder属性 这个属性定义一个控件的预期值的一个提示文本,即控件的内容/值的预期格式或值,但不必是尖括号、括号之类的限定符或完整的文本格式。实现方式如下: <input type="text" pla…

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