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

yizhihongxing

下面我来详细讲解一下使用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是什么文件格式?.java文件怎么打开?

    java是什么文件格式?.java文件怎么打开? Java是一种编程语言,它的源代码文件通常以.java为扩展名。以下是关于如何打开.java文件的攻略,包括以下几个步骤: 步骤1:安装Java开发工具包 在打开.java文件之前,您需要安装Java开发工具包(JDK)。以下是安装JDK的步骤: 打开Java官方网站。 下载适用于您的操作系统的JDK。 双击…

    html 2023年5月17日
    00
  • Mybatis全局配置及映射关系的实现

    下面我将就“Mybatis全局配置及映射关系的实现”的完整攻略进行详细讲解。 1. 全局配置 1.1. 配置文件 在Mybatis中,全局配置是通过mybatis-config.xml文件来管理的,具体的配置内容包括: properties:定义全局属性,类似于Java的System.getProperties()方法。 settings:定义Mybatis…

    html 2023年5月30日
    00
  • javascript解析xml字符串的函数

    这里介绍两种JavaScript解析XML字符串的函数: 使用DOMParser 步骤: 创建一个XML字符串变量 建立一个DOMParser对象 将XML字符串传递给DOMParser对象的parseFromString方法 执行XPath选择器 示例代码: const xmlString = `<bookstore> <book cat…

    html 2023年5月30日
    00
  • 通过syntaxhighlight实现帝国cms代码高亮/语法高亮(一)

    我来分享一下“通过syntaxhighlight实现帝国cms代码高亮/语法高亮(一)”的完整攻略。 1. 什么是代码高亮/语法高亮 代码高亮/语法高亮是在文本编辑器、IDE或网页中以不同颜色和字体显示关键代码的技术。如此一来,代码看起来更易读、易懂。在很多编程语言中,编辑器都会对代码进行高亮处理,这样的话程序员就可以快速而准确的发现代码中的问题,以及追踪程…

    html 2023年5月30日
    00
  • QQ邮箱SMTP服务怎么开通?qq邮箱开启smtp服务图文教程

    以下是关于如何开通QQ邮箱SMTP服务的攻略: QQ邮箱SMTP服务怎么开通? SMTP是一种邮件传输协议,用于发送邮件。如果您需要使用QQ邮箱发送邮件,可以按照以下步骤开通QQ邮箱SMTP服务: 登录QQ邮箱:首先,登录您的QQ邮箱账号。 进入设置页面:在QQ邮箱页面中,点击右上角的“设置”按钮,选择“设置选项”。 进入账户页面:在设置页面中,选择“账户”…

    html 2023年5月17日
    00
  • 解决VuePress页面乱码问题

    下面是解决VuePress页面乱码问题的完整攻略: 问题背景 在使用VuePress时,可能会遇到中文显示乱码的问题。这是由于VuePress默认的编码为UTF-8,而网页在浏览器中的编码可能为其他编码格式,导致中文字符无法正常显示的情况。 解决方案 方案一:设置VuePress的编码格式 可以在VuePress的配置文件中指定网站的编码格式为UTF-8,代…

    html 2023年5月31日
    00
  • 深入XPath的详解以及Java示例代码分析

    深入XPath的详解以及Java示例代码分析 什么是XPath? XPath(XML路径语言)是XML文档的查询语言,可以用来在XML中定位和选择数据。XPath通过路径表达式来选取XML文档中的节点或节点集,这些路径表达式类似于在文件系统中的目录路径。XPath是一种非常强大的查询语言,可以快速高效地从海量的XML文档中查找所需的信息。 XPath的基本数…

    html 2023年5月30日
    00
  • 用ASP读取XML文件的具体方法与示例

    下面是用ASP读取XML文件的具体方法与示例的攻略。 一、前言 ASP(Active Server Pages)是一种动态网页开发技术,可用于创建功能强大的交互式web网站。其中读取XML文件是ASP应用中的一项常见需求,接下来我们将介绍如何用ASP读取XML文件。 二、读取XML文件的基本步骤 要使用ASP从XML文件中读取数据,需要按照以下基本步骤进行操…

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