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. Mac Technology Overview

    [Mac Technology Overview]https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual ...

  2. mybatis中if及concat函数的使用

  3. JS优化代码

    JS代码的执行效率往往直接影响了页面的性能,有的时候,实现同样的功能,不同的JS代码往往在效率上相 差很多,有的时候仅仅是由于我们的书写习惯导致的,当然在高级点的浏览器中,它们大多都已经帮我们优化了, ...

  4. 注解实战aftersuite和beforesuite

    package com.course.testng;import org.testng.annotations.*; public class BasicAnnotation { //最基本的注解,用 ...

  5. Element源码阅读(1)

    一.目的 阅读element源码旨在了解其代码的组织架构模式, 代码编写的方式, 以及组件化的一些思路, 对照自己, 从而进步. 二. 源码阅读所得 1.在element源码中的mixins目录之下, ...

  6. 归档 SCP SFTP RSYNC(数据同步)

    tar 选项  目标文件  源文件(1 2 3) tar cf **.tar file1 file2 file3 (默认情况下 cf选项只有归档没有压缩) tar xf 从归档中提取 创建tar的存档 ...

  7. Proxifier安装与使用

    Proxifier安装与使用 1.Proxifier官网可能打不开,这是一个下载地址,提取码为p1l8. 用户名随意填 注册码下边 5EZ8G-C3WL5-B56YG-SCXM9-6QZAP G3ZC ...

  8. qml与c++混合编程

    QML 与 C++ 混合编程内容:1. QML 扩展2. C++ 与 QML 交互3. 开发时要尽量避免使用的 QML 元素4. demo 讲解5. QML 语法C++ 与 QML 的交互是通过注册 ...

  9. linux 上安装 redis

    一.安装gcc Redis是c语言开发的. 安装 redis 需要 c 语言的编译环境.如果没有 gcc 需要在线安装. yum install gcc-c++ 二.下载 redis 链接:https ...

  10. 百度语音识别服务 —— 语音识别 REST API 开发笔记

    http://blog.csdn.net/lw_power/article/details/51771267