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. codeforces 277 A Learning Languages 【DFS 】

    n个人,每个人会一些语言,两个人只要有会一门相同的语言就可以交流,问为了让这n个人都交流,至少还得学多少门语言 先根据n个人之间他们会的语言,建边 再dfs找出有多少个联通块ans,再加ans-1条边 ...

  2. 使用layer.tips实现鼠标悬浮时触发事件提示消息实现

    代码: <body> <label id="test" onmouseover="show('test')"> 你瞅啥!?过来试试! & ...

  3. Java基础之Colloction

    0 引言 以下是介绍Java有关集合类,以及对应每个类的用途,同时进行比较集合类的不同特点来让我们深入了解. 1 Collction接口 Collection是最基本的集合接口,一个Collectio ...

  4. Python_study_day_1_while_if

    1.什么是计算机 cpu:大脑 3GHz 内存:缓冲硬盘和cpu,提高计算机运算速度 硬盘:存储数据 2.编程语言的简单分类 编译型,解释型,混合型 3.python是什么编程语言 解释类语言 //. ...

  5. phpstorm中,光标变成一个长方红色块,如何调回来?

    今天使用phpstorm,不知道碰到了什么,光标变成长方红色块(如图),搞半天终于调回来了,变回了细细的竖线,记录一下: 其实按一下insert键就可以了

  6. markdown图片设置

    工具:typora 1. 设置图片大小(本节引用自 https://support.typora.io/Resize-Image/) Typora允许使用<img>标签显示图像,也可用于调 ...

  7. centos7下部署Redis

    1.1. Redis的安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上 ...

  8. JS深拷贝拷贝的区别?

    拷贝拷贝引用,共享内存 深拷贝拷贝实例,不共享内存   1. 浅拷贝:当一个对象拷贝另一个对象的数据时,只要一个对象的数据发生改变时,另一个对象的数据也会发生改变,因为浅拷贝拷贝的是引用的地址 实现方 ...

  9. 【codeforces 768F】Barrels and boxes

    [题目链接]:http://codeforces.com/problemset/problem/768/F [题意] 让你把f个food和w个wine装在若干个栈里面; 每个栈只能装food或者是wi ...

  10. 洛谷 P3507 [POI2010]GRA-The Minima Game

    P3507 [POI2010]GRA-The Minima Game 题目描述 Alice and Bob learned the minima game, which they like very ...