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. ICMPv6和IPv6 NDP

    1. ICMPv6 IPV4使用ICMP做很多事情,诸如目的地不可达等错误消息以及ping和traceroute等诊断功能.ICMPv6也提供了这些功能,但不同的是,它不是独立的第3层协议.ICMPV ...

  2. WiFi无线连接过程中有哪几个主要步骤?

    WiFi无线连接过程中有哪几个主要步骤?[1]在使用WIFI功能时,经常性的操作是打开手机上的WiFi设备,搜索到心目中的热点,输入密码,联网成功,成功上网.这个看似简单的过程,背后却是隐藏着大量的无 ...

  3. codecademy练习记录--Learn Python(70%)

    ############################################################################### codecademy python 5. ...

  4. postgressql sql查询拼接多个字段为一个字段查询出来

    表年份 月份 数据1 数据22000 1 1 12000 2 2 12001 2 2 2 2001 5 5 4 希望的查询结果如下所示: 时间 数据1 数据22000年1月 1 12000年2月 2 ...

  5. HDU 1047 Integer Inquiry( 高精度加法水 )

    链接:传送门 思路:高精度水题 /************************************************************************* > File ...

  6. Memcached的实战笔记

    官网:http://memcached.org/ 优秀Blogs: http://blog.csdn.net/jingqiang521/article/details/48345021 开启telne ...

  7. 关于fromkeys的用法

    分享一个小知识点: 1. Python 中关于dict的fromkeys方法: 1. fromkeys是用于重构字典 2. 至少传一个参数,第一个参数为新建dict的key,如果第一个参数为字典,那么 ...

  8. 排序代码(python,c++) 及 基本算法复杂度

    0.导语 本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法: 直接插入排序 冒泡排序 选择排序 快速排序 希尔排序 堆排序 归并排序 1.直接插入排序 [算法思想] 每一步将一 ...

  9. html页面的简单对话框(alert, confirm, prompt)

    html页面简单的三种对话框例如以下: 1.alert(),最简单的提示框: alert("你好!"); 2.confirm(),有确认和取消两个button: if(confir ...

  10. bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)

    2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...