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. C++函数的高级特性——小结

    相对于C语言,C++增加了重载(overload).内联(inline).const和virtual四种新机制. 1 重载 只能靠参数列表而不能紧靠返回值类型的不同来区分重载函数.编译器根据参数列表为 ...

  2. Java回忆录之英勇黄铜V

    说实话最近心好累,就因为一个混合app开发贼简单的一个功能.我本以为很简单,做起来却发现需要很多知识面.麻雀虽小五脏俱全,即使再小的一个功能实现起来也需要很全面的知识来担保.要想盖高楼大厦啊必定要有坚 ...

  3. offscreen-render

    offscreen-render 什么是offscreen-render?offscreen-render涉及的内容比较多,有offscreen-render那就有onscreen render,on ...

  4. iOS系统结构

    应用交互层.多媒体层.核心服务层.系统层. 参考官方文档apple Develop GuidesiOS Technologies IOS分为四级结构,由上到下为可触摸层,媒体层,核心服务层,核心系统层 ...

  5. 史上最低,低到尘埃,CDR邀你一起嗨购618

    盼呀盼,望穿秋水~盼呀盼,何时降价~ 6.4开始,CDR X6全民狂欢618放价活动全面开启 力度之大,范围之广,时间之久,价格之低,都是前所未有的 不负众望,这个618,CDR真的做到一降到底,没有 ...

  6. 凸多边形 HRBUST - 1429 计算几何_凸包_未调完

    任选一个点作为起始点,将其他点按与该点连线的极角排序,二分查询点在哪两个射线之间, 并特别判断一下边界即可. Code: #include <cstdio> #include <al ...

  7. echarts的下载为excel小工具

    echarts自带有下载为图片的功能,但是没有下载为excel表格的功能,个人觉得下载为表格更为需要,所以写了个工具,此工具应用有局限性,只能用于柱形图和折线图,option的series要是如下形式 ...

  8. jq点击按钮打开和关闭弹出层,点击除了当前按钮以外的地方关闭弹出层

    1.html <a id="more" onclick="moreFun()">更多</a> <ul id="moreL ...

  9. what is udev?

    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...

  10. 硬核官宣:台积电官宣6nm及7nm加强版工艺!

    台积电正式宣布了6nm(N6)工艺,在已有7nm(N7)工艺的基础上大幅度增强,号称可提供极具竞争力的高性价比,而且能加速产品研发.量产.上市速度. 这几年,曾经执行业牛耳的Intel在新工艺方面进展 ...