tinymce原装插件源码分析(一)-hr
tinymce简介
tinymce是一款能方便无限扩展的网页富文本编辑器。
tinymce原装插件已经十分丰富,对于文本编辑(blog等文章)是绰绰有余,但是应对一些复杂的应用,比如在上面开发html网页等,还是有些捉襟见肘。
鉴于,网上关于tinymce的文章都是基于简单使用,而关于插件编写等,一概搜不到。 本系列文章就tinymce一个较老的版本(4.2.8 (2015-xx-xx))进行分析。js源码见: https://github.com/xunhanliu/static/tree/master/js/tinymce .
插件位于plugins目录下。关于plugin.js文件的加载。见: tinymce.js L:33446, 这两行就是如果找到了相应的plugin.min.js就加载plugin.js(原版是加载plugin.min.js,这里为了调试,让它加载了plugin.js)
注:注释或文中 tinymce.js L:20582或者 L:20582的形式都表示在tinymce.js的行号。
插件 hr
tinymce.PluginManager.add('hr', function(editor) { //如果配置中plugins参数填有hr,就执行这句话,进行加载hr插件。
editor.addCommand('InsertHorizontalRule', function() { //这里tinymce进行添加命令的解析。注 tinymce.js L:20582行已经有这个命令的解析,所以这个函数可加可不加
editor.execCommand('mceInsertContent', false, '<hr />'); //这个函数是执行插入命令,在选择位置处插入'<hr />'并删除选择的内容,或者在光标位置进行插入。
});
editor.addButton('hr', { //L31952: Adds a button that later gets created by the theme in the editors toolbars.
//也就是这里的配置在toolbars中展示的样子,及触发的命令
icon: 'hr',
tooltip: 'Horizontal line',
cmd: 'InsertHorizontalRule'
});
editor.addMenuItem('hr', {//这里配置它在菜单中的样子及,它的位置载 insert子菜单下。
icon: 'hr',
text: 'Horizontal line',
cmd: 'InsertHorizontalRule',
context: 'insert'
});
});
mceInsertContent命令简单解读
上文L:3中涉及到一个核心命令mceInsertContent(在光标处插入特定的内容)见L:20268。
这里省略了n行(这一部分都是关于代码健壮性判断)。。。

常识:selection是与用鼠标刷选字体(蓝底白字)有关。selection.isCollapsed() 只放置光标不选择,会返回true。

这里把hr和marker(span)组装起来,生成可跌迭代的树结构,类似于dom结构。
parser.parse 函数定义在 L; 12081位置处。其中核心部分:

此函数的第二个参数部分需要是包含内容的父标签。
1、serializer.serialize是parser.parse的逆运算
2、parser结构的遍历的一个例子:L20411~L20423
node = fragment.lastChild;
if (node.attr('id') == 'mce_marker') {
marker = node; for (node = node.prev; node; node = node.walk(true)) {
if (node.type == 3 || !dom.isBlock(node.name)) {
if (editor.schema.isValidChild(node.parent.name, 'span')) {
node.parent.insert(marker, node, node.name === 'br');
}
break;
}
}
}
这里为什么加了额外加一个’<span id="mce_marker" data-mce-type="bookmark"></span>‘ ?
是为了把视图滚动到当前的光标的位置。

