@richscripts/richtexteditor 2.14.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +173 -10
  2. package/angular/build-manifest.json +23 -0
  3. package/angular/index.d.ts +71 -76
  4. package/angular/index.mjs +2 -0
  5. package/angular/package.json +4 -0
  6. package/headless/index.d.ts +3 -1
  7. package/headless/index.js +72 -16
  8. package/index.d.ts +33 -54
  9. package/integrations/initialization-scope.js +27 -0
  10. package/integrations/native-mount.js +30 -0
  11. package/integrations/shared.d.ts +23 -1
  12. package/integrations/shared.js +58 -22
  13. package/package.json +25 -3
  14. package/react/index.js +118 -37
  15. package/react/index.mjs +29 -0
  16. package/richtexteditor/all_plugins.js +7113 -1111
  17. package/richtexteditor/all_plugins.min.js +62 -59
  18. package/richtexteditor/lang/emoji/LICENSE-CLDR.txt +41 -0
  19. package/richtexteditor/lang/emoji/rte-emoji-de.js +3 -0
  20. package/richtexteditor/lang/emoji/rte-emoji-es.js +3 -0
  21. package/richtexteditor/lang/emoji/rte-emoji-fr.js +3 -0
  22. package/richtexteditor/lang/emoji/rte-emoji-it.js +3 -0
  23. package/richtexteditor/lang/emoji/rte-emoji-ja.js +3 -0
  24. package/richtexteditor/lang/emoji/rte-emoji-ko.js +3 -0
  25. package/richtexteditor/lang/emoji/rte-emoji-nl.js +3 -0
  26. package/richtexteditor/lang/emoji/rte-emoji-pt-pt.js +3 -0
  27. package/richtexteditor/lang/emoji/rte-emoji-pt.js +3 -0
  28. package/richtexteditor/lang/emoji/rte-emoji-ru.js +3 -0
  29. package/richtexteditor/lang/emoji/rte-emoji-zh-Hans.js +3 -0
  30. package/richtexteditor/lang/emoji/rte-emoji-zh-Hant.js +3 -0
  31. package/richtexteditor/lang/rte-lang-af.js +1 -0
  32. package/richtexteditor/lang/rte-lang-ar.js +1 -0
  33. package/richtexteditor/lang/rte-lang-bg.js +1 -0
  34. package/richtexteditor/lang/rte-lang-bn.js +1 -0
  35. package/richtexteditor/lang/rte-lang-bs.js +1 -0
  36. package/richtexteditor/lang/rte-lang-ca.js +1 -0
  37. package/richtexteditor/lang/rte-lang-cs.js +1 -0
  38. package/richtexteditor/lang/rte-lang-cy.js +1 -0
  39. package/richtexteditor/lang/rte-lang-da.js +1 -0
  40. package/richtexteditor/lang/rte-lang-de.js +1017 -2
  41. package/richtexteditor/lang/rte-lang-el.js +1 -0
  42. package/richtexteditor/lang/rte-lang-en.js +1 -0
  43. package/richtexteditor/lang/rte-lang-es.js +1023 -2
  44. package/richtexteditor/lang/rte-lang-et.js +1 -0
  45. package/richtexteditor/lang/rte-lang-fa.js +1 -0
  46. package/richtexteditor/lang/rte-lang-fi.js +1 -0
  47. package/richtexteditor/lang/rte-lang-fil.js +1 -0
  48. package/richtexteditor/lang/rte-lang-fj.js +1 -0
  49. package/richtexteditor/lang/rte-lang-fr.js +1023 -2
  50. package/richtexteditor/lang/rte-lang-ga.js +1 -0
  51. package/richtexteditor/lang/rte-lang-gu.js +1 -0
  52. package/richtexteditor/lang/rte-lang-he.js +1 -0
  53. package/richtexteditor/lang/rte-lang-hi.js +1 -0
  54. package/richtexteditor/lang/rte-lang-hr.js +1 -0
  55. package/richtexteditor/lang/rte-lang-ht.js +1 -0
  56. package/richtexteditor/lang/rte-lang-hu.js +1 -0
  57. package/richtexteditor/lang/rte-lang-id.js +1 -0
  58. package/richtexteditor/lang/rte-lang-is.js +1 -0
  59. package/richtexteditor/lang/rte-lang-it.js +1023 -2
  60. package/richtexteditor/lang/rte-lang-ja.js +1023 -2
  61. package/richtexteditor/lang/rte-lang-kn.js +1 -0
  62. package/richtexteditor/lang/rte-lang-ko.js +1023 -2
  63. package/richtexteditor/lang/rte-lang-lt.js +1 -0
  64. package/richtexteditor/lang/rte-lang-lv.js +1 -0
  65. package/richtexteditor/lang/rte-lang-mg.js +1 -0
  66. package/richtexteditor/lang/rte-lang-mi.js +1 -0
  67. package/richtexteditor/lang/rte-lang-ml.js +1 -0
  68. package/richtexteditor/lang/rte-lang-mr.js +1 -0
  69. package/richtexteditor/lang/rte-lang-ms.js +1 -0
  70. package/richtexteditor/lang/rte-lang-mt.js +1 -0
  71. package/richtexteditor/lang/rte-lang-mww.js +1 -0
  72. package/richtexteditor/lang/rte-lang-nb.js +1 -0
  73. package/richtexteditor/lang/rte-lang-nl.js +1023 -2
  74. package/richtexteditor/lang/rte-lang-otq.js +1 -0
  75. package/richtexteditor/lang/rte-lang-pa.js +1 -0
  76. package/richtexteditor/lang/rte-lang-pl.js +1 -0
  77. package/richtexteditor/lang/rte-lang-pt-pt.js +1023 -2
  78. package/richtexteditor/lang/rte-lang-pt.js +1023 -2
  79. package/richtexteditor/lang/rte-lang-ro.js +1 -0
  80. package/richtexteditor/lang/rte-lang-ru.js +1023 -2
  81. package/richtexteditor/lang/rte-lang-sk.js +1 -0
  82. package/richtexteditor/lang/rte-lang-sl.js +1 -0
  83. package/richtexteditor/lang/rte-lang-sm.js +1 -0
  84. package/richtexteditor/lang/rte-lang-sr-Cyrl.js +1 -0
  85. package/richtexteditor/lang/rte-lang-sr-Latn.js +1 -0
  86. package/richtexteditor/lang/rte-lang-sv.js +1 -0
  87. package/richtexteditor/lang/rte-lang-sw.js +1 -0
  88. package/richtexteditor/lang/rte-lang-ta.js +1 -0
  89. package/richtexteditor/lang/rte-lang-te.js +1 -0
  90. package/richtexteditor/lang/rte-lang-th.js +1 -0
  91. package/richtexteditor/lang/rte-lang-tlh-Latn.js +1 -0
  92. package/richtexteditor/lang/rte-lang-tlh-Piqd.js +1 -0
  93. package/richtexteditor/lang/rte-lang-to.js +1 -0
  94. package/richtexteditor/lang/rte-lang-tr.js +1 -0
  95. package/richtexteditor/lang/rte-lang-ty.js +1 -0
  96. package/richtexteditor/lang/rte-lang-uk.js +1 -0
  97. package/richtexteditor/lang/rte-lang-ur.js +1 -0
  98. package/richtexteditor/lang/rte-lang-vi.js +1 -0
  99. package/richtexteditor/lang/rte-lang-yua.js +1 -0
  100. package/richtexteditor/lang/rte-lang-zh-Hans.js +1017 -2
  101. package/richtexteditor/lang/rte-lang-zh-Hant.js +1017 -2
  102. package/richtexteditor/plugins/a11yenhance.js +2 -1
  103. package/richtexteditor/plugins/a11yenhance.min.js +1 -1
  104. package/richtexteditor/plugins/accessibilitychecker.js +252 -60
  105. package/richtexteditor/plugins/accessibilitychecker.min.js +1 -1
  106. package/richtexteditor/plugins/aitoolkit.js +966 -303
  107. package/richtexteditor/plugins/aitoolkit.min.js +7 -7
  108. package/richtexteditor/plugins/all_plugins.js +7113 -1111
  109. package/richtexteditor/plugins/all_plugins.min.js +62 -59
  110. package/richtexteditor/plugins/autocorrect.js +66 -31
  111. package/richtexteditor/plugins/autocorrect.min.js +1 -1
  112. package/richtexteditor/plugins/autoembed.js +17 -0
  113. package/richtexteditor/plugins/autoembed.min.js +1 -1
  114. package/richtexteditor/plugins/blocktypes.js +18 -9
  115. package/richtexteditor/plugins/blocktypes.min.js +1 -1
  116. package/richtexteditor/plugins/bookmarkcard.js +12 -5
  117. package/richtexteditor/plugins/bookmarkcard.min.js +2 -2
  118. package/richtexteditor/plugins/changecase.js +72 -19
  119. package/richtexteditor/plugins/changecase.min.js +1 -1
  120. package/richtexteditor/plugins/charlimit.js +62 -2
  121. package/richtexteditor/plugins/charlimit.min.js +2 -2
  122. package/richtexteditor/plugins/comments.js +458 -59
  123. package/richtexteditor/plugins/comments.min.js +4 -3
  124. package/richtexteditor/plugins/contentminimap.js +25 -6
  125. package/richtexteditor/plugins/contentminimap.min.js +1 -1
  126. package/richtexteditor/plugins/crossreference.js +1 -1
  127. package/richtexteditor/plugins/crossreference.min.js +1 -1
  128. package/richtexteditor/plugins/dialoga11y.js +26 -4
  129. package/richtexteditor/plugins/dialoga11y.min.js +1 -1
  130. package/richtexteditor/plugins/dictation.js +1 -1
  131. package/richtexteditor/plugins/documentimport.js +220 -51
  132. package/richtexteditor/plugins/documentimport.min.js +4 -4
  133. package/richtexteditor/plugins/documentoutline.js +88 -38
  134. package/richtexteditor/plugins/documentoutline.min.js +1 -1
  135. package/richtexteditor/plugins/docxexport.js +204 -32
  136. package/richtexteditor/plugins/docxexport.min.js +2 -2
  137. package/richtexteditor/plugins/draghandle.js +267 -3
  138. package/richtexteditor/plugins/draghandle.min.js +1 -1
  139. package/richtexteditor/plugins/emailtoolkit.js +28 -14
  140. package/richtexteditor/plugins/emailtoolkit.min.js +1 -1
  141. package/richtexteditor/plugins/emojiautocomplete.js +110 -56
  142. package/richtexteditor/plugins/emojiautocomplete.min.js +1 -1
  143. package/richtexteditor/plugins/footnotes.js +65 -11
  144. package/richtexteditor/plugins/footnotes.min.js +1 -1
  145. package/richtexteditor/plugins/formatpainter.js +10 -0
  146. package/richtexteditor/plugins/formatpainter.min.js +1 -1
  147. package/richtexteditor/plugins/formattingmarks.js +53 -8
  148. package/richtexteditor/plugins/formattingmarks.min.js +1 -1
  149. package/richtexteditor/plugins/gapcursor.js +60 -0
  150. package/richtexteditor/plugins/gapcursor.min.js +1 -1
  151. package/richtexteditor/plugins/ghostcomplete.js +1 -1
  152. package/richtexteditor/plugins/html2pdf.js +1 -1
  153. package/richtexteditor/plugins/html2pdf.min.js +1 -1
  154. package/richtexteditor/plugins/imageeditor.js +12 -6
  155. package/richtexteditor/plugins/imageeditor.min.js +1 -1
  156. package/richtexteditor/plugins/importstyles.js +1 -1
  157. package/richtexteditor/plugins/inlinecode.js +25 -0
  158. package/richtexteditor/plugins/inlinecode.min.js +1 -1
  159. package/richtexteditor/plugins/insertcode.js +21 -3
  160. package/richtexteditor/plugins/insertcode.min.js +4 -4
  161. package/richtexteditor/plugins/insertemoji.js +112 -15
  162. package/richtexteditor/plugins/insertemoji.min.js +1 -1
  163. package/richtexteditor/plugins/insertgallery.js +42 -36
  164. package/richtexteditor/plugins/insertgallery.min.js +1 -1
  165. package/richtexteditor/plugins/inserttemplate.js +33 -17
  166. package/richtexteditor/plugins/inserttemplate.min.js +1 -1
  167. package/richtexteditor/plugins/keyboarda11y.js +66 -3
  168. package/richtexteditor/plugins/keyboarda11y.min.js +1 -1
  169. package/richtexteditor/plugins/layouttable.js +20 -0
  170. package/richtexteditor/plugins/layouttable.min.js +1 -1
  171. package/richtexteditor/plugins/linkchecker.js +29 -9
  172. package/richtexteditor/plugins/linkchecker.min.js +1 -1
  173. package/richtexteditor/plugins/localdraft.js +51 -7
  174. package/richtexteditor/plugins/localdraft.min.js +1 -1
  175. package/richtexteditor/plugins/markdownexport.js +159 -0
  176. package/richtexteditor/plugins/markdownexport.min.js +2 -2
  177. package/richtexteditor/plugins/mathdialog.js +11 -5
  178. package/richtexteditor/plugins/mathdialog.min.js +1 -1
  179. package/richtexteditor/plugins/mentionplugin.js +88 -25
  180. package/richtexteditor/plugins/mentionplugin.min.js +1 -1
  181. package/richtexteditor/plugins/mermaiddiagram.js +9 -3
  182. package/richtexteditor/plugins/mermaiddiagram.min.js +2 -2
  183. package/richtexteditor/plugins/multilevellist.js +4 -0
  184. package/richtexteditor/plugins/multilevellist.min.js +1 -1
  185. package/richtexteditor/plugins/pdfexport.js +235 -35
  186. package/richtexteditor/plugins/pdfexport.min.js +12 -12
  187. package/richtexteditor/plugins/permanentpen.js +3 -3
  188. package/richtexteditor/plugins/permanentpen.min.js +1 -1
  189. package/richtexteditor/plugins/readabilitystats.js +25 -11
  190. package/richtexteditor/plugins/readabilitystats.min.js +1 -1
  191. package/richtexteditor/plugins/readaloud.js +29 -15
  192. package/richtexteditor/plugins/readaloud.min.js +1 -1
  193. package/richtexteditor/plugins/restrictedediting.js +166 -0
  194. package/richtexteditor/plugins/restrictedediting.min.js +2 -2
  195. package/richtexteditor/plugins/revisionhistory.js +169 -37
  196. package/richtexteditor/plugins/revisionhistory.min.js +3 -3
  197. package/richtexteditor/plugins/rubyannotation.js +19 -9
  198. package/richtexteditor/plugins/rubyannotation.min.js +1 -1
  199. package/richtexteditor/plugins/sanitizer.js +86 -4
  200. package/richtexteditor/plugins/sanitizer.min.js +1 -1
  201. package/richtexteditor/plugins/slashcommand.js +30 -16
  202. package/richtexteditor/plugins/slashcommand.min.js +2 -2
  203. package/richtexteditor/plugins/smartchips.js +36 -22
  204. package/richtexteditor/plugins/smartchips.min.js +2 -2
  205. package/richtexteditor/plugins/spellcheck.js +17 -8
  206. package/richtexteditor/plugins/spellcheck.min.js +2 -2
  207. package/richtexteditor/plugins/stateinspector.js +19 -9
  208. package/richtexteditor/plugins/stateinspector.min.js +2 -2
  209. package/richtexteditor/plugins/structured-content-bridge.js +56 -24
  210. package/richtexteditor/plugins/structured-content-bridge.min.js +7 -7
  211. package/richtexteditor/plugins/tableofcontents.js +5 -2
  212. package/richtexteditor/plugins/tableofcontents.min.js +1 -1
  213. package/richtexteditor/plugins/tabletools.js +388 -3
  214. package/richtexteditor/plugins/tabletools.min.js +1 -1
  215. package/richtexteditor/plugins/textdirection.js +18 -5
  216. package/richtexteditor/plugins/textdirection.min.js +1 -1
  217. package/richtexteditor/plugins/textpartlanguage.js +161 -32
  218. package/richtexteditor/plugins/textpartlanguage.min.js +1 -1
  219. package/richtexteditor/plugins/todolist.js +90 -6
  220. package/richtexteditor/plugins/todolist.min.js +1 -1
  221. package/richtexteditor/plugins/trackedchanges.js +1812 -25
  222. package/richtexteditor/plugins/trackedchanges.min.js +5 -3
  223. package/richtexteditor/plugins/wordexport.js +2 -2
  224. package/richtexteditor/plugins/yjscollab.js +9 -4
  225. package/richtexteditor/plugins/yjscollab.min.js +1 -1
  226. package/richtexteditor/plugins/zz_richtextbox_dialog_style.js +22 -13
  227. package/richtexteditor/plugins/zz_richtextbox_dialog_style.min.js +1 -1
  228. package/richtexteditor/rte-config.js +131 -50
  229. package/richtexteditor/rte-headless.js +19 -4
  230. package/richtexteditor/rte-webcomponent.js +89 -16
  231. package/richtexteditor/rte.js +133 -52
  232. package/richtexteditor/runtime/colorpicker_more_ns.htm +93 -16
  233. package/scripts/build-angular.mjs +97 -0
  234. package/svelte/index.d.ts +2 -1
  235. package/svelte/index.js +80 -9
  236. package/vue/index.js +130 -34
  237. package/angular/component.ts +0 -297
  238. package/angular/index.ts +0 -24
