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的更多相关文章

  1. tinymce原装插件源码分析(五)-searchreplace

    searchreplace 功能:查找和替换 代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plug ...

  2. tinymce原装插件源码分析(二)-link

    link 功能描述如下: 单纯放置光标: 1.如果光标放到了<a>上,读取a标签的内容,并弹框显示,确定的时候,更新当前a标签. 2.否则,就创建弹框,确定的时候,按照参数添加a标签. s ...

  3. tinymce原装插件源码分析(四)-fullscreen

    fullscreen 作为一款文本编辑器,全屏功能是非常有必要的.在插件中主要是修改一些css style和触发resize事件. style问题(反例): 见github源码:https://git ...

  4. tinymce原装插件源码分析(三)-code

    code: 用于显示源码.主要包含一个弹框.设置显示内容以及内容的更新. function showDialog() { var win = editor.windowManager.open({ t ...

  5. tinymce原装插件源码分析(七)-使能css、script

    在tinymce中使用css个script tinymce的编辑器中css和script默认是不起作用的.(编辑器主要面向写文章使用,考虑到xss攻击,默认是不启用的) 需要修改tinymce.js中 ...

  6. tinymce原装插件源码分析(六)-preview

    priview 此插件文件结构比较简单,按钮注册.editor.windowManager.open.窗口出现之前的渲染数据的准备.页面代码的准备. 注意: 1.preview的默认宽高设置: 2.c ...

  7. Mybatis源码学习第七天(插件源码分析)

    为了不把开发和源码分析混淆,决定分开写; 接下来分析一下插件的源码,说道这里老套路先说一个设计模式,他就是责任链模式 责任链模式:就是把一件工作分别经过链上的各个节点,让这些节点依次处理这个工作,和装 ...

  8. 【前端必会】不知道webpack插件? webpack插件源码分析BannerPlugin

    背景 不知道webpack插件是怎么回事,除了官方的文档外,还有一个很直观的方式,就是看源码. 看源码是一个挖宝的行动,也是一次冒险,我们可以找一些代码量不是很大的源码 比如webpack插件,我们就 ...

  9. Android Small插件化框架源码分析

    Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...

随机推荐

  1. APUE学习笔记5——信号、信号集和进程信号屏蔽字

    1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...

  2. ZBrush2018中文版全球同步发售,终身授权

    ZBrush 2018于2018.3.28发布了!这个我们期待已久的2018新版本等了几年,它终于来了! 不负众望,ZBrush 2018的这一次更新,简直炸裂,新功能真是太好用了!2018版是ZBr ...

  3. luogu P2584 [ZJOI2006]GameZ游戏排名系统 Splay

    实在不想调了QAQ... Code: #include <cstdio> #include <algorithm> #include <cstring> #incl ...

  4. HDU 1757 A Simple Math Problem( 矩阵快速幂 )

    <font color = red , size = '4'>下列图表转载自 efreet 链接:传送门 题意:给出递推关系,求 f(k) % m 的值, 思路: 因为 k<2 * ...

  5. BZOJ 1856 [SCOI2010]生成字符串 (组合数)

    题目大意:给你n个1和m个0,你要用这些数字组成一个长度为n+m的串,对于任意一个位置k,要保证前k个数字中1的数量大于等于0的数量,求所有合法的串的数量 答案转化为所有方案数-不合法方案数 所有方案 ...

  6. [学习笔记] CS131 Computer Vision: Foundations and Applications:Lecture 2 颜色和数学基础

    大纲 what is color? The result of interaction between physical light in the environment and our visual ...

  7. java中的接口中的方法

    题目如下:(多选题)请选择以下接口定义正确的方法() A:public static void main (String[] args); B:private void test(); C:publi ...

  8. 洛谷 1156 dp

    洛谷1156 dp 类背包问题 老久没有自己想出来过dp方程了,,,虽然到最后还是只写了30分,,, 设dp[j]表示最大生命值为i时的最大高度,则对于每个物品,可以选择吃掉或者放上去,即转移为dp[ ...

  9. ActiveMQ_Windows和Linux版本的安装部署

    1, 保证电脑上安装了jdk6以上版本的java,并配置了好环境变量 : 2, 官方下载地址:http://activemq.apache.org/download-archives.html ,这里 ...

  10. ajax 获取 json 数据乱码

    打开json文本把json文件另存为 'utf-8' 编码格式的文件.....