涉及到的命令:
mceInsertContent、Delete (删除选择的部分)
涉及到的核心函数:
selection、editor.parser、new Serializer
tinymce原装插件源码分析(一)-hr的更多相关文章
- tinymce原装插件源码分析(五)-searchreplace
searchreplace 功能:查找和替换 代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plug ...
- tinymce原装插件源码分析(二)-link
link 功能描述如下: 单纯放置光标: 1.如果光标放到了<a>上,读取a标签的内容,并弹框显示,确定的时候,更新当前a标签. 2.否则,就创建弹框,确定的时候,按照参数添加a标签. s ...
- tinymce原装插件源码分析(四)-fullscreen
fullscreen 作为一款文本编辑器,全屏功能是非常有必要的.在插件中主要是修改一些css style和触发resize事件. style问题(反例): 见github源码:https://git ...
- tinymce原装插件源码分析(三)-code
code: 用于显示源码.主要包含一个弹框.设置显示内容以及内容的更新. function showDialog() { var win = editor.windowManager.open({ t ...
- tinymce原装插件源码分析(七)-使能css、script
在tinymce中使用css个script tinymce的编辑器中css和script默认是不起作用的.(编辑器主要面向写文章使用,考虑到xss攻击,默认是不启用的) 需要修改tinymce.js中 ...
- tinymce原装插件源码分析(六)-preview
priview 此插件文件结构比较简单,按钮注册.editor.windowManager.open.窗口出现之前的渲染数据的准备.页面代码的准备. 注意: 1.preview的默认宽高设置: 2.c ...
- Mybatis源码学习第七天(插件源码分析)
为了不把开发和源码分析混淆,决定分开写; 接下来分析一下插件的源码,说道这里老套路先说一个设计模式,他就是责任链模式 责任链模式:就是把一件工作分别经过链上的各个节点,让这些节点依次处理这个工作,和装 ...
- 【前端必会】不知道webpack插件? webpack插件源码分析BannerPlugin
背景 不知道webpack插件是怎么回事,除了官方的文档外,还有一个很直观的方式,就是看源码. 看源码是一个挖宝的行动,也是一次冒险,我们可以找一些代码量不是很大的源码 比如webpack插件,我们就 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
随机推荐
- github踩坑之git命令收集与整理(windows)
最近开始又捡起git,第一家公司用的就是git,一直掌握的也不深刻,就知道常用的几个命令,虽然现在用svn,但是觉得git还是不能丢,遂又捡起来了.先总结一部分目前练习用到的,慢慢填补吧~ githu ...
- Guitar Pro中文版下载,你想要的,都在这啦!
我的音乐我做主!Guitar Pro7中文版的发布为更多音乐爱好者带来更多更优质的体验!为帮助所有吉他爱好者学习.绘谱.创作而设计的音乐空间!为前所未有的音乐盛听而震撼,音乐才子,等的就是你! Gui ...
- JS判断客户端是否是iOS或者Android或者ipad(三)
* * @function: 判断浏览器类型是否是Safari.Firefox.ie.chrome浏览器 * @return: true或false * */ function isSafa ...
- Day01-04学习内容总结
学习内容小结 1.什么是编程,编程有什么用,什么是编程语言 2.计算的组成原理及组成部分 3.机械硬盘的工作原理 4.什么是操作系统,操作系统做了什么,为什么要有操作系统,操作系统有什么用 5.应用程 ...
- python链接mysql数据库
1.安装pycharm python3.6 pip 在windows+R cmd where pip pip install mysql-client 如何看自已mysql-client有没有 ...
- v-model指令后面跟的参数(number、lazy、debounce)
1. number 想将用户的输入自动转换为Number类型(如果原值的转换结果为NaN, 则返回原值) 2. lazy 在默认情况下, v-model在input事件中同步输入框的值和数据, 我们可 ...
- Shiro:初识Shiro及简单尝试
Shiro 一.什么是Shiro Apache Shiro是Java的一个安全(权限)框架 作用:认证.授权.加密.会话管理.与web集成.缓存等 下载地址:http://shiro.apache.o ...
- Vue父子组件之间的通讯(学习笔记)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sql删除注意的问题
老大骂你都是有原因的,基础要打好!!!! SQL关于删除的三个语句:DROP.TRUNCATE. DELETE 的区别. DROP test; 删除表test,并释放空间,将test表删除的一干二净 ...
- SQL SERVER-identity | @@identity | scope_identity
主键自增 IDENTITY(1,1),MS SQL Server 使用 IDENTITY 关键字来执行 auto-increment 任务. 在上面的实例中,IDENTITY 的开始值是 1,每条新记 ...