searchreplace

功能:查找和替换

代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plugin.js

结构

界面的注册还是editor.addMenuItem和editor.addButton。(plugin.js 370-385)。不过入口的形式与前几节的有稍许的变化:

他把界面注册部分放到了Plugin函数的init函数内部了:

这里推测:tinymce.PluginManager.add函数会自动执行绑定的函数的init函数。

界面部分(弹框)

关于窗口创建部分,以后不要使用这种方式进行创建(tinymce.ui.Factory.create)。推荐使用: https://www.tiny.cloud/docs/ui-components/。 关于参数部分的设置,有空再写。

源码部分:

思想:

查找部分:

1、点击查找,先查找一遍,并把查找到的内容进行灰底标记,并标记上这是第几个查找到的元素。并高亮第一个找到的

2、然后再点击查找,相当于点击‘’下一个‘’,高亮下一个找到的。由于第一步已经标记过了,所以这一步直接选择全部标记成灰底的,然后在这里面找下一个。

替换部分(逐个替换):

对当前高亮元素进行替换,然后把后面加灰底的匹配的index-1。(因为他们前面替换掉了一个元素)

1、3大块元素的处理

块级元素 blockElementsMap

 ADDRESS: {}
ARTICLE: {}
ASIDE: {}
BLOCKQUOTE: {}
CAPTION: {}
CENTER: {}
DATALIST: {}
DD: {}
DIR: {}
DIV: {}
DL: {}
DT: {}
FIELDSET: {}
FIGURE: {}
FOOTER: {}
FORM: {}
H1: {}
H2: {}
H3: {}
H4: {}
H5: {}
H6: {}
HEADER: {}
HGROUP: {}
HR: {}
ISINDEX: {}
LI: {}
MENU: {}
NAV: {}
NOSCRIPT: {}
OL: {}
OPTGROUP: {}
OPTION: {}
P: {}
PRE: {}
SECTION: {}
SELECT: {}
TABLE: {}
TBODY: {}
TD: {}
TFOOT: {}
TH: {}
THEAD: {}
TR: {}
UL: {}
address: {}
article: {}
aside: {}
blockquote: {}
caption: {}
center: {}
datalist: {}
dd: {}
dir: {}
div: {}
dl: {}
dt: {}
fieldset: {}
figure: {}
footer: {}
form: {}
h1: {}
h2: {}
h3: {}
h4: {}
h5: {}
h6: {}
header: {}
hgroup: {}
hr: {}
isindex: {}
li: {}
menu: {}
nav: {}
noscript: {}
ol: {}
optgroup: {}
option: {}
p: {}
pre: {}
section: {}
select: {}
table: {}
tbody: {}
td: {}
tfoot: {}
th: {}
thead: {}
tr: {}
ul: {}

内部文本不进行匹配的块级元素hiddenTextElementsMap

 AUDIO: {}
IFRAME: {}
NOSCRIPT: {}
OBJECT: {}
PRE: {}
SCRIPT: {}
STYLE: {}
TEXTAREA: {}
VIDEO: {}
audio: {}
iframe: {}
noscript: {}
object: {}
pre: {}
script: {}
style: {}
textarea: {}
video: {}

shortEndedElementsMap(自己翻译,就是表示闭合标签比较短的)

 AREA: {}
BASE: {}
BASEFONT: {}
BR: {}
COL: {}
EMBED: {}
FRAME: {}
HR: {}
IMG: {}
INPUT: {}
ISINDEX: {}
LINK: {}
META: {}
PARAM: {}
SOURCE: {}
TRACK: {}
WBR: {}
area: {}
base: {}
basefont: {}
br: {}
col: {}
embed: {}
frame: {}
hr: {}
img: {}
input: {}
isindex: {}
link: {}
meta: {}
param: {}
source: {}
track: {}
wbr: {}

2、Plugin.done部分

把加灰底的标记全部去掉,然后把高亮的部分(如果有,匹配到的)转化成选区(蓝底白字)。

值得学习的地方:

对选区加特定的marker (function genReplacer)、二段匹配。

这一部分的逻辑比较强悍、比较难阅读,结合我给的注释,然后在前端debug,逐步执行,便于理解。

tinymce原装插件源码分析(五)-searchreplace的更多相关文章

  1. tinymce原装插件源码分析(一)-hr

    tinymce简介 tinymce是一款能方便无限扩展的网页富文本编辑器. tinymce原装插件已经十分丰富,对于文本编辑(blog等文章)是绰绰有余,但是应对一些复杂的应用,比如在上面开发html ...

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

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

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

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

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

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

  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. Vue系列---理解Vue.nextTick使用及源码分析(五)

    _ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...

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

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

  9. ABP源码分析五:ABP初始化全过程

    ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下. 为个更清楚的描述其脉络,做了张流程图以辅助说明.其中每一步都涉及很多细节,难以在一张图中全部表现出来.每一步的细节(会涉及到较多接口,类 ...

随机推荐

  1. MySQL的几个重要配置参数详解

    .配置通用查询日志,需要在配置文件my.cnf中增加如下: () 在mysql的安装目录下,修改my.cnf配置文件,增加general_log = () 重启mysql,可执行命令/etc/init ...

  2. echart的tooltip自定义换行

    自定义换行,内容很长的时候 tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type : 'shadow' // 默认为直 ...

  3. (翻译) Inheritance and the prototype chain 继承和原型链

    JavaScript is a bit confusing for developers experienced in class-based languages (like Java or C++) ...

  4. [HDU1160]FatMouse's Speed

    题目大意:读入一些数(每行读入$w[i],s[i]$为一组数),要求找到一个最长的序列,使得符合$w[m[1]] < w[m[2]] < ... < w[m[n]]$且$s[m[1] ...

  5. 浅谈 Qt 布局那些事

    Qt 布局那些事是本文介绍的内容,直接进入主题.GridLayout是一个非常强大的布局管理器,它可以实现很多复杂的布局,名字中暗示它将所有控件放置在类似网格的布局中.^__^GridLayout有两 ...

  6. 小学生绞尽脑汁也学不会的python(反射)

    小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...

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

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

  8. 史上最全: svn与git的对照(二):svn与git的相关概念

    如图1是svnserver端数据的文件夹结构 以下是gitserver端的文件夹结构 纵观svn和git服务端的文件夹结构我们非常easy发现 1.有些目录还是蛮像的.甚至是一样的比方说svn中的co ...

  9. selenium的报错信息:selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted

    报错信息:selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class ...

  10. 具体解释XML解析(一)—解析接口浅析

    在DRP项目中接触到了一个XML解析工具DOM4J,它作为解析工具的据说性能很优秀.可是刚刚接触解析工具不久,而且也没有使用过其它的解析工具.因此对于DOM4J的性能没有直接的感受(没有參照物).只是 ...