@@ -1 +1 @@
1
- window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_footnotes=RTE_Plugin_Footnotes,typeof RTE_DefaultConfig.footnotesTitle>"u"&&(RTE_DefaultConfig.footnotesTitle="Footnotes"),typeof RTE_DefaultConfig.footnotesNumbering>"u"&&(RTE_DefaultConfig.footnotesNumbering="decimal"),typeof RTE_DefaultConfig.footnotesMarkerPrefix>"u"&&(RTE_DefaultConfig.footnotesMarkerPrefix=""),typeof RTE_DefaultConfig.footnotesMarkerSuffix>"u"&&(RTE_DefaultConfig.footnotesMarkerSuffix="");function RTE_Plugin_Footnotes(){var g=this,p,o,x=null,E=!1;g.PluginName="Footnotes",g.InitConfig=function(t){p=t},g.InitEditor=function(t){o=t,o.attachEvent("exec_command_insertfootnote",function(e){e.returnValue=!0,g.InsertFootnote()}),y();try{o.attachEvent("ready",y)}catch{}try{o.attachEvent("aftersethtml",function(){y(),b()})}catch{}setTimeout(function(){y(),b()},0),o.insertFootnote=function(e){return g.InsertFootnote(e)},o.getFootnotes=function(){return g.List()},o.syncFootnotes=function(){return T()},o.getFootnotesCss=function(){return L()}};function y(){var t=S();t&&(B(t),t!==x&&(q(),x=t))}function S(){try{return o.getDocument()}catch{return null}}function v(){try{return o.getEditable()}catch{return null}}function q(){var t=v();t&&(t.addEventListener("keyup",b),t.addEventListener("cut",b),t.addEventListener("paste",b),t.addEventListener("drop",b),t.addEventListener("click",function(e){var r=k(e.target,"rte-fn-ref",t),n=k(e.target,"rte-fn-back",t),i=null;if(r?i=I(r.getAttribute("data-fn-id")):n&&(i=M(n.getAttribute("data-fn-id"))),!!i){e.preventDefault();try{i.scrollIntoView({block:"center"})}catch{i.scrollIntoView()}P(i)}}))}function b(){E||(E=!0,setTimeout(function(){E=!1,T()},0))}function k(t,e,r){for(;t&&t!==r;){if(t.nodeType===1&&t.classList&&t.classList.contains(e))return t;t=t.parentNode}return null}function R(){return"fn"+Math.floor(Math.random()*1e9).toString(36)+(F++).toString(36)}var F=0;function w(){var t=v();return t?Array.prototype.slice.call(t.querySelectorAll("sup.rte-fn-ref[data-fn-id]")):[]}function A(){var t=v();return t?t.querySelector("section.rte-footnotes"):null}function I(t){var e=A();return e?e.querySelector('li.rte-fn-note[data-fn-id="'+N(t)+'"]'):null}function M(t){var e=v();return e?e.querySelector('sup.rte-fn-ref[data-fn-id="'+N(t)+'"]'):null}function N(t){return String(t).replace(/["\\]/g,"\\$&")}g.InsertFootnote=function(t){var e=S(),r=v();if(!e||!r)return null;var n=R(),i=e.createElement("sup");i.className="rte-fn-ref",i.setAttribute("data-fn-id",n),i.setAttribute("contenteditable","false"),i.setAttribute("id","fnref-"+n),i.textContent="0";var f=!1;try{typeof o.insertElement=="function"&&(o.insertElement(i),f=!0)}catch{}if(!f)try{var l=o.getSelection();if(l&&l.rangeCount){var a=l.getRangeAt(0);a.collapse(!1),a.insertNode(i),a.setStartAfter(i),a.collapse(!0),l.removeAllRanges(),l.addRange(a),f=!0}}catch{}f||r.appendChild(i);var u=D(e).querySelector("ol.rte-fn-list"),s=e.createElement("li");s.className="rte-fn-note",s.setAttribute("data-fn-id",n),s.setAttribute("id","fn-"+n),t!=null&&String(t)!==""&&s.appendChild(e.createTextNode(String(t)));var c=e.createElement("a");c.className="rte-fn-back",c.setAttribute("data-fn-id",n),c.setAttribute("href","#fnref-"+n),c.setAttribute("contenteditable","false"),c.setAttribute("title","Back to reference"),c.textContent="\u21A9",s.appendChild(c),u.appendChild(s),T();try{var m=e.createRange();m.setStart(s,0),m.collapse(!0);var d=o.getSelection();d.removeAllRanges(),d.addRange(m),typeof o.focus=="function"&&o.focus()}catch{}return z(),n};function D(t){var e=v(),r=A();if(r)return r;r=t.createElement("section"),r.className="rte-footnotes";var n=String(p.footnotesTitle==null?"":p.footnotesTitle);if(n){var i=t.createElement("h2");i.className="rte-fn-title",i.textContent=n,r.appendChild(i)}var f=t.createElement("ol");return f.className="rte-fn-list",r.appendChild(f),e.appendChild(r),r}function T(){var t=S(),e=A(),r=w();if(!r.length)return e&&e.parentNode&&e.parentNode.removeChild(e),[];if(!t)return[];e||(e=D(t));var n=e.querySelector("ol.rte-fn-list");n||(n=t.createElement("ol"),n.className="rte-fn-list",e.appendChild(n));for(var i={},f=[],l=0;l<r.length;l++){var a=r[l],u=a.getAttribute("data-fn-id");if(i[u]){var s=R();a.setAttribute("data-fn-id",s),a.setAttribute("id","fnref-"+s),u=s}i[u]=!0;var c=String(l+1),m=String(p.footnotesMarkerPrefix||"")+c+String(p.footnotesMarkerSuffix||"");a.textContent!==m&&(a.textContent=m),a.setAttribute("data-fn-number",c),a.getAttribute("contenteditable")!=="false"&&a.setAttribute("contenteditable","false"),a.getAttribute("id")!=="fnref-"+u&&a.setAttribute("id","fnref-"+u);var d=n.querySelector('li.rte-fn-note[data-fn-id="'+N(u)+'"]');d||(d=t.createElement("li"),d.className="rte-fn-note",d.setAttribute("data-fn-id",u),d.setAttribute("id","fn-"+u)),d.setAttribute("data-fn-number",c),n.appendChild(d),f.push({id:u,number:l+1,text:_(d)})}for(var h=Array.prototype.slice.call(n.querySelectorAll("li.rte-fn-note")),C=0;C<h.length;C++)i[h[C].getAttribute("data-fn-id")]||n.removeChild(h[C]);return n.getAttribute("data-numbering")!==p.footnotesNumbering&&n.setAttribute("data-numbering",p.footnotesNumbering),f}function _(t){if(!t)return"";for(var e=t.cloneNode(!0),r=e.querySelectorAll?e.querySelectorAll("a.rte-fn-back"):[],n=0;n<r.length;n++)r[n].parentNode&&r[n].parentNode.removeChild(r[n]);return(e.textContent||"").replace(/\u21a9/g,"").trim()}g.List=function(){var t=A();if(!t)return[];for(var e=[],r=t.querySelectorAll("li.rte-fn-note"),n=0;n<r.length;n++)e.push({id:r[n].getAttribute("data-fn-id"),number:parseInt(r[n].getAttribute("data-fn-number"),10)||n+1,text:_(r[n])});return e};function P(t){!t||!t.classList||(t.classList.add("rte-fn-flash"),setTimeout(function(){try{t.classList.remove("rte-fn-flash")}catch{}},900))}function z(){try{typeof o.updateDesign=="function"&&o.updateDesign()}catch{}try{typeof o.fireChange=="function"&&o.fireChange()}catch{}}function L(){var t=String(p.footnotesNumbering||"decimal");return"sup.rte-fn-ref{cursor:pointer;font-size:.72em;line-height:0;vertical-align:super;color:#1474ea;font-weight:700;padding:0 .12em;user-select:none;}sup.rte-fn-ref:hover{text-decoration:underline;}section.rte-footnotes{margin-top:2em;padding-top:.85em;border-top:1px solid #ddd;font-size:.88em;color:#333;}section.rte-footnotes h2.rte-fn-title{font-size:1em;font-weight:700;margin:0 0 .5em;}ol.rte-fn-list{list-style:"+t+";padding-left:1.6em;margin:0;}ol.rte-fn-list>li{margin:.25em 0;}a.rte-fn-back{text-decoration:none;color:#1474ea;cursor:pointer;user-select:none;}.rte-fn-flash{background:#fff3b0;transition:background .5s ease;}"}function B(t){if(t){var e=t.getElementById("rte-footnotes-styles"),r=L();if(e){if(e.getAttribute("data-css")===r)return;e.parentNode&&e.parentNode.removeChild(e)}var n=t.createElement("style");n.id="rte-footnotes-styles",n.setAttribute("data-css",r),n.appendChild(t.createTextNode(r)),(t.head||t.getElementsByTagName("head")[0]||t.documentElement).appendChild(n),o&&typeof o.ensureStyleSheetLive=="function"&&o.ensureStyleSheetLive(t,n,"rte-footnotes-styles",r)}}}
1
+ window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_footnotes=RTE_Plugin_Footnotes,typeof RTE_DefaultConfig.footnotesTitle>"u"&&(RTE_DefaultConfig.footnotesTitle="Footnotes"),typeof RTE_DefaultConfig.footnotesNumbering>"u"&&(RTE_DefaultConfig.footnotesNumbering="decimal"),typeof RTE_DefaultConfig.footnotesMarkerPrefix>"u"&&(RTE_DefaultConfig.footnotesMarkerPrefix=""),typeof RTE_DefaultConfig.footnotesMarkerSuffix>"u"&&(RTE_DefaultConfig.footnotesMarkerSuffix="");function RTE_Plugin_Footnotes(){var g=this,u,a,q=null,k=!1;g.PluginName="Footnotes",g.InitConfig=function(t){u=t},g.InitEditor=function(t){a=t,a.attachEvent("exec_command_insertfootnote",function(e){e.returnValue=!0,g.InsertFootnote()}),S();try{a.attachEvent("ready",S)}catch{}try{a.attachEvent("aftersethtml",function(){S(),p()})}catch{}setTimeout(function(){S(),p()},0),a.insertFootnote=function(e){return g.InsertFootnote(e)},a.getFootnotes=function(){return g.List()},a.syncFootnotes=function(){return D()},a.getFootnotesCss=function(){return P()}};function S(){var t=x();t&&(J(t),t!==q&&(z(),q=t))}function x(){try{return a.getDocument()}catch{return null}}function m(){try{return a.getEditable()}catch{return null}}function z(){var t=m();if(t){t.addEventListener("keyup",p),t.addEventListener("cut",p),t.addEventListener("paste",p);try{h&&h.disconnect(),h=new MutationObserver(function(){R||p()}),h.observe(t,{childList:!0,subtree:!0,characterData:!0})}catch{}t.addEventListener("drop",p),t.addEventListener("click",function(e){var r=L(e.target,"rte-fn-ref",t),n=L(e.target,"rte-fn-back",t),o=null;if(r?o=_(r.getAttribute("data-fn-id")):n&&(o=$(n.getAttribute("data-fn-id"))),!!o){e.preventDefault();try{o.scrollIntoView({block:"center"})}catch{o.scrollIntoView()}G(o)}})}}var h=null,R=!1;function B(){R=!0;try{D()}finally{if(h)try{h.takeRecords()}catch{}R=!1}}function p(){k||(k=!0,setTimeout(function(){k=!1,B()},0))}function L(t,e,r){for(;t&&t!==r;){if(t.nodeType===1&&t.classList&&t.classList.contains(e))return t;t=t.parentNode}return null}function F(){return"fn"+Math.floor(Math.random()*1e9).toString(36)+(V++).toString(36)}var V=0;function Q(){var t=m();return t?Array.prototype.slice.call(t.querySelectorAll("sup.rte-fn-ref[data-fn-id]")):[]}function C(){var t=m();return t?t.querySelector("section.rte-footnotes"):null}function $(t){var e=m();return e?e.querySelector('sup.rte-fn-ref[data-fn-id="'+E(t)+'"]'):null}function E(t){return String(t).replace(/["\\]/g,"\\$&")}g.InsertFootnote=function(t){var e=x(),r=m();if(!e||!r)return null;var n=F(),o=e.createElement("sup");o.className="rte-fn-ref",o.setAttribute("data-fn-id",n),o.setAttribute("contenteditable","false"),o.setAttribute("id","fnref-"+n),o.textContent="0";var l=!1;try{typeof a.insertElement=="function"&&(a.insertElement(o),l=!0)}catch{}if(!l)try{var f=a.getSelection();if(f&&f.rangeCount){var i=f.getRangeAt(0);i.collapse(!1),i.insertNode(o),i.setStartAfter(o),i.collapse(!0),f.removeAllRanges(),f.addRange(i),l=!0}}catch{}l||r.appendChild(o);var s=w(e).querySelector("ol.rte-fn-list"),d=e.createElement("li");d.className="rte-fn-note",d.setAttribute("data-fn-id",n),d.setAttribute("id","fn-"+n),t!=null&&String(t)!==""&&d.appendChild(e.createTextNode(String(t)));var c=e.createElement("a");c.className="rte-fn-back",c.setAttribute("data-fn-id",n),c.setAttribute("href","#fnref-"+n),c.setAttribute("contenteditable","false"),c.setAttribute("title",typeof u<"u"&&u&&u.text_fn_backref||"Back to reference"),c.textContent="\u21A9",d.appendChild(c),s.appendChild(d),D();try{var b=e.createRange();b.setStart(d,0),b.collapse(!0);var y=a.getSelection();y.removeAllRanges(),y.addRange(b),typeof a.focus=="function"&&a.focus()}catch{}return H(),n};function w(t){var e=m(),r=C();if(r)return r;r=t.createElement("section"),r.className="rte-footnotes";var n=String(u.footnotesTitle==null?"":u.footnotesTitle);if(n){var o=t.createElement("h2");o.className="rte-fn-title",o.textContent=n,r.appendChild(o)}var l=t.createElement("ol");return l.className="rte-fn-list",r.appendChild(l),e.appendChild(r),r}function D(){var t=x(),e=C(),r=Q();if(!r.length)return e&&I(e.querySelectorAll("li.rte-fn-note")),e&&e.parentNode&&e.parentNode.removeChild(e),[];if(!t)return[];e||(e=w(t));var n=e.querySelector("ol.rte-fn-list");n||(n=t.createElement("ol"),n.className="rte-fn-list",e.appendChild(n));for(var o={},l=[],f=0;f<r.length;f++){var i=r[f],s=i.getAttribute("data-fn-id"),d=null;if(o[s]){d=s;var c=F();i.setAttribute("data-fn-id",c),i.setAttribute("id","fnref-"+c),s=c}o[s]=!0;var b=String(f+1),y=String(u.footnotesMarkerPrefix||"")+b+String(u.footnotesMarkerSuffix||"");i.textContent!==y&&(i.textContent=y),i.setAttribute("data-fn-number",b),i.getAttribute("contenteditable")!=="false"&&i.setAttribute("contenteditable","false"),i.getAttribute("id")!=="fnref-"+s&&i.setAttribute("id","fnref-"+s);var v=n.querySelector('li.rte-fn-note[data-fn-id="'+E(s)+'"]');v||(v=_(t,n,s,d)),v.setAttribute("data-fn-number",b),n.appendChild(v),l.push({id:s,number:f+1,text:M(v)})}for(var T=Array.prototype.slice.call(n.querySelectorAll("li.rte-fn-note")),A=0;A<T.length;A++)o[T[A].getAttribute("data-fn-id")]||(I([T[A]]),n.removeChild(T[A]));return n.getAttribute("data-numbering")!==u.footnotesNumbering&&n.setAttribute("data-numbering",u.footnotesNumbering),l}var N={};function I(t){for(var e=0;e<t.length;e++){var r=t[e].getAttribute("data-fn-id");r&&(N[r]=t[e])}}function _(t,e,r,n){var o=N[r];if(o)return delete N[r],o;var l=n?e.querySelector('li.rte-fn-note[data-fn-id="'+E(n)+'"]')||N[n]:null;if(l){o=l.cloneNode(!0);for(var f=o.querySelectorAll("a.rte-fn-back"),i=0;i<f.length;i++)f[i].setAttribute("data-fn-id",r),f[i].setAttribute("href","#fnref-"+r)}else o=t.createElement("li"),o.className="rte-fn-note";return o.setAttribute("data-fn-id",r),o.setAttribute("id","fn-"+r),o}function M(t){if(!t)return"";for(var e=t.cloneNode(!0),r=e.querySelectorAll?e.querySelectorAll("a.rte-fn-back"):[],n=0;n<r.length;n++)r[n].parentNode&&r[n].parentNode.removeChild(r[n]);return(e.textContent||"").replace(/\u21a9/g,"").trim()}g.List=function(){var t=C();if(!t)return[];for(var e=[],r=t.querySelectorAll("li.rte-fn-note"),n=0;n<r.length;n++)e.push({id:r[n].getAttribute("data-fn-id"),number:parseInt(r[n].getAttribute("data-fn-number"),10)||n+1,text:M(r[n])});return e};function G(t){!t||!t.classList||(t.classList.add("rte-fn-flash"),setTimeout(function(){try{t.classList.remove("rte-fn-flash")}catch{}},900))}function H(){try{typeof a.updateDesign=="function"&&a.updateDesign()}catch{}try{typeof a.fireChange=="function"&&a.fireChange()}catch{}}function P(){var t=String(u.footnotesNumbering||"decimal");return"sup.rte-fn-ref{cursor:pointer;font-size:.72em;line-height:0;vertical-align:super;color:#1474ea;font-weight:700;padding:0 .12em;user-select:none;}sup.rte-fn-ref:hover{text-decoration:underline;}section.rte-footnotes{margin-top:2em;padding-top:.85em;border-top:1px solid #ddd;font-size:.88em;color:#333;}section.rte-footnotes h2.rte-fn-title{font-size:1em;font-weight:700;margin:0 0 .5em;}ol.rte-fn-list{list-style:"+t+";padding-left:1.6em;margin:0;}ol.rte-fn-list>li{margin:.25em 0;}a.rte-fn-back{text-decoration:none;color:#1474ea;cursor:pointer;user-select:none;}.rte-fn-flash{background:#fff3b0;transition:background .5s ease;}"}function J(t){if(t){var e=t.getElementById("rte-footnotes-styles"),r=P();if(e){if(e.getAttribute("data-css")===r)return;e.parentNode&&e.parentNode.removeChild(e)}var n=t.createElement("style");n.id="rte-footnotes-styles",n.setAttribute("data-css",r),n.appendChild(t.createTextNode(r)),(t.head||t.getElementsByTagName("head")[0]||t.documentElement).appendChild(n),a&&typeof a.ensureStyleSheetLive=="function"&&a.ensureStyleSheetLive(t,n,"rte-footnotes-styles",r)}}}
@@ -66,6 +66,16 @@ function RTE_Plugin_FormatPainter() {
66
66
  editor.cancelFormatPainter = function () { return obj.Cancel(); };
67
67
  editor.isFormatPainterActive = function () { return !!captured; };
68
68
  editor.getCapturedFormatting = function () { return captured ? cloneProps(captured.props) : null; };
69
+
70
+ // 2026-10-17 Ctrl/Cmd+Alt+C copies the selection's formatting and Ctrl/Cmd+Alt+V applies it, as in Google Docs. A key
71
+ // that reports a character other than c / v is AltGr typing (Ctrl+Alt on Windows) and is left alone.
72
+ // tools/keyboard/format-case-keys.mjs
73
+ (editor.bindDocumentEvent ? function (fn) { editor.bindDocumentEvent("keydown", fn, true); } : function (fn) { editor.getDocument().addEventListener("keydown", fn, true); })(function (e) {
74
+ if (!(e.ctrlKey || e.metaKey) || !e.altKey || e.shiftKey) return;
75
+ var k = e.key;
76
+ if (k === "c" || k === "C") { e.preventDefault(); obj.Copy(); }
77
+ else if (k === "v" || k === "V") { if (!captured) return; e.preventDefault(); obj.Paint(); }
78
+ });
69
79
  };
70
80
 
71
81
  function setup() {
@@ -1 +1 @@
1
- window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_formatpainter=RTE_Plugin_FormatPainter,typeof RTE_DefaultConfig.formatPainterProperties>"u"&&(RTE_DefaultConfig.formatPainterProperties=["font-family","font-size","font-weight","font-style","text-decoration-line","color","background-color","letter-spacing","text-transform","font-variant"]);function RTE_Plugin_FormatPainter(){var i=this,p,a,u=null,v=!1,P=null,T={B:1,STRONG:1,I:1,EM:1,U:1,S:1,STRIKE:1,FONT:1,BIG:1,SMALL:1};i.PluginName="FormatPainter",i.InitConfig=function(t){p=t},i.InitEditor=function(t){a=t,a.attachEvent("exec_command_formatpainter",function(e){e.returnValue=!0,i.Toggle()}),g();try{a.attachEvent("ready",g)}catch{}try{a.attachEvent("aftersethtml",g)}catch{}setTimeout(g,0),a.copyFormatting=function(){return i.Copy()},a.pasteFormatting=function(){return i.Paint()},a.toggleFormatPainter=function(e){return i.Toggle(e)},a.cancelFormatPainter=function(){return i.Cancel()},a.isFormatPainterActive=function(){return!!u},a.getCapturedFormatting=function(){return u?E(u.props):null}};function g(){var t=y();if(t&&(F(t),t!==P)){P=t;var e=m();e&&(e.addEventListener("mouseup",function(){u&&setTimeout(function(){u&&i.Paint()},0)}),e.addEventListener("keydown",function(r){r.key==="Escape"&&u&&(i.Cancel(),r.preventDefault())}))}}function y(){try{return a.getDocument()}catch{return null}}function m(){try{return a.getEditable()}catch{return null}}function E(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function b(){try{var t=a.getSelection();if(!t||t.rangeCount===0)return null;var e=t.getRangeAt(0).startContainer;return e&&e.nodeType===3&&(e=e.parentNode),e&&e.nodeType===1?e:null}catch{return null}}i.Copy=function(){var t=b(),e=y();if(!t||!e)return null;for(var r=e.defaultView||window,n=r.getComputedStyle(t),l=m(),o=l?r.getComputedStyle(l):null,f={},c=p.formatPainterProperties||[],s=0;s<c.length;s++){var h=c[s],C=n.getPropertyValue(h);C&&(o&&C===o.getPropertyValue(h)||(f[h]=C))}return f["background-color"]&&/^(transparent|rgba\(0,\s*0,\s*0,\s*0\))$/.test(f["background-color"])&&delete f["background-color"],u={props:f},N(!0),E(f)},i.Paint=function(){if(!u)return!1;var t=y(),e;try{e=a.getSelection()}catch{return!1}if(!t||!e||e.rangeCount===0||e.getRangeAt(0).collapsed)return!1;var r=t.createElement("span");r.className="rte-painted";var n=u.props;for(var l in n)n.hasOwnProperty(l)&&r.style.setProperty(l,n[l]);var o=null;try{o=a.surroundElement(r)}catch{o=null}return o?(A(o,p.formatPainterProperties||[]),w(o),v||i.Cancel(),R(),!0):!1};function A(t,e){for(var r=t.getElementsByTagName("*"),n=Array.prototype.slice.call(r),l=0;l<n.length;l++){var o=n[l];if(o.style){for(var f=0;f<e.length;f++)o.style.removeProperty(e[f]);o.style.removeProperty("font"),o.style.removeProperty("text-decoration")}o.nodeName==="FONT"&&(o.removeAttribute("color"),o.removeAttribute("face"),o.removeAttribute("size"))}for(var c=0;c<n.length;c++){var s=n[c];T[s.nodeName]&&s.parentNode&&d(s)}S(t)}function S(t){for(var e=Array.prototype.slice.call(t.getElementsByTagName("*")),r=0;r<e.length;r++){var n=e[r];if(n.getAttribute&&n.getAttribute("style")===""&&n.removeAttribute("style"),n.nodeName==="SPAN"&&n.classList&&n.classList.contains("rte-painted")&&n.parentNode){d(n);continue}n.nodeName==="SPAN"&&!n.attributes.length&&n.parentNode&&d(n)}t.getAttribute&&t.getAttribute("style")===""&&t.removeAttribute("style")}function d(t){for(var e=t.parentNode;t.firstChild;)e.insertBefore(t.firstChild,t);e.removeChild(t)}function w(t){for(var e=0;e<32;e++){var r=t.parentNode;if(!r||r.nodeType!==1||r.nodeName!=="SPAN"||!r.classList||!r.classList.contains("rte-painted")||!L(r,t))return;d(r)}}function L(t,e){for(var r=0;r<t.childNodes.length;r++){var n=t.childNodes[r];if(n!==e&&!(n.nodeType===3&&n.nodeValue.length===0))return!1}return!0}i.Toggle=function(t){return v=!!t,u?(i.Cancel(),!1):(i.Copy(),!!u)},i.Cancel=function(){return u=null,v=!1,N(!1),!0};function N(t){var e=m();!e||!e.classList||(t?e.classList.add("rte-format-painting"):e.classList.remove("rte-format-painting"))}function R(){try{typeof a.updateDesign=="function"&&a.updateDesign()}catch{}try{typeof a.fireChange=="function"&&a.fireChange()}catch{}}function D(){return".rte-format-painting,.rte-format-painting *{cursor:copy !important;}"}function F(t){if(t&&!t.getElementById("rte-format-painter-styles")){var e=t.createElement("style");e.id="rte-format-painter-styles",e.appendChild(t.createTextNode(D())),(t.head||t.getElementsByTagName("head")[0]||t.documentElement).appendChild(e),a&&typeof a.ensureStyleSheetLive=="function"&&a.ensureStyleSheetLive(t,e,"rte-format-painter-styles",e.textContent)}}}
1
+ window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_formatpainter=RTE_Plugin_FormatPainter,typeof RTE_DefaultConfig.formatPainterProperties>"u"&&(RTE_DefaultConfig.formatPainterProperties=["font-family","font-size","font-weight","font-style","text-decoration-line","color","background-color","letter-spacing","text-transform","font-variant"]);function RTE_Plugin_FormatPainter(){var i=this,p,a,u=null,v=!1,E=null,N={B:1,STRONG:1,I:1,EM:1,U:1,S:1,STRIKE:1,FONT:1,BIG:1,SMALL:1};i.PluginName="FormatPainter",i.InitConfig=function(e){p=e},i.InitEditor=function(e){a=e,a.attachEvent("exec_command_formatpainter",function(t){t.returnValue=!0,i.Toggle()}),d();try{a.attachEvent("ready",d)}catch{}try{a.attachEvent("aftersethtml",d)}catch{}setTimeout(d,0),a.copyFormatting=function(){return i.Copy()},a.pasteFormatting=function(){return i.Paint()},a.toggleFormatPainter=function(t){return i.Toggle(t)},a.cancelFormatPainter=function(){return i.Cancel()},a.isFormatPainterActive=function(){return!!u},a.getCapturedFormatting=function(){return u?P(u.props):null},(a.bindDocumentEvent?function(t){a.bindDocumentEvent("keydown",t,!0)}:function(t){a.getDocument().addEventListener("keydown",t,!0)})(function(t){if(!(!(t.ctrlKey||t.metaKey)||!t.altKey||t.shiftKey)){var r=t.key;if(r==="c"||r==="C")t.preventDefault(),i.Copy();else if(r==="v"||r==="V"){if(!u)return;t.preventDefault(),i.Paint()}}})};function d(){var e=y();if(e&&(F(e),e!==E)){E=e;var t=m();t&&(t.addEventListener("mouseup",function(){u&&setTimeout(function(){u&&i.Paint()},0)}),t.addEventListener("keydown",function(r){r.key==="Escape"&&u&&(i.Cancel(),r.preventDefault())}))}}function y(){try{return a.getDocument()}catch{return null}}function m(){try{return a.getEditable()}catch{return null}}function P(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t}function T(){try{var e=a.getSelection();if(!e||e.rangeCount===0)return null;var t=e.getRangeAt(0).startContainer;return t&&t.nodeType===3&&(t=t.parentNode),t&&t.nodeType===1?t:null}catch{return null}}i.Copy=function(){var e=T(),t=y();if(!e||!t)return null;for(var r=t.defaultView||window,n=r.getComputedStyle(e),l=m(),o=l?r.getComputedStyle(l):null,f={},s=p.formatPainterProperties||[],c=0;c<s.length;c++){var h=s[c],C=n.getPropertyValue(h);C&&(o&&C===o.getPropertyValue(h)||(f[h]=C))}return f["background-color"]&&/^(transparent|rgba\(0,\s*0,\s*0,\s*0\))$/.test(f["background-color"])&&delete f["background-color"],u={props:f},b(!0),P(f)},i.Paint=function(){if(!u)return!1;var e=y(),t;try{t=a.getSelection()}catch{return!1}if(!e||!t||t.rangeCount===0||t.getRangeAt(0).collapsed)return!1;var r=e.createElement("span");r.className="rte-painted";var n=u.props;for(var l in n)n.hasOwnProperty(l)&&r.style.setProperty(l,n[l]);var o=null;try{o=a.surroundElement(r)}catch{o=null}return o?(A(o,p.formatPainterProperties||[]),w(o),v||i.Cancel(),L(),!0):!1};function A(e,t){for(var r=e.getElementsByTagName("*"),n=Array.prototype.slice.call(r),l=0;l<n.length;l++){var o=n[l];if(o.style){for(var f=0;f<t.length;f++)o.style.removeProperty(t[f]);o.style.removeProperty("font"),o.style.removeProperty("text-decoration")}o.nodeName==="FONT"&&(o.removeAttribute("color"),o.removeAttribute("face"),o.removeAttribute("size"))}for(var s=0;s<n.length;s++){var c=n[s];N[c.nodeName]&&c.parentNode&&g(c)}S(e)}function S(e){for(var t=Array.prototype.slice.call(e.getElementsByTagName("*")),r=0;r<t.length;r++){var n=t[r];if(n.getAttribute&&n.getAttribute("style")===""&&n.removeAttribute("style"),n.nodeName==="SPAN"&&n.classList&&n.classList.contains("rte-painted")&&n.parentNode){g(n);continue}n.nodeName==="SPAN"&&!n.attributes.length&&n.parentNode&&g(n)}e.getAttribute&&e.getAttribute("style")===""&&e.removeAttribute("style")}function g(e){for(var t=e.parentNode;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e)}function w(e){for(var t=0;t<32;t++){var r=e.parentNode;if(!r||r.nodeType!==1||r.nodeName!=="SPAN"||!r.classList||!r.classList.contains("rte-painted")||!D(r,e))return;g(r)}}function D(e,t){for(var r=0;r<e.childNodes.length;r++){var n=e.childNodes[r];if(n!==t&&!(n.nodeType===3&&n.nodeValue.length===0))return!1}return!0}i.Toggle=function(e){return v=!!e,u?(i.Cancel(),!1):(i.Copy(),!!u)},i.Cancel=function(){return u=null,v=!1,b(!1),!0};function b(e){var t=m();!t||!t.classList||(e?t.classList.add("rte-format-painting"):t.classList.remove("rte-format-painting"))}function L(){try{typeof a.updateDesign=="function"&&a.updateDesign()}catch{}try{typeof a.fireChange=="function"&&a.fireChange()}catch{}}function R(){return".rte-format-painting,.rte-format-painting *{cursor:copy !important;}"}function F(e){if(e&&!e.getElementById("rte-format-painter-styles")){var t=e.createElement("style");t.id="rte-format-painter-styles",t.appendChild(e.createTextNode(R())),(e.head||e.getElementsByTagName("head")[0]||e.documentElement).appendChild(t),a&&typeof a.ensureStyleSheetLive=="function"&&a.ensureStyleSheetLive(e,t,"rte-format-painter-styles",t.textContent)}}}
@@ -35,11 +35,11 @@ function RTE_Plugin_FormattingMarks() {
35
35
  // differently. These are what people are actually hunting when they turn
36
36
  // formatting marks on after pasting from somewhere else.
37
37
  var INVISIBLES = [
38
- { ch: " ", cls: "rte-fm-nbsp", label: "·" }, // non-breaking space
39
- { ch: "​", cls: "rte-fm-zwsp", label: "␀" }, // zero-width space
40
- { ch: "‎", cls: "rte-fm-bidi", label: "‎" }, // LTR mark
41
- { ch: "‏", cls: "rte-fm-bidi", label: "‏" }, // RTL mark
42
- { ch: "­", cls: "rte-fm-shy", label: "-" } // soft hyphen
38
+ { ch: "\xa0", cls: "rte-fm-nbsp", label: "\xb7" }, // non-breaking space
39
+ { ch: "\u200b", cls: "rte-fm-zwsp", label: "\u2400" }, // zero-width space
40
+ { ch: "\u200e", cls: "rte-fm-bidi", label: "\u200e" }, // LTR mark
41
+ { ch: "\u200f", cls: "rte-fm-bidi", label: "\u200f" }, // RTL mark
42
+ { ch: "\xad", cls: "rte-fm-shy", label: "-" } // soft hyphen
43
43
  ];
44
44
 
45
45
  obj.PluginName = "FormattingMarks";
@@ -148,22 +148,67 @@ function RTE_Plugin_FormattingMarks() {
148
148
  // may be deliberate.
149
149
  if (parent.nodeName === "CODE" || parent.nodeName === "PRE") return;
150
150
 
151
+ // Replacing the text node moves a caret inside it to the node's old place in its
152
+ // parent - usually the paragraph start. This runs on every keyup, and the first
153
+ // space typed at a line end is always a non-breaking one, so with marks on every
154
+ // later character landed at the start, reversed: " edited" became "detide".
155
+ // Remember where the selection was inside this node and put it back.
156
+ var sel = doc.getSelection ? doc.getSelection() : null;
157
+ var range = sel && sel.rangeCount ? sel.getRangeAt(0) : null;
158
+ var keepStart = range && range.startContainer === node ? range.startOffset : -1;
159
+ var keepEnd = range && range.endContainer === node ? range.endOffset : -1;
160
+
151
161
  var frag = doc.createDocumentFragment();
162
+ var pieces = []; // in order: { node, marker } - every marker stands for ONE character
152
163
  var buf = "";
153
164
  for (var i = 0; i < text.length; i++) {
154
165
  var def = chars[text[i]];
166
+ // A space typed at a line end is inserted as a non-breaking placeholder that the
167
+ // browser turns back into a space when the next character arrives. Wrapped in a
168
+ // non-editable marker it never could, and saved as a hard &nbsp;. Leave the one
169
+ // right before the caret alone; it is marked once the caret moves on.
170
+ if (def && text[i] === "\xa0" && i === keepStart - 1 && keepStart === keepEnd) def = null;
155
171
  if (!def) { buf += text[i]; continue; }
156
- if (buf) { frag.appendChild(doc.createTextNode(buf)); buf = ""; }
172
+ if (buf) { pieces.push({ node: frag.appendChild(doc.createTextNode(buf)), marker: false }); buf = ""; }
157
173
  var span = doc.createElement("span");
158
174
  span.setAttribute("data-rte-fm", "1");
159
175
  span.setAttribute("data-rte-fm-char", text[i]);
160
176
  span.className = def.cls;
161
177
  span.setAttribute("contenteditable", "false");
162
178
  span.textContent = def.label;
163
- frag.appendChild(span);
179
+ pieces.push({ node: frag.appendChild(span), marker: true });
164
180
  }
165
- if (buf) frag.appendChild(doc.createTextNode(buf));
181
+ if (buf) pieces.push({ node: frag.appendChild(doc.createTextNode(buf)), marker: false });
166
182
  parent.replaceChild(frag, node);
183
+
184
+ if (keepStart < 0 && keepEnd < 0) return;
185
+ // Offset k in the old text -> a point in the pieces. Inside text where possible;
186
+ // never inside a marker (it is not editable): just before or after it.
187
+ function pointAt(k) {
188
+ var pos = 0;
189
+ for (var p = 0; p < pieces.length; p++) {
190
+ var piece = pieces[p];
191
+ if (piece.marker) {
192
+ if (k <= pos) return { node: parent, offset: Array.prototype.indexOf.call(parent.childNodes, piece.node) };
193
+ pos += 1;
194
+ } else {
195
+ var len = piece.node.nodeValue.length;
196
+ if (k <= pos + len) return { node: piece.node, offset: k - pos };
197
+ pos += len;
198
+ }
199
+ }
200
+ var last = pieces[pieces.length - 1].node;
201
+ return { node: parent, offset: Array.prototype.indexOf.call(parent.childNodes, last) + 1 };
202
+ }
203
+ try {
204
+ var r = doc.createRange();
205
+ var a = pointAt(keepStart >= 0 ? keepStart : 0);
206
+ var b = keepEnd >= 0 ? pointAt(keepEnd) : a;
207
+ if (keepStart < 0) { r.setStart(range.startContainer, range.startOffset); } else r.setStart(a.node, a.offset);
208
+ if (keepEnd < 0) { r.setEnd(range.endContainer, range.endOffset); } else r.setEnd(b.node, b.offset);
209
+ sel.removeAllRanges();
210
+ sel.addRange(r);
211
+ } catch (e) { /* a selection we cannot restore is no reason to lose the marks */ }
167
212
  }
168
213
 
169
214
  // ---- serialization safety -------------------------------------------
@@ -1 +1 @@
1
- window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_formattingmarks=RTE_Plugin_FormattingMarks,typeof RTE_DefaultConfig.formattingMarkPilcrow>"u"&&(RTE_DefaultConfig.formattingMarkPilcrow=!0),typeof RTE_DefaultConfig.formattingMarkBlocks>"u"&&(RTE_DefaultConfig.formattingMarkBlocks=!0),typeof RTE_DefaultConfig.formattingMarkInvisibles>"u"&&(RTE_DefaultConfig.formattingMarkInvisibles=!0);function RTE_Plugin_FormattingMarks(){var s=this,p,i,k=null,l=!1,y=!1,h=!1,d=[{ch:"\xA0",cls:"rte-fm-nbsp",label:"\xB7"},{ch:"\u200B",cls:"rte-fm-zwsp",label:"\u2400"},{ch:"\u200E",cls:"rte-fm-bidi",label:"\u200E"},{ch:"\u200F",cls:"rte-fm-bidi",label:"\u200F"},{ch:"\xAD",cls:"rte-fm-shy",label:"-"}];s.PluginName="FormattingMarks",s.InitConfig=function(e){p=e},s.InitEditor=function(e){i=e,i.attachEvent("exec_command_formattingmarks",function(t){t.returnValue=!0,s.Toggle()}),v();try{i.attachEvent("ready",v)}catch{}try{i.attachEvent("aftersethtml",function(){v(),l&&b()})}catch{}setTimeout(v,0),i.setFormattingMarks=function(t){return l=!!t,C(),l},i.toggleFormattingMarks=function(){return s.Toggle()},i.isFormattingMarks=function(){return l},i.getFormattingMarksCss=function(){return N()}},s.Toggle=function(){return l=!l,C(),l};function v(){var e=w();if(e&&(D(e),M(),e!==k)){k=e;var t=g();t&&(t.addEventListener("keyup",function(){l&&b()}),t.addEventListener("paste",function(){l&&b()}))}}function w(){try{return i.getDocument()}catch{return null}}function g(){try{return i.getEditable()}catch{return null}}function b(){h||(h=!0,setTimeout(function(){h=!1,T()},0))}function C(){var e=g();e&&(e.classList&&(e.classList.toggle("rte-fm-on",l),e.classList.toggle("rte-fm-pilcrow",l&&p.formattingMarkPilcrow!==!1),e.classList.toggle("rte-fm-blocks",l&&p.formattingMarkBlocks!==!1)),l&&p.formattingMarkInvisibles!==!1?T():E())}function E(){var e=g();if(e)for(var t=e.querySelectorAll("span[data-rte-fm]"),n=0;n<t.length;n++){var r=t[n],a=r.parentNode;a&&(a.replaceChild(r.ownerDocument.createTextNode(r.getAttribute("data-rte-fm-char")||""),r),a.normalize())}}function T(){var e=g(),t=w();if(!(!e||!t)){E();for(var n={},r=0;r<d.length;r++)n[d[r].ch]=d[r];for(var a=t.createTreeWalker(e,4,null,!1),f=[],o;o=a.nextNode();)if(o.nodeValue){for(var u=0;u<d.length;u++)if(o.nodeValue.indexOf(d[u].ch)>=0){f.push(o);break}}for(var c=0;c<f.length;c++)x(t,f[c],n)}}function x(e,t,n){var r=t.nodeValue,a=t.parentNode;if(a&&!(a.nodeName==="CODE"||a.nodeName==="PRE")){for(var f=e.createDocumentFragment(),o="",u=0;u<r.length;u++){var c=n[r[u]];if(!c){o+=r[u];continue}o&&(f.appendChild(e.createTextNode(o)),o="");var m=e.createElement("span");m.setAttribute("data-rte-fm","1"),m.setAttribute("data-rte-fm-char",r[u]),m.className=c.cls,m.setAttribute("contenteditable","false"),m.textContent=c.label,f.appendChild(m)}o&&f.appendChild(e.createTextNode(o)),a.replaceChild(f,t)}}function _(){var e=g();if(!e)return function(){};var t=Array.prototype.slice.call(e.querySelectorAll("span[data-rte-fm]"));if(!t.length)return function(){};for(var n=[],r=0;r<t.length;r++){var a=t[r],f=a.ownerDocument.createTextNode(a.getAttribute("data-rte-fm-char")||"");n.push({span:a,parent:a.parentNode,text:f}),a.parentNode&&a.parentNode.replaceChild(f,a)}return function(){for(var u=0;u<n.length;u++){var c=n[u];c.text.parentNode&&c.text.parentNode.replaceChild(c.span,c.text)}}}function M(){if(!y){for(var e=["getHTMLCode","getJSON","getHTMLContent","getText"],t=!1,n=0;n<e.length;n++)(function(r){var a=i[r];if(!(typeof a!="function"||a.__rteFmWrapped)){var f=function(){var o=_();try{return a.apply(i,arguments)}finally{o()}};f.__rteFmWrapped=!0,i[r]=f,t=!0}})(e[n]);t&&(y=!0)}}function N(){return".rte-fm-pilcrow p::after,.rte-fm-pilcrow h1::after,.rte-fm-pilcrow h2::after,.rte-fm-pilcrow h3::after,.rte-fm-pilcrow h4::after,.rte-fm-pilcrow h5::after,.rte-fm-pilcrow h6::after,.rte-fm-pilcrow li::after,.rte-fm-pilcrow blockquote::after{content:'\\00b6';color:#9aa4b5;opacity:.65;font-weight:400;}.rte-fm-blocks p,.rte-fm-blocks h1,.rte-fm-blocks h2,.rte-fm-blocks h3,.rte-fm-blocks h4,.rte-fm-blocks h5,.rte-fm-blocks h6,.rte-fm-blocks ul,.rte-fm-blocks ol,.rte-fm-blocks blockquote,.rte-fm-blocks table,.rte-fm-blocks div{outline:1px dashed rgba(120,140,170,.45);outline-offset:1px;}span[data-rte-fm]{color:#c2410c;opacity:.75;user-select:none;}.rte-fm-nbsp{background:rgba(194,65,12,.10);border-radius:2px;}.rte-fm-zwsp,.rte-fm-shy,.rte-fm-bidi{background:rgba(194,65,12,.18);border-radius:2px;font-size:.8em;vertical-align:middle;}"}function D(e){if(e){var t=e.getElementById("rte-formatting-marks-styles"),n=N();if(t){if(t.getAttribute("data-css")===n)return;t.parentNode&&t.parentNode.removeChild(t)}var r=e.createElement("style");r.id="rte-formatting-marks-styles",r.setAttribute("data-css",n),r.appendChild(e.createTextNode(n)),(e.head||e.getElementsByTagName("head")[0]||e.documentElement).appendChild(r),i&&typeof i.ensureStyleSheetLive=="function"&&i.ensureStyleSheetLive(e,r,"rte-formatting-marks-styles",r.textContent)}}}
1
+ window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_formattingmarks=RTE_Plugin_FormattingMarks,typeof RTE_DefaultConfig.formattingMarkPilcrow>"u"&&(RTE_DefaultConfig.formattingMarkPilcrow=!0),typeof RTE_DefaultConfig.formattingMarkBlocks>"u"&&(RTE_DefaultConfig.formattingMarkBlocks=!0),typeof RTE_DefaultConfig.formattingMarkInvisibles>"u"&&(RTE_DefaultConfig.formattingMarkInvisibles=!0);function RTE_Plugin_FormattingMarks(){var m=this,C,o,S=null,u=!1,A=!1,N=!1,v=[{ch:"\xA0",cls:"rte-fm-nbsp",label:"\xB7"},{ch:"\u200B",cls:"rte-fm-zwsp",label:"\u2400"},{ch:"\u200E",cls:"rte-fm-bidi",label:"\u200E"},{ch:"\u200F",cls:"rte-fm-bidi",label:"\u200F"},{ch:"\xAD",cls:"rte-fm-shy",label:"-"}];m.PluginName="FormattingMarks",m.InitConfig=function(e){C=e},m.InitEditor=function(e){o=e,o.attachEvent("exec_command_formattingmarks",function(t){t.returnValue=!0,m.Toggle()}),E();try{o.attachEvent("ready",E)}catch{}try{o.attachEvent("aftersethtml",function(){E(),u&&_()})}catch{}setTimeout(E,0),o.setFormattingMarks=function(t){return u=!!t,I(),u},o.toggleFormattingMarks=function(){return m.Toggle()},o.isFormattingMarks=function(){return u},o.getFormattingMarksCss=function(){return O()}},m.Toggle=function(){return u=!u,I(),u};function E(){var e=R();if(e&&(H(e),W(),e!==S)){S=e;var t=h();t&&(t.addEventListener("keyup",function(){u&&_()}),t.addEventListener("paste",function(){u&&_()}))}}function R(){try{return o.getDocument()}catch{return null}}function h(){try{return o.getEditable()}catch{return null}}function _(){N||(N=!0,setTimeout(function(){N=!1,F()},0))}function I(){var e=h();e&&(e.classList&&(e.classList.toggle("rte-fm-on",u),e.classList.toggle("rte-fm-pilcrow",u&&C.formattingMarkPilcrow!==!1),e.classList.toggle("rte-fm-blocks",u&&C.formattingMarkBlocks!==!1)),u&&C.formattingMarkInvisibles!==!1?F():L())}function L(){var e=h();if(e)for(var t=e.querySelectorAll("span[data-rte-fm]"),n=0;n<t.length;n++){var r=t[n],a=r.parentNode;a&&(a.replaceChild(r.ownerDocument.createTextNode(r.getAttribute("data-rte-fm-char")||""),r),a.normalize())}}function F(){var e=h(),t=R();if(!(!e||!t)){L();for(var n={},r=0;r<v.length;r++)n[v[r].ch]=v[r];for(var a=t.createTreeWalker(e,4,null,!1),i=[],f;f=a.nextNode();)if(f.nodeValue){for(var l=0;l<v.length;l++)if(f.nodeValue.indexOf(v[l].ch)>=0){i.push(f);break}}for(var s=0;s<i.length;s++)V(t,i[s],n)}}function V(e,t,n){var r=t.nodeValue,a=t.parentNode;if(!a||a.nodeName==="CODE"||a.nodeName==="PRE")return;for(var i=e.getSelection?e.getSelection():null,f=i&&i.rangeCount?i.getRangeAt(0):null,l=f&&f.startContainer===t?f.startOffset:-1,s=f&&f.endContainer===t?f.endOffset:-1,w=e.createDocumentFragment(),c=[],g="",d=0;d<r.length;d++){var b=n[r[d]];if(b&&r[d]==="\xA0"&&d===l-1&&l===s&&(b=null),!b){g+=r[d];continue}g&&(c.push({node:w.appendChild(e.createTextNode(g)),marker:!1}),g="");var p=e.createElement("span");p.setAttribute("data-rte-fm","1"),p.setAttribute("data-rte-fm-char",r[d]),p.className=b.cls,p.setAttribute("contenteditable","false"),p.textContent=b.label,c.push({node:w.appendChild(p),marker:!0})}if(g&&c.push({node:w.appendChild(e.createTextNode(g)),marker:!1}),a.replaceChild(w,t),l<0&&s<0)return;function q(x){for(var y=0,D=0;D<c.length;D++){var T=c[D];if(T.marker){if(x<=y)return{node:a,offset:Array.prototype.indexOf.call(a.childNodes,T.node)};y+=1}else{var P=T.node.nodeValue.length;if(x<=y+P)return{node:T.node,offset:x-y};y+=P}}var J=c[c.length-1].node;return{node:a,offset:Array.prototype.indexOf.call(a.childNodes,J)+1}}try{var k=e.createRange(),M=q(l>=0?l:0),B=s>=0?q(s):M;l<0?k.setStart(f.startContainer,f.startOffset):k.setStart(M.node,M.offset),s<0?k.setEnd(f.endContainer,f.endOffset):k.setEnd(B.node,B.offset),i.removeAllRanges(),i.addRange(k)}catch{}}function z(){var e=h();if(!e)return function(){};var t=Array.prototype.slice.call(e.querySelectorAll("span[data-rte-fm]"));if(!t.length)return function(){};for(var n=[],r=0;r<t.length;r++){var a=t[r],i=a.ownerDocument.createTextNode(a.getAttribute("data-rte-fm-char")||"");n.push({span:a,parent:a.parentNode,text:i}),a.parentNode&&a.parentNode.replaceChild(i,a)}return function(){for(var l=0;l<n.length;l++){var s=n[l];s.text.parentNode&&s.text.parentNode.replaceChild(s.span,s.text)}}}function W(){if(!A){for(var e=["getHTMLCode","getJSON","getHTMLContent","getText"],t=!1,n=0;n<e.length;n++)(function(r){var a=o[r];if(!(typeof a!="function"||a.__rteFmWrapped)){var i=function(){var f=z();try{return a.apply(o,arguments)}finally{f()}};i.__rteFmWrapped=!0,o[r]=i,t=!0}})(e[n]);t&&(A=!0)}}function O(){return".rte-fm-pilcrow p::after,.rte-fm-pilcrow h1::after,.rte-fm-pilcrow h2::after,.rte-fm-pilcrow h3::after,.rte-fm-pilcrow h4::after,.rte-fm-pilcrow h5::after,.rte-fm-pilcrow h6::after,.rte-fm-pilcrow li::after,.rte-fm-pilcrow blockquote::after{content:'\\00b6';color:#9aa4b5;opacity:.65;font-weight:400;}.rte-fm-blocks p,.rte-fm-blocks h1,.rte-fm-blocks h2,.rte-fm-blocks h3,.rte-fm-blocks h4,.rte-fm-blocks h5,.rte-fm-blocks h6,.rte-fm-blocks ul,.rte-fm-blocks ol,.rte-fm-blocks blockquote,.rte-fm-blocks table,.rte-fm-blocks div{outline:1px dashed rgba(120,140,170,.45);outline-offset:1px;}span[data-rte-fm]{color:#c2410c;opacity:.75;user-select:none;}.rte-fm-nbsp{background:rgba(194,65,12,.10);border-radius:2px;}.rte-fm-zwsp,.rte-fm-shy,.rte-fm-bidi{background:rgba(194,65,12,.18);border-radius:2px;font-size:.8em;vertical-align:middle;}"}function H(e){if(e){var t=e.getElementById("rte-formatting-marks-styles"),n=O();if(t){if(t.getAttribute("data-css")===n)return;t.parentNode&&t.parentNode.removeChild(t)}var r=e.createElement("style");r.id="rte-formatting-marks-styles",r.setAttribute("data-css",n),r.appendChild(e.createTextNode(n)),(e.head||e.getElementsByTagName("head")[0]||e.documentElement).appendChild(r),o&&typeof o.ensureStyleSheetLive=="function"&&o.ensureStyleSheetLive(e,r,"rte-formatting-marks-styles",r.textContent)}}}
@@ -137,6 +137,9 @@ function RTE_Plugin_GapCursor() {
137
137
  var ed = getEditable();
138
138
  var doc = getDoc();
139
139
  if (!ed || !doc) return null;
140
+ // 2026-10-14 Suggesting mode: an empty paragraph is not tracked yet, so the track hook refuses it.
141
+ // tools/review/suggesting-structure-audit.mjs
142
+ if (editor.__trackHook && editor.__trackHook("insert-block", {}) === true) return null;
140
143
  // Resolve against the hint-free list, then insert relative to that node.
141
144
  hideHint();
142
145
  var p = makeParagraph(doc);
@@ -151,6 +154,8 @@ function RTE_Plugin_GapCursor() {
151
154
  var ed = getEditable();
152
155
  var doc = getDoc();
153
156
  if (!ed || !doc || !el) return null;
157
+ // 2026-10-14 Suggesting mode: an empty paragraph is not tracked yet, so the track hook refuses it.
158
+ if (editor.__trackHook && editor.__trackHook("insert-block", {}) === true) return null;
154
159
  var p = makeParagraph(doc);
155
160
  if (after) el.parentNode.insertBefore(p, el.nextSibling);
156
161
  else el.parentNode.insertBefore(p, el);
@@ -182,8 +187,60 @@ function RTE_Plugin_GapCursor() {
182
187
  return (n && n.parentNode === ed) ? n : null;
183
188
  }
184
189
 
190
+ // 2026-10-03 Is the caret at the edge of a block it can be INSIDE (table, code block, figure)?
191
+ // Atomic blocks (rule, image, embed) hold no caret, so they always count as the edge.
192
+ // vertical: the first/last row (tables) and the first/last visual line; otherwise the very
193
+ // first/last character position. tools/keyboard/gapcursor-edges.mjs
194
+ function caretAtEdge(block, range, forward, vertical) {
195
+ if (!/^(TABLE|PRE|FIGURE)$/.test(block.nodeName)) return true;
196
+ var scope = block;
197
+ if (block.nodeName === "TABLE") {
198
+ var cell = range.startContainer;
199
+ while (cell && cell !== block && !/^(TD|TH)$/.test(cell.nodeName)) cell = cell.parentNode;
200
+ var rows = block.rows;
201
+ if (!cell || cell === block || !rows || !rows.length) return true;
202
+ var edgeRow = forward ? rows[rows.length - 1] : rows[0];
203
+ if (vertical) {
204
+ if (cell.parentNode !== edgeRow) return false;
205
+ } else {
206
+ var edgeCell = forward ? edgeRow.cells[edgeRow.cells.length - 1] : edgeRow.cells[0];
207
+ if (cell !== edgeCell) return false;
208
+ }
209
+ scope = cell;
210
+ }
211
+ var doc = scope.ownerDocument;
212
+ if (vertical) {
213
+ var rc = null;
214
+ try {
215
+ var rects = range.getClientRects();
216
+ rc = rects && rects.length ? rects[0] : null;
217
+ if (!rc || !rc.height) {
218
+ var n = range.startContainer.nodeType === 3 ? range.startContainer.parentNode : range.startContainer;
219
+ rc = n && n.getBoundingClientRect ? n.getBoundingClientRect() : null;
220
+ }
221
+ } catch (er) { rc = null; }
222
+ if (!rc || !rc.height) return true;
223
+ var sr = scope.getBoundingClientRect();
224
+ var lh = Math.max(rc.height, 12);
225
+ return forward ? (sr.bottom - rc.bottom < lh) : (rc.top - sr.top < lh);
226
+ }
227
+ var r = doc.createRange();
228
+ if (forward) { r.setStart(range.endContainer, range.endOffset); r.setEnd(scope, scope.childNodes.length); }
229
+ else { r.setStart(scope, 0); r.setEnd(range.startContainer, range.startOffset); }
230
+ if (r.toString().replace(/\u200b/g, "") !== "") return false;
231
+ // a line break or an object between the caret and the edge is still a position to travel to
232
+ // (a filler <br> as the scope's last child is not)
233
+ var objs = r.cloneContents().querySelectorAll("br,img,hr,video,iframe,svg,canvas");
234
+ for (var i = 0; i < objs.length; i++) if (!(forward && objs[i].nodeName === "BR" && i === objs.length - 1 && scope.lastChild && scope.lastChild.nodeName === "BR")) return false;
235
+ return true;
236
+ }
237
+
185
238
  function onKeyDown(e) {
186
239
  var key = e.key;
240
+ // 2026-10-02 A modified arrow is not caret travel: Alt+Up / Alt+Down move the block (or the
241
+ // table row), Shift+Arrow extends the selection - neither may insert a gap paragraph above or
242
+ // below a table at the document edge. tools/keyboard/move-block.mjs
243
+ if (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey) return;
187
244
  var forward = (key === "ArrowDown" || key === "ArrowRight" || key === "End" || key === "PageDown");
188
245
  var back = (key === "ArrowUp" || key === "ArrowLeft" || key === "Home" || key === "PageUp");
189
246
  if (!forward && !back) return;
@@ -199,6 +256,9 @@ function RTE_Plugin_GapCursor() {
199
256
  var kids = blocks();
200
257
  var index = kids.indexOf(block);
201
258
  if (index < 0) return;
259
+ // Only from the block's EDGE in that direction: inside a table or code block the key must
260
+ // first travel there (Home in any cell, or ArrowUp from row 2, used to jump out of the table).
261
+ if (!caretAtEdge(block, sel.getRangeAt(0), forward, key === "ArrowUp" || key === "ArrowDown" || key === "PageUp" || key === "PageDown")) return;
202
262
 
203
263
  if (forward) {
204
264
  var next = kids[index + 1];
@@ -1 +1 @@
1
- window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_gapcursor=RTE_Plugin_GapCursor,typeof RTE_DefaultConfig.gapCursorClick>"u"&&(RTE_DefaultConfig.gapCursorClick=!0),typeof RTE_DefaultConfig.gapCursorKeys>"u"&&(RTE_DefaultConfig.gapCursorKeys=!0),typeof RTE_DefaultConfig.gapCursorHint>"u"&&(RTE_DefaultConfig.gapCursorHint=!0);function RTE_Plugin_GapCursor(){var E=this,v,i,m=null;E.PluginName="GapCursor";var S={TABLE:1,HR:1,IMG:1,FIGURE:1,IFRAME:1,VIDEO:1,AUDIO:1,OBJECT:1,EMBED:1,CANVAS:1,SVG:1,PRE:1};E.InitConfig=function(e){v=e},E.InitEditor=function(e){i=e,C();try{i.attachEvent("ready",C)}catch{}try{i.attachEvent("aftersethtml",C)}catch{}setTimeout(C,0),i.insertParagraphAt=function(t){return p(t)},i.insertParagraphAfter=function(t){return A(t,!0)},i.insertParagraphBefore=function(t){return A(t,!1)},i.getGapPositions=function(){return y()}};function h(){try{return i.getDocument()}catch{return null}}function u(){try{return i.getEditable()}catch{return null}}function C(){var e=h(),t=u();!e||!t||e===m||(m=e,U(e),v.gapCursorKeys!==!1&&t.addEventListener("keydown",L,!0),v.gapCursorClick!==!1&&t.addEventListener("click",G,!0),v.gapCursorHint!==!1&&t.addEventListener("mousemove",O,!0))}function f(e){return!!(e&&e.nodeType===1&&S[e.nodeName])}function D(e){return!!(e&&e.nodeType===1&&e.className==="rte-gap-hint")}function s(){var e=u(),t=[];if(!e)return t;for(var r=0;r<e.children.length;r++)D(e.children[r])||t.push(e.children[r]);return t}function y(){var e=[],t=s();if(!t.length)return e;f(t[0])&&e.push(0);for(var r=0;r<t.length-1;r++)f(t[r])&&f(t[r+1])&&e.push(r+1);return f(t[t.length-1])&&e.push(t.length),e}function R(e){var t=e.createElement("p");return t.appendChild(e.createElement("br")),t}function p(e){var t=u(),r=h();if(!t||!r)return null;g();var n=R(r),a=s()[e]||null;return t.insertBefore(n,a),N(n),P(),n}function A(e,t){var r=u(),n=h();if(!r||!n||!e)return null;var a=R(n);return t?e.parentNode.insertBefore(a,e.nextSibling):e.parentNode.insertBefore(a,e),N(a),P(),a}function N(e){try{var t=e.ownerDocument,r=t.createRange();r.setStart(e,0),r.collapse(!0);var n=i.getSelection();n.removeAllRanges(),n.addRange(r),i.focus()}catch{}}function I(e){for(var t=u(),r=e&&e.nodeType===3?e.parentNode:e;r&&r.parentNode&&r.parentNode!==t;)r=r.parentNode;return r&&r.parentNode===t?r:null}function L(e){var t=e.key,r=t==="ArrowDown"||t==="ArrowRight"||t==="End"||t==="PageDown",n=t==="ArrowUp"||t==="ArrowLeft"||t==="Home"||t==="PageUp";if(!(!r&&!n)){var a=u();if(!(!a||!a.children.length)){var l=i.getSelection();if(!(!l||!l.rangeCount)){var x=I(l.getRangeAt(0).startContainer);if(f(x)){var b=s(),d=b.indexOf(x);if(!(d<0))if(r){var B=b[d+1];if(B&&!f(B))return;e.preventDefault(),e.stopPropagation(),p(d+1)}else{var _=b[d-1];if(_&&!f(_))return;e.preventDefault(),e.stopPropagation(),p(d)}}}}}}function G(e){var t=u();if(!(!t||e.target!==t)){g();var r=T(e.clientY);r!==null&&(e.preventDefault(),e.stopPropagation(),p(r))}}function T(e){var t=s();if(!t.length)return null;var r=y();if(!r.length)return null;for(var n=0;n<t.length;n++){var a=t[n].getBoundingClientRect();if(e<a.top)return k(r,n);if(e<=a.bottom)return null}return k(r,t.length)}function k(e,t){return e.indexOf(t)>=0?t:null}var o=null,c=null,H=10;function O(e){var t=u();if(t&&!D(e.target)){if(e.target===t){var r=T(e.clientY);if(r===null){g();return}w(r);return}var n=M(e.clientY);if(n===null){g();return}w(n)}}function M(e){for(var t=s(),r=y(),n=0;n<r.length;n++){var a=r[n],l;if(a===0?l=t[0].getBoundingClientRect().top:l=t[a-1].getBoundingClientRect().bottom,Math.abs(e-l)<=H)return a}return null}function w(e){var t=u(),r=h();if(!(!t||!r)){o||(o=r.createElement("div"),o.className="rte-gap-hint",o.setAttribute("contenteditable","false"),o.setAttribute("aria-hidden","true"),o.addEventListener("mousedown",function(a){a.preventDefault(),a.stopPropagation(),c!==null&&p(c)},!0));var n=s()[e]||null;if(o.parentNode===t&&o.nextSibling===n){c=e;return}t.insertBefore(o,n),c=e}}function g(){o&&o.parentNode&&o.parentNode.removeChild(o),c=null}function P(){g();try{typeof i.updateDesign=="function"&&i.updateDesign()}catch{}try{typeof i.fireChange=="function"&&i.fireChange()}catch{}}function K(){return".rte-gap-hint{height:6px;margin:1px 0;position:relative;cursor:text;pointer-events:auto;background:transparent;}.rte-gap-hint::before{content:'';position:absolute;left:0;right:0;top:2px;border-top:2px solid #2563eb;opacity:.65;}.rte-gap-hint::after{content:'';position:absolute;left:-3px;top:0;width:6px;height:6px;border-radius:50%;background:#2563eb;}"}function U(e){if(e){var t=K(),r=e.getElementById("rte-gapcursor-styles");if(r){if(r.getAttribute("data-css")===t)return;r.parentNode&&r.parentNode.removeChild(r)}var n=e.createElement("style");n.id="rte-gapcursor-styles",n.setAttribute("data-css",t),n.appendChild(e.createTextNode(t)),(e.head||e.getElementsByTagName("head")[0]||e.documentElement).appendChild(n),i&&typeof i.ensureStyleSheetLive=="function"&&i.ensureStyleSheetLive(e,n,"rte-gapcursor-styles",n.textContent)}}}
1
+ window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_gapcursor=RTE_Plugin_GapCursor,typeof RTE_DefaultConfig.gapCursorClick>"u"&&(RTE_DefaultConfig.gapCursorClick=!0),typeof RTE_DefaultConfig.gapCursorKeys>"u"&&(RTE_DefaultConfig.gapCursorKeys=!0),typeof RTE_DefaultConfig.gapCursorHint>"u"&&(RTE_DefaultConfig.gapCursorHint=!0);function RTE_Plugin_GapCursor(){var D=this,y,i,_=null;D.PluginName="GapCursor";var U={TABLE:1,HR:1,IMG:1,FIGURE:1,IFRAME:1,VIDEO:1,AUDIO:1,OBJECT:1,EMBED:1,CANVAS:1,SVG:1,PRE:1};D.InitConfig=function(t){y=t},D.InitEditor=function(t){i=t,b();try{i.attachEvent("ready",b)}catch{}try{i.attachEvent("aftersethtml",b)}catch{}setTimeout(b,0),i.insertParagraphAt=function(e){return h(e)},i.insertParagraphAfter=function(e){return S(e,!0)},i.insertParagraphBefore=function(e){return S(e,!1)},i.getGapPositions=function(){return A()}};function m(){try{return i.getDocument()}catch{return null}}function l(){try{return i.getEditable()}catch{return null}}function b(){var t=m(),e=l();!t||!e||t===_||(_=t,z(t),y.gapCursorKeys!==!1&&e.addEventListener("keydown",F,!0),y.gapCursorClick!==!1&&e.addEventListener("click",V,!0),y.gapCursorHint!==!1&&e.addEventListener("mousemove",$,!0))}function p(t){return!!(t&&t.nodeType===1&&U[t.nodeName])}function P(t){return!!(t&&t.nodeType===1&&t.className==="rte-gap-hint")}function c(){var t=l(),e=[];if(!t)return e;for(var r=0;r<t.children.length;r++)P(t.children[r])||e.push(t.children[r]);return e}function A(){var t=[],e=c();if(!e.length)return t;p(e[0])&&t.push(0);for(var r=0;r<e.length-1;r++)p(e[r])&&p(e[r+1])&&t.push(r+1);return p(e[e.length-1])&&t.push(e.length),t}function x(t){var e=t.createElement("p");return e.appendChild(t.createElement("br")),e}function h(t){var e=l(),r=m();if(!e||!r||i.__trackHook&&i.__trackHook("insert-block",{})===!0)return null;E();var n=x(r),a=c()[t]||null;return e.insertBefore(n,a),w(n),G(),n}function S(t,e){var r=l(),n=m();if(!r||!n||!t||i.__trackHook&&i.__trackHook("insert-block",{})===!0)return null;var a=x(n);return e?t.parentNode.insertBefore(a,t.nextSibling):t.parentNode.insertBefore(a,t),w(a),G(),a}function w(t){try{var e=t.ownerDocument,r=e.createRange();r.setStart(t,0),r.collapse(!0);var n=i.getSelection();n.removeAllRanges(),n.addRange(r),i.focus()}catch{}}function M(t){for(var e=l(),r=t&&t.nodeType===3?t.parentNode:t;r&&r.parentNode&&r.parentNode!==e;)r=r.parentNode;return r&&r.parentNode===e?r:null}function j(t,e,r,n){if(!/^(TABLE|PRE|FIGURE)$/.test(t.nodeName))return!0;var a=t;if(t.nodeName==="TABLE"){for(var o=e.startContainer;o&&o!==t&&!/^(TD|TH)$/.test(o.nodeName);)o=o.parentNode;var s=t.rows;if(!o||o===t||!s||!s.length)return!0;var g=r?s[s.length-1]:s[0];if(n){if(o.parentNode!==g)return!1}else{var d=r?g.cells[g.cells.length-1]:g.cells[0];if(o!==d)return!1}a=o}var N=a.ownerDocument;if(n){var f=null;try{var T=e.getClientRects();if(f=T&&T.length?T[0]:null,!f||!f.height){var k=e.startContainer.nodeType===3?e.startContainer.parentNode:e.startContainer;f=k&&k.getBoundingClientRect?k.getBoundingClientRect():null}}catch{f=null}if(!f||!f.height)return!0;var O=a.getBoundingClientRect(),K=Math.max(f.height,12);return r?O.bottom-f.bottom<K:f.top-O.top<K}var v=N.createRange();if(r?(v.setStart(e.endContainer,e.endOffset),v.setEnd(a,a.childNodes.length)):(v.setStart(a,0),v.setEnd(e.startContainer,e.startOffset)),v.toString().replace(/\u200b/g,"")!=="")return!1;for(var B=v.cloneContents().querySelectorAll("br,img,hr,video,iframe,svg,canvas"),R=0;R<B.length;R++)if(!(r&&B[R].nodeName==="BR"&&R===B.length-1&&a.lastChild&&a.lastChild.nodeName==="BR"))return!1;return!0}function F(t){var e=t.key;if(!(t.altKey||t.shiftKey||t.ctrlKey||t.metaKey)){var r=e==="ArrowDown"||e==="ArrowRight"||e==="End"||e==="PageDown",n=e==="ArrowUp"||e==="ArrowLeft"||e==="Home"||e==="PageUp";if(!(!r&&!n)){var a=l();if(!(!a||!a.children.length)){var o=i.getSelection();if(!(!o||!o.rangeCount)){var s=M(o.getRangeAt(0).startContainer);if(p(s)){var g=c(),d=g.indexOf(s);if(!(d<0)&&j(s,o.getRangeAt(0),r,e==="ArrowUp"||e==="ArrowDown"||e==="PageUp"||e==="PageDown"))if(r){var N=g[d+1];if(N&&!p(N))return;t.preventDefault(),t.stopPropagation(),h(d+1)}else{var f=g[d-1];if(f&&!p(f))return;t.preventDefault(),t.stopPropagation(),h(d)}}}}}}}function V(t){var e=l();if(!(!e||t.target!==e)){E();var r=H(t.clientY);r!==null&&(t.preventDefault(),t.stopPropagation(),h(r))}}function H(t){var e=c();if(!e.length)return null;var r=A();if(!r.length)return null;for(var n=0;n<e.length;n++){var a=e[n].getBoundingClientRect();if(t<a.top)return I(r,n);if(t<=a.bottom)return null}return I(r,e.length)}function I(t,e){return t.indexOf(e)>=0?e:null}var u=null,C=null,Y=10;function $(t){var e=l();if(e&&!P(t.target)){if(t.target===e){var r=H(t.clientY);if(r===null){E();return}L(r);return}var n=q(t.clientY);if(n===null){E();return}L(n)}}function q(t){for(var e=c(),r=A(),n=0;n<r.length;n++){var a=r[n],o;if(a===0?o=e[0].getBoundingClientRect().top:o=e[a-1].getBoundingClientRect().bottom,Math.abs(t-o)<=Y)return a}return null}function L(t){var e=l(),r=m();if(!(!e||!r)){u||(u=r.createElement("div"),u.className="rte-gap-hint",u.setAttribute("contenteditable","false"),u.setAttribute("aria-hidden","true"),u.addEventListener("mousedown",function(a){a.preventDefault(),a.stopPropagation(),C!==null&&h(C)},!0));var n=c()[t]||null;if(u.parentNode===e&&u.nextSibling===n){C=t;return}e.insertBefore(u,n),C=t}}function E(){u&&u.parentNode&&u.parentNode.removeChild(u),C=null}function G(){E();try{typeof i.updateDesign=="function"&&i.updateDesign()}catch{}try{typeof i.fireChange=="function"&&i.fireChange()}catch{}}function J(){return".rte-gap-hint{height:6px;margin:1px 0;position:relative;cursor:text;pointer-events:auto;background:transparent;}.rte-gap-hint::before{content:'';position:absolute;left:0;right:0;top:2px;border-top:2px solid #2563eb;opacity:.65;}.rte-gap-hint::after{content:'';position:absolute;left:-3px;top:0;width:6px;height:6px;border-radius:50%;background:#2563eb;}"}function z(t){if(t){var e=J(),r=t.getElementById("rte-gapcursor-styles");if(r){if(r.getAttribute("data-css")===e)return;r.parentNode&&r.parentNode.removeChild(r)}var n=t.createElement("style");n.id="rte-gapcursor-styles",n.setAttribute("data-css",e),n.appendChild(t.createTextNode(e)),(t.head||t.getElementsByTagName("head")[0]||t.documentElement).appendChild(n),i&&typeof i.ensureStyleSheetLive=="function"&&i.ensureStyleSheetLive(t,n,"rte-gapcursor-styles",n.textContent)}}}
@@ -246,7 +246,7 @@ function RTE_Plugin_GhostComplete() {
246
246
  var tip = (host.ownerDocument || document).createElement("div");
247
247
  tip.className = "rte-ghost-hint";
248
248
  tip.setAttribute("role", "status");
249
- tip.textContent = "AI completion isn't configured — supply config.ghostTextResolver (or editor.setGhostTextResolver) to enable inline suggestions.";
249
+ tip.textContent = "AI completion isn't configured \u2014 supply config.ghostTextResolver (or editor.setGhostTextResolver) to enable inline suggestions.";
250
250
  tip.style.cssText = "position:absolute;left:50%;bottom:12px;transform:translateX(-50%);z-index:20;" +
251
251
  "max-width:90%;padding:7px 14px;border-radius:8px;background:#1f2937;color:#f9fafb;" +
252
252
  "font:12px/1.5 -apple-system,Segoe UI,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,.25);pointer-events:none";
@@ -229,7 +229,7 @@ function RTE_Plugin_Html2PDF() {
229
229
  imglink.setAttribute("href", imgurl);
230
230
  imglink.setAttribute("target", "_blank");
231
231
  imglink.download = "Export-" + ymd + "-" + hms + ".jpg";
232
- imglink.innerText = "Download Img";
232
+ imglink.innerText = ((typeof config !== "undefined" && config && config.text_pdf_dlimg) || "Download Img");
233
233
 
234
234
  //dialoginner.close();
235
235
 
@@ -1 +1 @@
1
- RTE_DefaultConfig.svgCode_html2pdf||(RTE_DefaultConfig.svgCode_html2pdf='<svg viewBox="-2 -2 36 36" fill="#5F6368"><polygon points="30 11 30 9 22 9 22 23 24 23 24 17 29 17 29 15 24 15 24 11 30 11"></polygon><path d="M8,9H2V23H4V18H8a2,2,0,0,0,2-2V11A2,2,0,0,0,8,9Zm0,7H4V11H8Z"></path><path d="M16,23H12V9h4a4,4,0,0,1,4,4v6A4,4,0,0,1,16,23Zm-2-2h2a2,2,0,0,0,2-2V13a2,2,0,0,0-2-2H14Z"></path><title>PDF</title></svg>'),RTE_DefaultConfig.plugin_html2pdf=RTE_Plugin_Html2PDF,typeof RTE_DefaultConfig.html2pdfScriptUrl>"u"&&(RTE_DefaultConfig.html2pdfScriptUrl=null);function RTE_Plugin_Html2PDF(){var w="/plugins/vendor/html2pdf.bundle.min.js";function y(t){try{return new URL(t,document.baseURI||location.href).href}catch{return t}}function E(){if(u&&u.html2pdfScriptUrl)return y(u.html2pdfScriptUrl);var t=u&&u.url_base?String(u.url_base).replace(/\/+$/,""):"";return y(t?t+w:"."+w)}var f=this,u,a;f.PluginName="Html2PDF",f.InitConfig=function(t){u=t},f.InitEditor=function(t){a=t,a.attachEvent("exec_command_html2pdf",function(e,r,i){f.DoHtml2PDF(),e.returnValue=!0}),a.toolbarFactoryMap.html2pdf=function(e){var r=a.createToolbarButton(e);return r.style.backgroundColor="",r}},f.GetPdfPageOptions=function(){var t={format:"letter",orientation:"portrait",margin:.5},e=null;try{a&&typeof a.getDocumentPageSetup=="function"&&(e=a.getDocumentPageSetup())}catch{e=null}if(!e||typeof e!="object")return t;var r={a3:1,a4:1,a5:1,letter:1,legal:1,tabloid:1},i=String(e.format||"").toLowerCase(),n=String(e.orientation||"").toLowerCase()==="landscape"?"landscape":t.orientation,o={format:r[i]?i:t.format,orientation:n,margin:t.margin},l=e.margins;if(l&&typeof l=="object"){var h=g(l.top),c=g(l.right),s=g(l.bottom),v=g(l.left);h!==null&&c!==null&&s!==null&&v!==null&&(o.margin=[h,c,s,v])}return o};function g(t){if(typeof t=="number"&&isFinite(t))return t;if(typeof t!="string")return null;var e=/^\s*(-?[\d.]+)\s*(mm|cm|in|px|pt)?\s*$/.exec(t);if(!e)return null;var r=parseFloat(e[1]);if(!isFinite(r))return null;switch(e[2]){case"mm":return r/25.4;case"cm":return r/2.54;case"pt":return r/72;case"px":return r/96;default:return r}}function p(t,e,r,i){var n=t.ownerDocument.createElement(e);return r&&(n.style.cssText=r),i&&(n.className=i),t.appendChild(n),n}function C(t){for(var e=t.split(","),r=e[0].match(/:(.*?);/)[1],i=atob(e[1]),n=i.length,o=new Uint8Array(n);n--;)o[n]=i.charCodeAt(n);return new Blob([o],{type:r})}f.DoHtml2PDF=function(){var t=a.createDialog("Html2PDF","rte-dialog-html2pdf"),e=p(t,"div","position:relative;text-align:center;");e.innerHTML="Loading...";var r=p(t,"div","position:relative;text-align:center;");window.html2pdf_callback=function(n){if(!n.html2pdf){e.innerHTML="Failed to load script.";return}e.innerHTML="Exporting...";var o=f.GetPdfPageOptions(),l={margin:o.margin,filename:"myfile.pdf",image:{type:"jpeg",quality:.98},html2canvas:{scale:2},jsPDF:{unit:"in",format:o.format,orientation:o.orientation}},h=n.html2pdf().set(l).from(n.document.body).outputImg();h.then(function(c){var s=c.getAttribute("src");if(s.indexOf("base64")==-1){e.innerHTML="Error, no data.";return}var v=C(s),D=URL.createObjectURL(v);c.setAttribute("src",D);var U=n.html2pdf().set(l).from(n.document.body).outputPdf();U.then(function(d){for(var _=new Array(d.length),b=0;b<d.length;b++)_[b]=d.charCodeAt(b);var F=new Blob([new Uint8Array(_)],{type:"application/pdf"}),L=URL.createObjectURL(F);e.innerHTML=Math.ceil(d.length/1024)+"KB Exported<br/><a href='"+L+"' target=_blank>Download PDF</a>";var T=e.querySelector("a"),m=new Date,H=String(m.getFullYear()*1e4+(m.getMonth()+1)*100+m.getDate()).substring(2),P=String(1e6+m.getHours()*1e4+m.getMinutes()*100+m.getSeconds()).substring(1);T.download="Export-"+H+"-"+P+".pdf",T.click(),c.style.cssText="max-width:300px;max-height:200px;margin:5px;padding:10px;border:solid 1px #eee;box-shadow:2px 2px 6px #eee",r.appendChild(c),p(r,"br");var x=p(r,"a");x.setAttribute("href",D),x.setAttribute("target","_blank"),x.download="Export-"+H+"-"+P+".jpg",x.innerText="Download Img"}).catch(function(d){console.error(d)})}).catch(function(c){console.error(c)})};var i=p(t,"div","position:relative;text-align:center;");iframe=p(i,"iframe","align-self:center;flex:99;width:100%;height:0px;border:0px;","rte-editable"),iframe.contentDocument.open("text/html"),iframe.contentDocument.write("<html><head><link id='url-css-preview' rel='stylesheet' href='"+a.htmlEncode(u.previewCssUrl)+"'/><script src='"+a.htmlEncode(E())+"'><\/script></head><body style='padding:10px;margin:0px'>"+a.getHTMLCode()+"</body><script>window.onload=function(){setTimeout(function(){parent.html2pdf_callback(window)},100)}<\/script></html>"),iframe.contentDocument.close()}}
1
+ RTE_DefaultConfig.svgCode_html2pdf||(RTE_DefaultConfig.svgCode_html2pdf='<svg viewBox="-2 -2 36 36" fill="#5F6368"><polygon points="30 11 30 9 22 9 22 23 24 23 24 17 29 17 29 15 24 15 24 11 30 11"></polygon><path d="M8,9H2V23H4V18H8a2,2,0,0,0,2-2V11A2,2,0,0,0,8,9Zm0,7H4V11H8Z"></path><path d="M16,23H12V9h4a4,4,0,0,1,4,4v6A4,4,0,0,1,16,23Zm-2-2h2a2,2,0,0,0,2-2V13a2,2,0,0,0-2-2H14Z"></path><title>PDF</title></svg>'),RTE_DefaultConfig.plugin_html2pdf=RTE_Plugin_Html2PDF,typeof RTE_DefaultConfig.html2pdfScriptUrl>"u"&&(RTE_DefaultConfig.html2pdfScriptUrl=null);function RTE_Plugin_Html2PDF(){var w="/plugins/vendor/html2pdf.bundle.min.js";function y(t){try{return new URL(t,document.baseURI||location.href).href}catch{return t}}function E(){if(a&&a.html2pdfScriptUrl)return y(a.html2pdfScriptUrl);var t=a&&a.url_base?String(a.url_base).replace(/\/+$/,""):"";return y(t?t+w:"."+w)}var u=this,a,i;u.PluginName="Html2PDF",u.InitConfig=function(t){a=t},u.InitEditor=function(t){i=t,i.attachEvent("exec_command_html2pdf",function(e,r,o){u.DoHtml2PDF(),e.returnValue=!0}),i.toolbarFactoryMap.html2pdf=function(e){var r=i.createToolbarButton(e);return r.style.backgroundColor="",r}},u.GetPdfPageOptions=function(){var t={format:"letter",orientation:"portrait",margin:.5},e=null;try{i&&typeof i.getDocumentPageSetup=="function"&&(e=i.getDocumentPageSetup())}catch{e=null}if(!e||typeof e!="object")return t;var r={a3:1,a4:1,a5:1,letter:1,legal:1,tabloid:1},o=String(e.format||"").toLowerCase(),n=String(e.orientation||"").toLowerCase()==="landscape"?"landscape":t.orientation,l={format:r[o]?o:t.format,orientation:n,margin:t.margin},c=e.margins;if(c&&typeof c=="object"){var h=g(c.top),f=g(c.right),s=g(c.bottom),v=g(c.left);h!==null&&f!==null&&s!==null&&v!==null&&(l.margin=[h,f,s,v])}return l};function g(t){if(typeof t=="number"&&isFinite(t))return t;if(typeof t!="string")return null;var e=/^\s*(-?[\d.]+)\s*(mm|cm|in|px|pt)?\s*$/.exec(t);if(!e)return null;var r=parseFloat(e[1]);if(!isFinite(r))return null;switch(e[2]){case"mm":return r/25.4;case"cm":return r/2.54;case"pt":return r/72;case"px":return r/96;default:return r}}function p(t,e,r,o){var n=t.ownerDocument.createElement(e);return r&&(n.style.cssText=r),o&&(n.className=o),t.appendChild(n),n}function C(t){for(var e=t.split(","),r=e[0].match(/:(.*?);/)[1],o=atob(e[1]),n=o.length,l=new Uint8Array(n);n--;)l[n]=o.charCodeAt(n);return new Blob([l],{type:r})}u.DoHtml2PDF=function(){var t=i.createDialog("Html2PDF","rte-dialog-html2pdf"),e=p(t,"div","position:relative;text-align:center;");e.innerHTML="Loading...";var r=p(t,"div","position:relative;text-align:center;");window.html2pdf_callback=function(n){if(!n.html2pdf){e.innerHTML="Failed to load script.";return}e.innerHTML="Exporting...";var l=u.GetPdfPageOptions(),c={margin:l.margin,filename:"myfile.pdf",image:{type:"jpeg",quality:.98},html2canvas:{scale:2},jsPDF:{unit:"in",format:l.format,orientation:l.orientation}},h=n.html2pdf().set(c).from(n.document.body).outputImg();h.then(function(f){var s=f.getAttribute("src");if(s.indexOf("base64")==-1){e.innerHTML="Error, no data.";return}var v=C(s),D=URL.createObjectURL(v);f.setAttribute("src",D);var U=n.html2pdf().set(c).from(n.document.body).outputPdf();U.then(function(d){for(var _=new Array(d.length),b=0;b<d.length;b++)_[b]=d.charCodeAt(b);var F=new Blob([new Uint8Array(_)],{type:"application/pdf"}),L=URL.createObjectURL(F);e.innerHTML=Math.ceil(d.length/1024)+"KB Exported<br/><a href='"+L+"' target=_blank>Download PDF</a>";var T=e.querySelector("a"),m=new Date,H=String(m.getFullYear()*1e4+(m.getMonth()+1)*100+m.getDate()).substring(2),P=String(1e6+m.getHours()*1e4+m.getMinutes()*100+m.getSeconds()).substring(1);T.download="Export-"+H+"-"+P+".pdf",T.click(),f.style.cssText="max-width:300px;max-height:200px;margin:5px;padding:10px;border:solid 1px #eee;box-shadow:2px 2px 6px #eee",r.appendChild(f),p(r,"br");var x=p(r,"a");x.setAttribute("href",D),x.setAttribute("target","_blank"),x.download="Export-"+H+"-"+P+".jpg",x.innerText=typeof a<"u"&&a&&a.text_pdf_dlimg||"Download Img"}).catch(function(d){console.error(d)})}).catch(function(f){console.error(f)})};var o=p(t,"div","position:relative;text-align:center;");iframe=p(o,"iframe","align-self:center;flex:99;width:100%;height:0px;border:0px;","rte-editable"),iframe.contentDocument.open("text/html"),iframe.contentDocument.write("<html><head><link id='url-css-preview' rel='stylesheet' href='"+i.htmlEncode(a.previewCssUrl)+"'/><script src='"+i.htmlEncode(E())+"'><\/script></head><body style='padding:10px;margin:0px'>"+i.getHTMLCode()+"</body><script>window.onload=function(){setTimeout(function(){parent.html2pdf_callback(window)},100)}<\/script></html>"),iframe.contentDocument.close()}}
@@ -16,6 +16,12 @@ function RTE_Plugin_ImageEditor() {
16
16
 
17
17
  obj.PluginName = "ImageEditor";
18
18
 
19
+ // 2026-10-18 the words read config.text_ keys (language packs), English as the fallback; {0} fills a template.
20
+ // tools/i18n/plugin-panels-language.mjs
21
+ function pText(key, fallback, arg) {
22
+ var s = (config && config["text_" + key]) || fallback;
23
+ return arg === undefined ? s : s.split("{0}").join(String(arg));
24
+ }
19
25
  obj.InitConfig = function (argconfig) {
20
26
  config = argconfig;
21
27
  }
@@ -85,7 +91,7 @@ function RTE_Plugin_ImageEditor() {
85
91
  if (!img)
86
92
  return;
87
93
 
88
- var dialoginner = editor.createDialog("ImageEditor", "rte-dialog-imageeditor");
94
+ var dialoginner = editor.createDialog(pText("ie_title", "Image editor"), "rte-dialog-imageeditor");
89
95
 
90
96
  dialoginner.style.width = "90%";
91
97
  dialoginner.style.height = "90%";
@@ -155,14 +161,14 @@ function RTE_Plugin_ImageEditor() {
155
161
  var btns = win.document.querySelector('.tui-image-editor-header-buttons');
156
162
  btns.innerHTML = '';
157
163
  var savebtn = __Append(btns, "button", "");
158
- savebtn.innerText = "Save";
164
+ savebtn.innerText = pText("ie_save", "Save");
159
165
  var status = __Append(btns, "div", "margin-left:10px;font-size:12px;color:#b42318;", "rte-imageeditor-upload-status");
160
166
  status.setAttribute("role", "status");
161
167
  status.setAttribute("aria-live", "polite");
162
168
  savebtn.onclick = function () {
163
169
  status.innerText = "";
164
170
  savebtn.disabled = true;
165
- savebtn.innerText = "Saving...";
171
+ savebtn.innerText = pText("ie_saving", "Saving...");
166
172
 
167
173
  var dataurl = imgeditor.toDataURL();
168
174
  var uploadHandler = config.file_upload_handler || window.rte_file_upload_handler;
@@ -183,13 +189,13 @@ function RTE_Plugin_ImageEditor() {
183
189
  return;
184
190
  }
185
191
  savebtn.disabled = false;
186
- savebtn.innerText = "Save";
192
+ savebtn.innerText = pText("ie_save", "Save");
187
193
  // Show what the server actually said. Blaming the connection sent
188
194
  // people chasing a network problem when the real answer was a
189
195
  // rejected file type or a size limit.
190
196
  status.innerText = error
191
- ? ("Upload failed: " + error)
192
- : "The upload did not return a file URL. Please try again.";
197
+ ? pText("ie_uploadfailed", "Upload failed: {0}", error)
198
+ : pText("ie_nourl", "The upload did not return a file URL. Please try again.");
193
199
  });
194
200
 
195
201
 
@@ -1 +1 @@
1
- RTE_DefaultConfig.svgCode_imageeditor||(RTE_DefaultConfig.svgCode_imageeditor='<svg viewBox="-2 -2 20 20" fill="#5F6368"><style>.st0{fill:#f6f6f6}.st1{fill:#424242}.st2{fill:none}.st3{fill:#f0eff1}</style><path class="st0" d="M1 0v6H0v10h10v-1h6V0z" id="outline"/><g id="icon_x5F_bg"><path class="st1" d="M2 5h1v1H2zM2 3h1v1H2zM2 1h1v1H2zM4 1h1.001v1H4zM6 1h1v1H6zM8 1h1v1H8zM10 1h1v1h-1zM12 1h1v1h-1zM14 1h1v1h-1zM14 3h1v1h-1zM14 5h1v1h-1zM14 7h1v1h-1zM14 9h1v1h-1zM14 10.999h1V12h-1zM14 13h1v1h-1zM12 13h1v1h-1zM11 11V5H5v1H4V4h8v7z"/><circle class="st1" cx="6.192" cy="9.807" r=".807"/><path class="st1" d="M1 7v8h8V7H1zm1 7.001v-.28l2.537-1.463L7.554 14l.001.001H2zm6-.93l-3.463-1.982L2 12.491v-4.49h6v5.07zM10 13h1v1h-1z"/></g><g id="icon_x5F_fg"><path class="st2" d="M2 14h5.554v.001H2z"/><path class="st3" d="M11 5v6h-1V6H5V5z"/><path class="st3" d="M2 12.491l2.537-1.402L8 13.071v-5.07H2v4.49zM6.192 9a.807.807 0 1 1 .001 1.615A.807.807 0 0 1 6.192 9z"/><path class="st3" d="M2 13.721V14h5.554l-3.017-1.742z"/></g></svg>'),RTE_DefaultConfig.plugin_imageeditor=RTE_Plugin_ImageEditor;function RTE_Plugin_ImageEditor(){var d=this,g,t;d.PluginName="ImageEditor",d.InitConfig=function(a){g=a},d.InitEditor=function(a){t=a,t.attachEvent("exec_command_imageeditor",function(n,e,i){d.DoImageEditor(),n.returnValue=!0}),t.toolbarFactoryMap.imageeditor=function(n){var e=t.createToolbarButton(n);return e.style.backgroundColor="",e}};function h(a,n,e,i){var o=a.ownerDocument.createElement(n);return e&&(o.style.cssText=e),i&&(o.className=i),a.appendChild(o),o}var p={"image/png":".png","image/jpeg":".jpg","image/jpg":".jpg","image/webp":".webp","image/gif":".gif","image/bmp":".bmp","image/avif":".avif"};function b(a,n){for(var e=a.split(","),i=e[0].match(/:(.*?);/)[1],o=atob(e[1]),l=o.length,s=new Uint8Array(l);l--;)s[l]=o.charCodeAt(l);var r=n||"image-"+new Date().getTime()+(p[i]||".png");try{return new File([s],r,{type:i})}catch{var c=new Blob([s],{type:i});return c.name=r,c}}d.DoImageEditor=function(){var a=t.getSelectedControl();if(a){var n=t.createDialog("ImageEditor","rte-dialog-imageeditor");n.style.width="90%",n.style.height="90%";var e=g.url_base+"/plugins/tui.image-editor/";window.rte_image_editor_callback=function(i){try{i.tui=i.tui||{},i.tui.usageStatistics=!1}catch{}var o={usageStatistics:!1,includeUI:{loadImage:{path:a.src,name:"RteImage"},usageStatistics:!1,theme:{"common.bi.image":"","common.bisize.width":"0","common.bisize.height":"0","menu.normalIcon.path":e+"svg/icon-d.svg","menu.activeIcon.path":e+"svg/icon-b.svg","menu.disabledIcon.path":e+"svg/icon-a.svg","menu.hoverIcon.path":e+"svg/icon-c.svg","submenu.normalIcon.path":e+"svg/icon-d.svg","submenu.normalIcon.name":"icon-d","submenu.activeIcon.path":e+"svg/icon-c.svg","submenu.activeIcon.name":"icon-c"},menuBarPosition:"bottom"},cssMaxWidth:700,cssMaxHeight:500,selectionStyle:{cornerSize:20,rotatingPointOffset:70}},l=new i.tui.ImageEditor(i.document.querySelector("#tui-image-editor"),o),s=i.document.querySelector(".tui-image-editor-header-buttons");s.innerHTML="";var r=h(s,"button","");r.innerText="Save";var c=h(s,"div","margin-left:10px;font-size:12px;color:#b42318;","rte-imageeditor-upload-status");c.setAttribute("role","status"),c.setAttribute("aria-live","polite"),r.onclick=function(){c.innerText="",r.disabled=!0,r.innerText="Saving...";var m=l.toDataURL(),u=g.file_upload_handler||window.rte_file_upload_handler;if(!u){a.src=m,t.notifySelectionChange(),n.close();return}var z=b(m);u(z,function(v,f){if(v){a.src=v,t.notifySelectionChange(),n.close();return}r.disabled=!1,r.innerText="Save",c.innerText=f?"Upload failed: "+f:"The upload did not return a file URL. Please try again."})}},iframe=h(n,"iframe","align-self:center;flex:99;width:100%;height:100%px;border:0px;","rte-editable"),iframe.contentDocument.open("text/html"),iframe.contentDocument.write("<html><head><base href='"+t.htmlEncode(location.href)+"'/><link id='url-css-preview' rel='stylesheet' href='"+t.htmlEncode(e+"tui-color-picker.min.css")+"'/><link id='url-css-preview' rel='stylesheet' href='"+t.htmlEncode(e+"tui-image-editor.min.css")+"'/><script src='"+t.htmlEncode(e+"fabric.min.js")+"'><\/script><script src='"+t.htmlEncode(e+"tui-color-picker.min.js")+"'><\/script><script src='"+t.htmlEncode(e+"tui-code-snippet.min.js")+"'><\/script><script src='"+t.htmlEncode(e+"tui-image-editor.min.js")+"'><\/script></head><body style='padding:10px;margin:0px'><div id='tui-image-editor'></div></body><script>window.onload=function(){setTimeout(function(){parent.rte_image_editor_callback(window)},100)}<\/script></html>"),iframe.contentDocument.close()}}}
1
+ RTE_DefaultConfig.svgCode_imageeditor||(RTE_DefaultConfig.svgCode_imageeditor='<svg viewBox="-2 -2 20 20" fill="#5F6368"><style>.st0{fill:#f6f6f6}.st1{fill:#424242}.st2{fill:none}.st3{fill:#f0eff1}</style><path class="st0" d="M1 0v6H0v10h10v-1h6V0z" id="outline"/><g id="icon_x5F_bg"><path class="st1" d="M2 5h1v1H2zM2 3h1v1H2zM2 1h1v1H2zM4 1h1.001v1H4zM6 1h1v1H6zM8 1h1v1H8zM10 1h1v1h-1zM12 1h1v1h-1zM14 1h1v1h-1zM14 3h1v1h-1zM14 5h1v1h-1zM14 7h1v1h-1zM14 9h1v1h-1zM14 10.999h1V12h-1zM14 13h1v1h-1zM12 13h1v1h-1zM11 11V5H5v1H4V4h8v7z"/><circle class="st1" cx="6.192" cy="9.807" r=".807"/><path class="st1" d="M1 7v8h8V7H1zm1 7.001v-.28l2.537-1.463L7.554 14l.001.001H2zm6-.93l-3.463-1.982L2 12.491v-4.49h6v5.07zM10 13h1v1h-1z"/></g><g id="icon_x5F_fg"><path class="st2" d="M2 14h5.554v.001H2z"/><path class="st3" d="M11 5v6h-1V6H5V5z"/><path class="st3" d="M2 12.491l2.537-1.402L8 13.071v-5.07H2v4.49zM6.192 9a.807.807 0 1 1 .001 1.615A.807.807 0 0 1 6.192 9z"/><path class="st3" d="M2 13.721V14h5.554l-3.017-1.742z"/></g></svg>'),RTE_DefaultConfig.plugin_imageeditor=RTE_Plugin_ImageEditor;function RTE_Plugin_ImageEditor(){var m=this,g,i;m.PluginName="ImageEditor";function l(a,n,e){var t=g&&g["text_"+a]||n;return e===void 0?t:t.split("{0}").join(String(e))}m.InitConfig=function(a){g=a},m.InitEditor=function(a){i=a,i.attachEvent("exec_command_imageeditor",function(n,e,t){m.DoImageEditor(),n.returnValue=!0}),i.toolbarFactoryMap.imageeditor=function(n){var e=i.createToolbarButton(n);return e.style.backgroundColor="",e}};function u(a,n,e,t){var o=a.ownerDocument.createElement(n);return e&&(o.style.cssText=e),t&&(o.className=t),a.appendChild(o),o}var b={"image/png":".png","image/jpeg":".jpg","image/jpg":".jpg","image/webp":".webp","image/gif":".gif","image/bmp":".bmp","image/avif":".avif"};function _(a,n){for(var e=a.split(","),t=e[0].match(/:(.*?);/)[1],o=atob(e[1]),d=o.length,s=new Uint8Array(d);d--;)s[d]=o.charCodeAt(d);var r=n||"image-"+new Date().getTime()+(b[t]||".png");try{return new File([s],r,{type:t})}catch{var c=new Blob([s],{type:t});return c.name=r,c}}m.DoImageEditor=function(){var a=i.getSelectedControl();if(a){var n=i.createDialog(l("ie_title","Image editor"),"rte-dialog-imageeditor");n.style.width="90%",n.style.height="90%";var e=g.url_base+"/plugins/tui.image-editor/";window.rte_image_editor_callback=function(t){try{t.tui=t.tui||{},t.tui.usageStatistics=!1}catch{}var o={usageStatistics:!1,includeUI:{loadImage:{path:a.src,name:"RteImage"},usageStatistics:!1,theme:{"common.bi.image":"","common.bisize.width":"0","common.bisize.height":"0","menu.normalIcon.path":e+"svg/icon-d.svg","menu.activeIcon.path":e+"svg/icon-b.svg","menu.disabledIcon.path":e+"svg/icon-a.svg","menu.hoverIcon.path":e+"svg/icon-c.svg","submenu.normalIcon.path":e+"svg/icon-d.svg","submenu.normalIcon.name":"icon-d","submenu.activeIcon.path":e+"svg/icon-c.svg","submenu.activeIcon.name":"icon-c"},menuBarPosition:"bottom"},cssMaxWidth:700,cssMaxHeight:500,selectionStyle:{cornerSize:20,rotatingPointOffset:70}},d=new t.tui.ImageEditor(t.document.querySelector("#tui-image-editor"),o),s=t.document.querySelector(".tui-image-editor-header-buttons");s.innerHTML="";var r=u(s,"button","");r.innerText=l("ie_save","Save");var c=u(s,"div","margin-left:10px;font-size:12px;color:#b42318;","rte-imageeditor-upload-status");c.setAttribute("role","status"),c.setAttribute("aria-live","polite"),r.onclick=function(){c.innerText="",r.disabled=!0,r.innerText=l("ie_saving","Saving...");var h=d.toDataURL(),v=g.file_upload_handler||window.rte_file_upload_handler;if(!v){a.src=h,i.notifySelectionChange(),n.close();return}var z=_(h);v(z,function(f,p){if(f){a.src=f,i.notifySelectionChange(),n.close();return}r.disabled=!1,r.innerText=l("ie_save","Save"),c.innerText=p?l("ie_uploadfailed","Upload failed: {0}",p):l("ie_nourl","The upload did not return a file URL. Please try again.")})}},iframe=u(n,"iframe","align-self:center;flex:99;width:100%;height:100%px;border:0px;","rte-editable"),iframe.contentDocument.open("text/html"),iframe.contentDocument.write("<html><head><base href='"+i.htmlEncode(location.href)+"'/><link id='url-css-preview' rel='stylesheet' href='"+i.htmlEncode(e+"tui-color-picker.min.css")+"'/><link id='url-css-preview' rel='stylesheet' href='"+i.htmlEncode(e+"tui-image-editor.min.css")+"'/><script src='"+i.htmlEncode(e+"fabric.min.js")+"'><\/script><script src='"+i.htmlEncode(e+"tui-color-picker.min.js")+"'><\/script><script src='"+i.htmlEncode(e+"tui-code-snippet.min.js")+"'><\/script><script src='"+i.htmlEncode(e+"tui-image-editor.min.js")+"'><\/script></head><body style='padding:10px;margin:0px'><div id='tui-image-editor'></div></body><script>window.onload=function(){setTimeout(function(){parent.rte_image_editor_callback(window)},100)}<\/script></html>"),iframe.contentDocument.close()}}}
@@ -292,7 +292,7 @@ function RTE_Plugin_ImportStyles() {
292
292
  for (var key2 in truncated) if (truncated.hasOwnProperty(key2)) dropped += truncated[key2];
293
293
  if (dropped) {
294
294
  try {
295
- console.warn("[RichTextEditor] importStyles: " + dropped + " class(es) omitted — " +
295
+ console.warn("[RichTextEditor] importStyles: " + dropped + " class(es) omitted \u2014 " +
296
296
  "importStylesLimit is " + limit + " per dropdown. Raise the limit or narrow " +
297
297
  "importStylesSheets / importStylesFilter.");
298
298
  } catch (e) {}
@@ -240,7 +240,10 @@ function RTE_Plugin_InlineCode() {
240
240
  if (!range) return false;
241
241
  if (!editable.contains(range.startContainer)) return false;
242
242
 
243
+ // 2026-10-04 a caret is put back at its place in the word afterwards
244
+ var caretNode = range.collapsed ? range.startContainer : null, caretOff = range.startOffset, wordStart = 0;
243
245
  if (range.collapsed && !expandToWord(range)) return false;
246
+ if (caretNode) wordStart = range.startOffset;
244
247
 
245
248
  var nodes = selectedTextNodes(doc, range, editable);
246
249
  if (!nodes.length) return false;
@@ -264,6 +267,28 @@ function RTE_Plugin_InlineCode() {
264
267
  mergeAdjacent(editable);
265
268
  }
266
269
 
270
+ // 2026-10-04 The text stays selected (CKEditor Code). Wrapping/unwrapping moved the text nodes and
271
+ // dropped the selection - all of it in one paragraph, the first half across two - so a second
272
+ // press did nothing or un-coded only half. tools/formatting/inline-code-selection.mjs
273
+ try {
274
+ var first = nodes[0], last = nodes[nodes.length - 1];
275
+ if (editable.contains(first) && editable.contains(last)) {
276
+ var nr = doc.createRange();
277
+ if (caretNode) {
278
+ // the word was split at its start, so the caret's offset is relative to it
279
+ var at = caretNode === first ? caretOff : caretOff - wordStart;
280
+ nr.setStart(first, Math.max(0, Math.min(at, first.data.length)));
281
+ nr.collapse(true);
282
+ }
283
+ else {
284
+ nr.setStart(first, 0);
285
+ nr.setEnd(last, last.data.length);
286
+ }
287
+ var sel = doc.getSelection();
288
+ sel.removeAllRanges();
289
+ sel.addRange(nr);
290
+ }
291
+ } catch (e) { }
267
292
  try { editor.updateToolbarStatus && editor.updateToolbarStatus(); } catch (e) { }
268
293
  return true;
269
294
  };
@@ -1 +1 @@
1
- window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_inlinecode=RTE_Plugin_InlineCode,RTE_DefaultConfig.text_inlinecode||(RTE_DefaultConfig.text_inlinecode="Inline code"),RTE_DefaultConfig.svgCode_inlinecode||(RTE_DefaultConfig.svgCode_inlinecode='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="7 8 3 12 7 16"/><polyline points="17 8 21 12 17 16"/></svg>');function RTE_Plugin_InlineCode(){var d=this,E,v;d.PluginName="InlineCode",d.InitConfig=function(t){E=t},d.InitEditor=function(t){v=t,v.attachEvent("exec_command_inlinecode",function(e){e.returnValue=!0,d.Toggle()}),v.toggleInlineCode=function(){return d.Toggle()},v.isInlineCode=function(){return d.IsActive()}};function p(){try{return v.getDocument()}catch{return null}}function g(){try{return v.getEditable()}catch{return null}}function T(t){var e=t&&t.getSelection?t.getSelection():null;return!e||!e.rangeCount?null:e.getRangeAt(0)}function c(t,e){for(;t&&t!==e;){if(t.nodeType===1&&t.nodeName==="CODE")return t;t=t.parentNode}return null}function N(t,e){for(;t&&t!==e;){if(t.nodeType===1&&t.nodeName==="PRE")return!0;t=t.parentNode}return!1}d.IsActive=function(){var t=p(),e=g();if(!t||!e)return!1;var r=T(t);return r?!!c(r.startContainer,e):!1};function _(t){var e=t.startContainer;if(!e||e.nodeType!==3)return!1;for(var r=e.data||"",n=t.startOffset,i=n,a=n;i>0&&/\S/.test(r.charAt(i-1));)i--;for(;a<r.length&&/\S/.test(r.charAt(a));)a++;return i===a?!1:(t.setStart(e,i),t.setEnd(e,a),!0)}function S(t,e,r){if(e.startContainer.nodeType===3&&e.startOffset>0){var n=e.startContainer;if(e.startOffset<n.data.length){var i=n.splitText(e.startOffset),a=e.endContainer===n,l=e.endOffset;e.setStart(i,0),a&&e.setEnd(i,l-n.data.length)}}e.endContainer.nodeType===3&&e.endOffset<e.endContainer.data.length&&e.endOffset>0&&e.endContainer.splitText(e.endOffset);for(var u=[],f=t.createTreeWalker(r,4,null,!1),o;o=f.nextNode();)if(o.data&&(!e.intersectsNode||e.intersectsNode(o))){var s=t.createRange();s.selectNodeContents(o),e.compareBoundaryPoints(Range.END_TO_START,s)<0&&e.compareBoundaryPoints(Range.START_TO_END,s)>0&&u.push(o)}return u}function R(t,e,r){var n=e.parentNode;if(n){var i=e.contains(r.startContainer),a=e.contains(r.endContainer),l=t.createRange();a?l.setStart(r.endContainer,r.endOffset):l.setStart(e,e.childNodes.length),l.setEnd(e,e.childNodes.length);var u=l.extractContents(),f=t.createRange();f.setStart(e,0),i?f.setEnd(r.startContainer,r.startOffset):f.setEnd(e,0);var o=f.extractContents();if(o&&o.textContent!==""){var s=t.createElement("code");s.appendChild(o),n.insertBefore(s,e)}for(;e.firstChild;)n.insertBefore(e.firstChild,e);if(u&&u.textContent!==""){var h=t.createElement("code");h.appendChild(u),n.insertBefore(h,e)}n.removeChild(e)}}function w(t,e,r){for(var n=[],i=[],a=0;a<e.length;a++){var l=e[a];N(l,r)||c(l,r)||(n.length&&n[n.length-1].parentNode===l.parentNode&&n[n.length-1].nextSibling===l?n.push(l):(n.length&&i.push(n),n=[l]))}n.length&&i.push(n);for(var u=0;u<i.length;u++){for(var f=i[u],o="",s=0;s<f.length;s++)o+=f[s].data;if(/\S/.test(o)){var h=t.createElement("code");f[0].parentNode.insertBefore(h,f[0]);for(var C=0;C<f.length;C++)h.appendChild(f[C])}}}function m(t){for(var e=t.querySelectorAll("code"),r=0;r<e.length;r++)for(var n=e[r],i=n.nextSibling;i&&i.nodeType===1&&i.nodeName==="CODE";){for(;i.firstChild;)n.appendChild(i.firstChild);i.parentNode.removeChild(i),i=n.nextSibling}}d.Toggle=function(){var t=p(),e=g();if(!t||!e)return!1;var r=T(t);if(!r||!e.contains(r.startContainer)||r.collapsed&&!_(r))return!1;var n=S(t,r,e);if(!n.length)return!1;for(var i=!0,a=0;a<n.length;a++)if(/\S/.test(n[a].data)&&!c(n[a],e)){i=!1;break}if(i){for(var l=[],u=[],f=0;f<n.length;f++){var o=c(n[f],e);o&&u.indexOf(o)<0&&(u.push(o),l.push(o))}for(var s=0;s<l.length;s++)R(t,l[s],r)}else w(t,n,e),m(e);try{v.updateToolbarStatus&&v.updateToolbarStatus()}catch{}return!0}}
1
+ window.RTE_DefaultConfig||(window.RTE_DefaultConfig={}),RTE_DefaultConfig.plugin_inlinecode=RTE_Plugin_InlineCode,RTE_DefaultConfig.text_inlinecode||(RTE_DefaultConfig.text_inlinecode="Inline code"),RTE_DefaultConfig.svgCode_inlinecode||(RTE_DefaultConfig.svgCode_inlinecode='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="7 8 3 12 7 16"/><polyline points="17 8 21 12 17 16"/></svg>');function RTE_Plugin_InlineCode(){var v=this,m,c;v.PluginName="InlineCode",v.InitConfig=function(t){m=t},v.InitEditor=function(t){c=t,c.attachEvent("exec_command_inlinecode",function(e){e.returnValue=!0,v.Toggle()}),c.toggleInlineCode=function(){return v.Toggle()},c.isInlineCode=function(){return v.IsActive()}};function S(){try{return c.getDocument()}catch{return null}}function N(){try{return c.getEditable()}catch{return null}}function R(t){var e=t&&t.getSelection?t.getSelection():null;return!e||!e.rangeCount?null:e.getRangeAt(0)}function C(t,e){for(;t&&t!==e;){if(t.nodeType===1&&t.nodeName==="CODE")return t;t=t.parentNode}return null}function w(t,e){for(;t&&t!==e;){if(t.nodeType===1&&t.nodeName==="PRE")return!0;t=t.parentNode}return!1}v.IsActive=function(){var t=S(),e=N();if(!t||!e)return!1;var n=R(t);return n?!!C(n.startContainer,e):!1};function O(t){var e=t.startContainer;if(!e||e.nodeType!==3)return!1;for(var n=e.data||"",r=t.startOffset,a=r,o=r;a>0&&/\S/.test(n.charAt(a-1));)a--;for(;o<n.length&&/\S/.test(n.charAt(o));)o++;return a===o?!1:(t.setStart(e,a),t.setEnd(e,o),!0)}function y(t,e,n){if(e.startContainer.nodeType===3&&e.startOffset>0){var r=e.startContainer;if(e.startOffset<r.data.length){var a=r.splitText(e.startOffset),o=e.endContainer===r,i=e.endOffset;e.setStart(a,0),o&&e.setEnd(a,i-r.data.length)}}e.endContainer.nodeType===3&&e.endOffset<e.endContainer.data.length&&e.endOffset>0&&e.endContainer.splitText(e.endOffset);for(var s=[],l=t.createTreeWalker(n,4,null,!1),f;f=l.nextNode();)if(f.data&&(!e.intersectsNode||e.intersectsNode(f))){var u=t.createRange();u.selectNodeContents(f),e.compareBoundaryPoints(Range.END_TO_START,u)<0&&e.compareBoundaryPoints(Range.START_TO_END,u)>0&&s.push(f)}return s}function D(t,e,n){var r=e.parentNode;if(r){var a=e.contains(n.startContainer),o=e.contains(n.endContainer),i=t.createRange();o?i.setStart(n.endContainer,n.endOffset):i.setStart(e,e.childNodes.length),i.setEnd(e,e.childNodes.length);var s=i.extractContents(),l=t.createRange();l.setStart(e,0),a?l.setEnd(n.startContainer,n.startOffset):l.setEnd(e,0);var f=l.extractContents();if(f&&f.textContent!==""){var u=t.createElement("code");u.appendChild(f),r.insertBefore(u,e)}for(;e.firstChild;)r.insertBefore(e.firstChild,e);if(s&&s.textContent!==""){var d=t.createElement("code");d.appendChild(s),r.insertBefore(d,e)}r.removeChild(e)}}function b(t,e,n){for(var r=[],a=[],o=0;o<e.length;o++){var i=e[o];w(i,n)||C(i,n)||(r.length&&r[r.length-1].parentNode===i.parentNode&&r[r.length-1].nextSibling===i?r.push(i):(r.length&&a.push(r),r=[i]))}r.length&&a.push(r);for(var s=0;s<a.length;s++){for(var l=a[s],f="",u=0;u<l.length;u++)f+=l[u].data;if(/\S/.test(f)){var d=t.createElement("code");l[0].parentNode.insertBefore(d,l[0]);for(var h=0;h<l.length;h++)d.appendChild(l[h])}}}function A(t){for(var e=t.querySelectorAll("code"),n=0;n<e.length;n++)for(var r=e[n],a=r.nextSibling;a&&a.nodeType===1&&a.nodeName==="CODE";){for(;a.firstChild;)r.appendChild(a.firstChild);a.parentNode.removeChild(a),a=r.nextSibling}}v.Toggle=function(){var t=S(),e=N();if(!t||!e)return!1;var n=R(t);if(!n||!e.contains(n.startContainer))return!1;var r=n.collapsed?n.startContainer:null,a=n.startOffset,o=0;if(n.collapsed&&!O(n))return!1;r&&(o=n.startOffset);var i=y(t,n,e);if(!i.length)return!1;for(var s=!0,l=0;l<i.length;l++)if(/\S/.test(i[l].data)&&!C(i[l],e)){s=!1;break}if(s){for(var f=[],u=[],d=0;d<i.length;d++){var h=C(i[d],e);h&&u.indexOf(h)<0&&(u.push(h),f.push(h))}for(var T=0;T<f.length;T++)D(t,f[T],n)}else b(t,i,e),A(e);try{var g=i[0],E=i[i.length-1];if(e.contains(g)&&e.contains(E)){var p=t.createRange();if(r){var I=r===g?a:a-o;p.setStart(g,Math.max(0,Math.min(I,g.data.length))),p.collapse(!0)}else p.setStart(g,0),p.setEnd(E,E.data.length);var _=t.getSelection();_.removeAllRanges(),_.addRange(p)}}catch{}try{c.updateToolbarStatus&&c.updateToolbarStatus()}catch{}return!0}}