如果还不会安装的话可以看第一篇:https://blog.csdn.net/oldpubcat/article/details/105518980

写一个完善插件看这:https://blog.csdn.net/oldpubcat/article/details/105519096

1、使用原生插件

首先我们先来说一下怎么用原生插件,CKEditor把原生的各种插件也都抽离出来了,减少了包的体积但是当代码用的多的时候可能要加载特别多的包,这个可以去使用他在线打包的那个工具,前面一篇文章也有说,其次就自定义安装加载了,需要什么加载什么的,我这边用NPM安装其他插件。

这里使用horizontal-line插件示例,这里假定你已经安装并成功运行了一个最简单的CKEditor项目。

首先安装它npm install --save @ckeditor/ckeditor5-horizontal-lin

然后在app.js里加载import HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline';

加载完之后注册到plugins里面

ClassicEditor.create(document.querySelector('#editor'), {// .... 其他配置plugins: [HorizontalLine],toolbar: ['HorizontalLine']})// 创建成功的回调.then(editor => {// to do sth..}).catch(error => {console.error(error.stack);});

2、创建插件

创建一个很简单的插件作为实例,官网也有对应的实例:https://ckeditor.com/docs/ckeditor5/latest/framework/guides/creating-simple-plugin.html

我这里就不用这个了。

插件基本上就是生成下面的结构

<div class="testEdit"><span class="edit">编辑</span><span class="delete">删除</span>
</div>

2.1 创建插件的基础

CKEditor创建插件要求尽量低耦合,然后文件管理可以一个文件也可以多个模块组合成一个插件,我这里就用多个模块来处理了。

具体代码的意义我会在注释里加上

在根目录创建一个block文件夹,一般来说需要4个模块,第一个是入口文件。

// block/block.js
import blockedit from './blockedit'
import blockui from './blockui'
// 插件类,创建插件必须基于这个类扩展
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
// 实例化一个类,然后导出
export default class Block extends Plugin{static get requires() {return [blocked, blockui];}
}

第二个是用来定义架构的文件,CKEditor创建元素需要先在代码里注册好架构模型,然后调用命令去生成元素,而不是直接插入一段HTML。

// block/blockedit.js
// 插件类,需要基于这个扩展
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
// 在这个文件里面创建命令
import command from './blockcommad.js';export default class Blockedit extends Plugin {init() {// 定义架构的方法  规定元素的属性,这个属性不是HTML的属性,是CKEditor内使用的this._defineSchema();// 定义转换器  转换器是生成HTML元素的地方  将定义的模型生成HTML结构this._defineConverters();// 绑定一个事件 blockthis.editor.commands.add('block', new command(this.editor));}// 具体参数看文档: https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_model_schema-Schema.html_defineSchema(){const schema = this.editor.model.schema;// 创建一个模型,名字是 testEditschema.register('testEdit', {// 是否为一个完整的对象,不可被回车拆分,意思是回车等行为都是在它自身容器内进行isObject: true,// 要求字符串或数组字符串,可以从其他地方继承allowWhere: '$block',})schema.register('edit', {isLimit: true,// 在哪个地方使用allowIn: 'testEdit',// 设置改节点是块还是根,根可以回车allowContentOf: '$block'});schema.register('delete', {isLimit: true,allowIn: 'testEdit', // 设置改节点是块还是根,根可以回车allowContentOf: '$block'});}// 文档:https://ckeditor.com/docs/ckeditor5/latest/api/module_editor-classic_classiceditor-ClassicEditor.html#member-conversion_defineConverters(){const conversion = this.editor.conversion;// 定义转换器  testEdit模型转换成视图  -> <div class="testEdit"></div>conversion.elementToElement({model: 'testEdit',view: {name: 'div',classes: 'testEdit'}});// 这些同理conversion.elementToElement({model: 'edit',view: {name: 'button',classes: 'edit'}});conversion.elementToElement({model: 'delete',view: {name: 'button',classes: 'delete'}});}
}

关于CSS,CSS是需要额外挂载到HTML上的,这里定义类名。也可以在block/blockedit.js里面import './css.css'

第三个文件UI文件,也是创建按钮的文件

import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview';
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';// 这个模块是用来监听 click的
import ClickObserver from '@ckeditor/ckeditor5-engine/src/view/observer/clickobserver';
export default class BoxUI extends Plugin {init() {console.log('UI#init() got called');const editor = this.editor;const t = editor.t;// “block”按钮必须在编辑器的UI组件中注册// 将显示在工具栏中。editor.ui.componentFactory.add('block', locale => {const view = editor.editing.view;const command = editor.commands.get('block');// 使用模块view.addObserver(ClickObserver);const buttonView = new ButtonView(locale);// 文档:https://ckeditor.com/docs/ckeditor5/latest/api/module_ui_button_buttonview-ButtonView.htmlbuttonView.set({// 返回一段文字,用作label,当没有ICON的时候显示Babellabel: t('insert block'),withText: true,tooltip: true});// 将按钮的状态绑定到命令。buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');// 单击(执行)按钮时执行命令。this.listenTo(buttonView, 'execute', () => editor.execute('block'));return buttonView;});}
}

第四个文件就是注册命令的文件了

// block/blockcommad.js
import Command from '@ckeditor/ckeditor5-core/src/command';
import Command from '@ckeditor/ckeditor5-core/src/command';export default class InsertSimpleBoxCommand extends Command {// 执行命令会调这个函数execute() {this.editor.model.change(writer => {// 模型里面插入// 文档:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_model_model-Model.htmlthis.editor.model.insertContent(createSimpleBox(writer));});}// 关于这个事件和上面事件或更多,查看文档:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_model_documentselection-DocumentSelection.htmlrefresh() {const model = this.editor.model;const selection = model.document.selection;const allowedIn = model.schema.findAllowedParent(selection.getFirstPosition(), 'testEdit');this.isEnabled = allowedIn !== null;}
}function createSimpleBox(writer) {const testEdit = writer.createElement('testEdit');const edit = writer.createElement('edit');writer.insertText('编辑', writer.createPositionAt(edit, 0));const deleteEl = writer.createElement('delete');writer.insertText('删除', writer.createPositionAt(deleteEl, 0));writer.append(edit, testEdit);writer.append(deleteEl, testEdit);return testEdit;
}

2.2 使用

文件都创建好我们去使用它

// app.js// ... 假装这里有很多其他的引用import Block  from './block/block.js'ClassicEditor.create(document.querySelector('#editor'), {plugins: [ HorizontalLine, Block],toolbar: ['HorizontalLine', 'Block']})// 创建成功的回调.then(editor => {// ...// 监听模块的点击事件editor.editing.view.document.on('click', (evt, data) => {if (data.domTarget.className == 'edit'){// to do something}});}).catch(error => {console.error(error.stack);});

3、在外部调用命令

如果想在外面加一个按钮执行上面的命令,插入该组件的话可以定义一个全局变量存放CKEditor实例

// app.js
let myeditor = null;ClassicEditor.create(document.querySelector('#editor'), {})// 创建成功的回调.then(editor => {myeditor = editor;}).catch(error => {console.error(error.stack);});// 在其他地方使用
document.getElementById('insertBlock').addEventListener('click', (evt, data) => {myeditor.execute('block');
})

如果对你有帮助,那我很开心。

CKEditor5系列二:创建简单插件相关推荐

  1. [VSTO系列]二、简单的UI设计/QQ联系人导出(上)

    接上一篇:http://www.cnblogs.com/longqi293/archive/2010/12/08/vstoforexcel1.html 在日常的生活中,QQ已经是联系我们人际关系的一条 ...

  2. H2教程系列(二) 创建数据库

    H2教程系列文章目录 第一章 H2入门之简介与安装 第二章 H2入门之创建数据库 创建数据库 目录 H2教程系列文章目录 一.创建数据库 二.验证效果 一.创建数据库 打开命令行 进入H2安装目录的b ...

  3. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  4. Git学习系列(二)创建本地仓库及文件操作

    2019独角兽企业重金招聘Python工程师标准>>> 仓库(repository ),我们也成它为版本库.这个库里面的所有文件(包括对文件的添加.删除.修改等操作)都被Git管理起 ...

  5. CKEditor5系列一:安装及使用

    1.使用 官网:https://ckeditor.com/ckeditor-5/ 如果要直接使用官方版本,不自己做扩展只是简单使用的话可以使用在线构建,选择你喜欢的功能然后构建,直接下载使用就好了. ...

  6. 《Abaqus GUI程序开发指南(Python语言)》——第一章 概述1.1 简单插件实例——创建带孔板有限元模型...

    本节书摘来自异步社区<Abaqus GUI程序开发指南(Python语言)>一书中的第1章,第1.1节,作者: 贾利勇 , 富琛阳子 , 贺高 , 周正光 更多章节内容可以访问云栖社区&q ...

  7. 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式(转载)

    源地址:http://doc.chinaunix.net/python/200703/202210.shtml 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式 ...

  8. Kafka与Spark集成系列二Spark的安装及简单应用

    原 [Kafka与Spark集成系列二] Spark的安装及简单应用https://blog.csdn.net/u013256816/article/details/82082019版权声明:本文为博 ...

  9. WF4.0入门系列1——创建一个简单的工作流

    WF4.0入门系列1--创建一个简单的工作流 打开VS2010,选择文件-新建-项目,选择Workflow项 工作流台应用程序,在名称处输入chapter01,选择合适的位置,这里默认,单击确定. V ...

  10. 前端必知必会HTTP请求系列(二)简单一点的HTTP协议

    http协议用户客户端和服务器之间的通信 http协议和TCP/IP协议族内的其他众多协议相同,用于客户端和服务器之间的通信. 那么问题来个如果两台服务器之间一台服务器向另一台服务器进行接口请求那谁是 ...

最新文章

  1. php goto call,Php中的goto用法
  2. (十)Centos之文件搜索命令find
  3. Java异步执行多个HTTP请求的例子(需要apache http类库)
  4. 多个openstack合并成一个openstack的多个region
  5. Cisco配置单臂路由及静态路由
  6. OSPF简单多区域及末梢区域配置
  7. dataframe保存为txt_竟然可以用 Python 抓取公号文章保存成 PDF
  8. 解析Winndows 2000/XP物理内存管理
  9. linux shell中的case语句用法 以及 case default设置
  10. 判断一个树是否是平衡二叉树
  11. 黑马vue实战项目-(七)订单管理页面的开发
  12. mongodb用户信息管理案例
  13. 迷你屏+OLED好屏:个性专业两手抓 华硕灵耀X 14专业好屏体验
  14. U盘文件被隐藏后的修复方法
  15. 小程序:npm下载使用weiui
  16. 计算机分子模拟聚乙烯,高分子物理实验思考题@中科大.pdf
  17. 车牌识别定位 matlab基本方法和操作
  18. 回复犹豫的实习生——走好脚下,心怀未来
  19. android-5.0新功能介绍(Lollipop)
  20. linux 上端口占用的程序

热门文章

  1. 苹果专用视频播放器Elmedia Video Player pro
  2. Java地图坐标转换
  3. 图样图森破:认识WiFi以后
  4. acer switch 10 linux,acer switch 10好不好
  5. 会计未来十年发展趋势_谈未来十年会计行业的发展趋势
  6. 力矩目标值 fTorque计算(伺服力矩控制模式)
  7. python求n的阶乘_python计算n的阶乘的方法代码
  8. 弹性云服务器是什么意思?弹性体现在哪里
  9. IDEA中进行spring项目开发配置文件中如何导入spring命名空间
  10. 抖音多闪背后的AI和社交