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

  1. ADDRESS: {}
  2. ARTICLE: {}
  3. ASIDE: {}
  4. BLOCKQUOTE: {}
  5. CAPTION: {}
  6. CENTER: {}
  7. DATALIST: {}
  8. DD: {}
  9. DIR: {}
  10. DIV: {}
  11. DL: {}
  12. DT: {}
  13. FIELDSET: {}
  14. FIGURE: {}
  15. FOOTER: {}
  16. FORM: {}
  17. H1: {}
  18. H2: {}
  19. H3: {}
  20. H4: {}
  21. H5: {}
  22. H6: {}
  23. HEADER: {}
  24. HGROUP: {}
  25. HR: {}
  26. ISINDEX: {}
  27. LI: {}
  28. MENU: {}
  29. NAV: {}
  30. NOSCRIPT: {}
  31. OL: {}
  32. OPTGROUP: {}
  33. OPTION: {}
  34. P: {}
  35. PRE: {}
  36. SECTION: {}
  37. SELECT: {}
  38. TABLE: {}
  39. TBODY: {}
  40. TD: {}
  41. TFOOT: {}
  42. TH: {}
  43. THEAD: {}
  44. TR: {}
  45. UL: {}
  46. address: {}
  47. article: {}
  48. aside: {}
  49. blockquote: {}
  50. caption: {}
  51. center: {}
  52. datalist: {}
  53. dd: {}
  54. dir: {}
  55. div: {}
  56. dl: {}
  57. dt: {}
  58. fieldset: {}
  59. figure: {}
  60. footer: {}
  61. form: {}
  62. h1: {}
  63. h2: {}
  64. h3: {}
  65. h4: {}
  66. h5: {}
  67. h6: {}
  68. header: {}
  69. hgroup: {}
  70. hr: {}
  71. isindex: {}
  72. li: {}
  73. menu: {}
  74. nav: {}
  75. noscript: {}
  76. ol: {}
  77. optgroup: {}
  78. option: {}
  79. p: {}
  80. pre: {}
  81. section: {}
  82. select: {}
  83. table: {}
  84. tbody: {}
  85. td: {}
  86. tfoot: {}
  87. th: {}
  88. thead: {}
  89. tr: {}
  90. ul: {}

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

  1. AUDIO: {}
  2. IFRAME: {}
  3. NOSCRIPT: {}
  4. OBJECT: {}
  5. PRE: {}
  6. SCRIPT: {}
  7. STYLE: {}
  8. TEXTAREA: {}
  9. VIDEO: {}
  10. audio: {}
  11. iframe: {}
  12. noscript: {}
  13. object: {}
  14. pre: {}
  15. script: {}
  16. style: {}
  17. textarea: {}
  18. video: {}

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

  1. AREA: {}
  2. BASE: {}
  3. BASEFONT: {}
  4. BR: {}
  5. COL: {}
  6. EMBED: {}
  7. FRAME: {}
  8. HR: {}
  9. IMG: {}
  10. INPUT: {}
  11. ISINDEX: {}
  12. LINK: {}
  13. META: {}
  14. PARAM: {}
  15. SOURCE: {}
  16. TRACK: {}
  17. WBR: {}
  18. area: {}
  19. base: {}
  20. basefont: {}
  21. br: {}
  22. col: {}
  23. embed: {}
  24. frame: {}
  25. hr: {}
  26. img: {}
  27. input: {}
  28. isindex: {}
  29. link: {}
  30. meta: {}
  31. param: {}
  32. source: {}
  33. track: {}
  34. 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. Javescript 面向对象编程 — 封装

    生成实例对象的原始模式 <script type="text/javascript"> var Cat={ name:'波斯猫', color:'White' } al ...

  2. Unity 退出游戏 方法

    Application.Quit(); 嗯,没错,这篇就这么短.

  3. Debian下的内核编译

    如果你装了一台linux的机器,自己没有重新编译内核,那这台机器的效率就大打折扣了,因为默认安装的机器会生成许多不需要的东西,在启动的时候也会比较慢,而你要用的有些东西可能不能工作,比如,现在都把IP ...

  4. CF960F Pathwalks_权值线段树_LIS

    很不错的一道思维题. Code: #include<cstdio> #include<algorithm> #include<iostream> using nam ...

  5. jq——事件

    http://www.w3school.com.cn/jquery/jquery_ajax_intro.asp $(document),$(body) 加载事件: $(document).ready( ...

  6. ubuntu18.04crontab定时任务不执行

    环境介绍: 本人使用python写了一个自动化提交巡检的脚本放在服务器上,使用crontab去执行脚本的时候动作并没有执行,查看crontab日志时也不存在这个日志文件.如何如排查呢? 解决方案: 步 ...

  7. 【【henuacm2016级暑期训练】动态规划专题 H】Greenhouse Effect

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原题意等价于:给你一个序列(实数的位置没用!)..你可以改变其中某些元素的位置(插入到某些位置中间. 然后让他变成有序的. (有序的 ...

  8. ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  9. l洛谷 P2326 AKN’s PPAP

    P2326 AKN’s PPAP 题目描述 “I have a pen,I have an apple.Eh,Apple-Pen!. I have a pen,I have pineapple.En, ...

  10. [Angular] Handle HTTP Errors in Angular with HttpErrorResponse interface

    When communicating with some backend API, data travels over the network using the HTTP protocol. As ...