santrix 0.1.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 (229) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/NOTICE.md +18 -0
  3. package/README.md +107 -0
  4. package/js/santrix/README.md +161 -0
  5. package/js/santrix/icons/default/icons.js +198 -0
  6. package/js/santrix/icons/default/icons.min.js +1 -0
  7. package/js/santrix/langs/README.md +3 -0
  8. package/js/santrix/license.txt +22 -0
  9. package/js/santrix/models/dom/model.js +8054 -0
  10. package/js/santrix/models/dom/model.min.js +7 -0
  11. package/js/santrix/plugins/accordion/plugin.js +1057 -0
  12. package/js/santrix/plugins/accordion/plugin.min.js +7 -0
  13. package/js/santrix/plugins/advlist/plugin.js +262 -0
  14. package/js/santrix/plugins/advlist/plugin.min.js +7 -0
  15. package/js/santrix/plugins/anchor/plugin.js +217 -0
  16. package/js/santrix/plugins/anchor/plugin.min.js +7 -0
  17. package/js/santrix/plugins/autolink/plugin.js +231 -0
  18. package/js/santrix/plugins/autolink/plugin.min.js +7 -0
  19. package/js/santrix/plugins/autoresize/plugin.js +195 -0
  20. package/js/santrix/plugins/autoresize/plugin.min.js +7 -0
  21. package/js/santrix/plugins/autosave/plugin.js +236 -0
  22. package/js/santrix/plugins/autosave/plugin.min.js +7 -0
  23. package/js/santrix/plugins/charmap/plugin.js +1661 -0
  24. package/js/santrix/plugins/charmap/plugin.min.js +7 -0
  25. package/js/santrix/plugins/code/plugin.js +88 -0
  26. package/js/santrix/plugins/code/plugin.min.js +7 -0
  27. package/js/santrix/plugins/codesample/plugin.js +2474 -0
  28. package/js/santrix/plugins/codesample/plugin.min.js +14 -0
  29. package/js/santrix/plugins/directionality/plugin.js +398 -0
  30. package/js/santrix/plugins/directionality/plugin.min.js +7 -0
  31. package/js/santrix/plugins/emoticons/js/emojiimages.js +1 -0
  32. package/js/santrix/plugins/emoticons/js/emojiimages.min.js +3 -0
  33. package/js/santrix/plugins/emoticons/js/emojis.js +1 -0
  34. package/js/santrix/plugins/emoticons/js/emojis.min.js +2 -0
  35. package/js/santrix/plugins/emoticons/plugin.js +599 -0
  36. package/js/santrix/plugins/emoticons/plugin.min.js +7 -0
  37. package/js/santrix/plugins/fullscreen/plugin.js +1253 -0
  38. package/js/santrix/plugins/fullscreen/plugin.min.js +7 -0
  39. package/js/santrix/plugins/help/js/i18n/keynav/ar.js +90 -0
  40. package/js/santrix/plugins/help/js/i18n/keynav/bg_BG.js +90 -0
  41. package/js/santrix/plugins/help/js/i18n/keynav/ca.js +90 -0
  42. package/js/santrix/plugins/help/js/i18n/keynav/cs.js +90 -0
  43. package/js/santrix/plugins/help/js/i18n/keynav/da.js +90 -0
  44. package/js/santrix/plugins/help/js/i18n/keynav/de.js +90 -0
  45. package/js/santrix/plugins/help/js/i18n/keynav/el.js +90 -0
  46. package/js/santrix/plugins/help/js/i18n/keynav/en.js +90 -0
  47. package/js/santrix/plugins/help/js/i18n/keynav/es.js +90 -0
  48. package/js/santrix/plugins/help/js/i18n/keynav/eu.js +90 -0
  49. package/js/santrix/plugins/help/js/i18n/keynav/fa.js +90 -0
  50. package/js/santrix/plugins/help/js/i18n/keynav/fi.js +90 -0
  51. package/js/santrix/plugins/help/js/i18n/keynav/fr_FR.js +90 -0
  52. package/js/santrix/plugins/help/js/i18n/keynav/he_IL.js +90 -0
  53. package/js/santrix/plugins/help/js/i18n/keynav/hi.js +90 -0
  54. package/js/santrix/plugins/help/js/i18n/keynav/hr.js +90 -0
  55. package/js/santrix/plugins/help/js/i18n/keynav/hu_HU.js +90 -0
  56. package/js/santrix/plugins/help/js/i18n/keynav/id.js +90 -0
  57. package/js/santrix/plugins/help/js/i18n/keynav/it.js +90 -0
  58. package/js/santrix/plugins/help/js/i18n/keynav/ja.js +90 -0
  59. package/js/santrix/plugins/help/js/i18n/keynav/kk.js +90 -0
  60. package/js/santrix/plugins/help/js/i18n/keynav/ko_KR.js +90 -0
  61. package/js/santrix/plugins/help/js/i18n/keynav/ms.js +90 -0
  62. package/js/santrix/plugins/help/js/i18n/keynav/nb_NO.js +90 -0
  63. package/js/santrix/plugins/help/js/i18n/keynav/nl.js +90 -0
  64. package/js/santrix/plugins/help/js/i18n/keynav/pl.js +90 -0
  65. package/js/santrix/plugins/help/js/i18n/keynav/pt_BR.js +90 -0
  66. package/js/santrix/plugins/help/js/i18n/keynav/pt_PT.js +90 -0
  67. package/js/santrix/plugins/help/js/i18n/keynav/ro.js +90 -0
  68. package/js/santrix/plugins/help/js/i18n/keynav/ru.js +90 -0
  69. package/js/santrix/plugins/help/js/i18n/keynav/sk.js +90 -0
  70. package/js/santrix/plugins/help/js/i18n/keynav/sl_SI.js +90 -0
  71. package/js/santrix/plugins/help/js/i18n/keynav/sv_SE.js +90 -0
  72. package/js/santrix/plugins/help/js/i18n/keynav/th_TH.js +90 -0
  73. package/js/santrix/plugins/help/js/i18n/keynav/tr.js +90 -0
  74. package/js/santrix/plugins/help/js/i18n/keynav/uk.js +90 -0
  75. package/js/santrix/plugins/help/js/i18n/keynav/vi.js +90 -0
  76. package/js/santrix/plugins/help/js/i18n/keynav/zh_CN.js +84 -0
  77. package/js/santrix/plugins/help/js/i18n/keynav/zh_TW.js +90 -0
  78. package/js/santrix/plugins/help/plugin.js +750 -0
  79. package/js/santrix/plugins/help/plugin.min.js +7 -0
  80. package/js/santrix/plugins/image/plugin.js +1508 -0
  81. package/js/santrix/plugins/image/plugin.min.js +7 -0
  82. package/js/santrix/plugins/importcss/plugin.js +347 -0
  83. package/js/santrix/plugins/importcss/plugin.min.js +7 -0
  84. package/js/santrix/plugins/insertdatetime/plugin.js +190 -0
  85. package/js/santrix/plugins/insertdatetime/plugin.min.js +7 -0
  86. package/js/santrix/plugins/link/plugin.js +1246 -0
  87. package/js/santrix/plugins/link/plugin.min.js +7 -0
  88. package/js/santrix/plugins/lists/plugin.js +2175 -0
  89. package/js/santrix/plugins/lists/plugin.min.js +7 -0
  90. package/js/santrix/plugins/media/plugin.js +1220 -0
  91. package/js/santrix/plugins/media/plugin.min.js +7 -0
  92. package/js/santrix/plugins/nonbreaking/plugin.js +126 -0
  93. package/js/santrix/plugins/nonbreaking/plugin.min.js +7 -0
  94. package/js/santrix/plugins/pagebreak/plugin.js +120 -0
  95. package/js/santrix/plugins/pagebreak/plugin.min.js +7 -0
  96. package/js/santrix/plugins/preview/plugin.js +100 -0
  97. package/js/santrix/plugins/preview/plugin.min.js +7 -0
  98. package/js/santrix/plugins/quickbars/plugin.js +450 -0
  99. package/js/santrix/plugins/quickbars/plugin.min.js +7 -0
  100. package/js/santrix/plugins/save/plugin.js +122 -0
  101. package/js/santrix/plugins/save/plugin.min.js +7 -0
  102. package/js/santrix/plugins/searchreplace/plugin.js +1097 -0
  103. package/js/santrix/plugins/searchreplace/plugin.min.js +7 -0
  104. package/js/santrix/plugins/table/plugin.js +3468 -0
  105. package/js/santrix/plugins/table/plugin.min.js +7 -0
  106. package/js/santrix/plugins/template/plugin.js +570 -0
  107. package/js/santrix/plugins/template/plugin.min.js +7 -0
  108. package/js/santrix/plugins/visualblocks/plugin.js +101 -0
  109. package/js/santrix/plugins/visualblocks/plugin.min.js +7 -0
  110. package/js/santrix/plugins/visualchars/plugin.js +563 -0
  111. package/js/santrix/plugins/visualchars/plugin.min.js +7 -0
  112. package/js/santrix/plugins/wordcount/plugin.js +408 -0
  113. package/js/santrix/plugins/wordcount/plugin.min.js +7 -0
  114. package/js/santrix/santrix.d.ts +3252 -0
  115. package/js/santrix/santrix.js +31756 -0
  116. package/js/santrix/santrix.min.js +339 -0
  117. package/js/santrix/skins/content/dark/content.css +66 -0
  118. package/js/santrix/skins/content/dark/content.js +2 -0
  119. package/js/santrix/skins/content/dark/content.js.map +1 -0
  120. package/js/santrix/skins/content/dark/content.min.css +2 -0
  121. package/js/santrix/skins/content/dark/content.min.css.map +1 -0
  122. package/js/santrix/skins/content/default/content.css +61 -0
  123. package/js/santrix/skins/content/default/content.js +2 -0
  124. package/js/santrix/skins/content/default/content.js.map +1 -0
  125. package/js/santrix/skins/content/default/content.min.css +2 -0
  126. package/js/santrix/skins/content/default/content.min.css.map +1 -0
  127. package/js/santrix/skins/content/document/content.css +66 -0
  128. package/js/santrix/skins/content/document/content.js +2 -0
  129. package/js/santrix/skins/content/document/content.js.map +1 -0
  130. package/js/santrix/skins/content/document/content.min.css +2 -0
  131. package/js/santrix/skins/content/document/content.min.css.map +1 -0
  132. package/js/santrix/skins/content/santrix-5/content.css +61 -0
  133. package/js/santrix/skins/content/santrix-5/content.js +2 -0
  134. package/js/santrix/skins/content/santrix-5/content.js.map +1 -0
  135. package/js/santrix/skins/content/santrix-5/content.min.css +2 -0
  136. package/js/santrix/skins/content/santrix-5/content.min.css.map +1 -0
  137. package/js/santrix/skins/content/santrix-5-dark/content.css +66 -0
  138. package/js/santrix/skins/content/santrix-5-dark/content.js +2 -0
  139. package/js/santrix/skins/content/santrix-5-dark/content.js.map +1 -0
  140. package/js/santrix/skins/content/santrix-5-dark/content.min.css +2 -0
  141. package/js/santrix/skins/content/santrix-5-dark/content.min.css.map +1 -0
  142. package/js/santrix/skins/content/writer/content.css +62 -0
  143. package/js/santrix/skins/content/writer/content.js +2 -0
  144. package/js/santrix/skins/content/writer/content.js.map +1 -0
  145. package/js/santrix/skins/content/writer/content.min.css +2 -0
  146. package/js/santrix/skins/content/writer/content.min.css.map +1 -0
  147. package/js/santrix/skins/ui/oxide/content.css +785 -0
  148. package/js/santrix/skins/ui/oxide/content.inline.css +779 -0
  149. package/js/santrix/skins/ui/oxide/content.inline.js +2 -0
  150. package/js/santrix/skins/ui/oxide/content.inline.js.map +1 -0
  151. package/js/santrix/skins/ui/oxide/content.inline.min.css +2 -0
  152. package/js/santrix/skins/ui/oxide/content.inline.min.css.map +1 -0
  153. package/js/santrix/skins/ui/oxide/content.js +2 -0
  154. package/js/santrix/skins/ui/oxide/content.js.map +1 -0
  155. package/js/santrix/skins/ui/oxide/content.min.css +2 -0
  156. package/js/santrix/skins/ui/oxide/content.min.css.map +1 -0
  157. package/js/santrix/skins/ui/oxide/skin.css +4029 -0
  158. package/js/santrix/skins/ui/oxide/skin.js +2 -0
  159. package/js/santrix/skins/ui/oxide/skin.js.map +1 -0
  160. package/js/santrix/skins/ui/oxide/skin.min.css +2 -0
  161. package/js/santrix/skins/ui/oxide/skin.min.css.map +1 -0
  162. package/js/santrix/skins/ui/oxide/skin.shadowdom.css +30 -0
  163. package/js/santrix/skins/ui/oxide/skin.shadowdom.js +2 -0
  164. package/js/santrix/skins/ui/oxide/skin.shadowdom.js.map +1 -0
  165. package/js/santrix/skins/ui/oxide/skin.shadowdom.min.css +2 -0
  166. package/js/santrix/skins/ui/oxide/skin.shadowdom.min.css.map +1 -0
  167. package/js/santrix/skins/ui/oxide-dark/content.css +766 -0
  168. package/js/santrix/skins/ui/oxide-dark/content.inline.css +779 -0
  169. package/js/santrix/skins/ui/oxide-dark/content.inline.js +2 -0
  170. package/js/santrix/skins/ui/oxide-dark/content.inline.js.map +1 -0
  171. package/js/santrix/skins/ui/oxide-dark/content.inline.min.css +2 -0
  172. package/js/santrix/skins/ui/oxide-dark/content.inline.min.css.map +1 -0
  173. package/js/santrix/skins/ui/oxide-dark/content.js +2 -0
  174. package/js/santrix/skins/ui/oxide-dark/content.js.map +1 -0
  175. package/js/santrix/skins/ui/oxide-dark/content.min.css +2 -0
  176. package/js/santrix/skins/ui/oxide-dark/content.min.css.map +1 -0
  177. package/js/santrix/skins/ui/oxide-dark/skin.css +4032 -0
  178. package/js/santrix/skins/ui/oxide-dark/skin.js +2 -0
  179. package/js/santrix/skins/ui/oxide-dark/skin.js.map +1 -0
  180. package/js/santrix/skins/ui/oxide-dark/skin.min.css +2 -0
  181. package/js/santrix/skins/ui/oxide-dark/skin.min.css.map +1 -0
  182. package/js/santrix/skins/ui/oxide-dark/skin.shadowdom.css +30 -0
  183. package/js/santrix/skins/ui/oxide-dark/skin.shadowdom.js +2 -0
  184. package/js/santrix/skins/ui/oxide-dark/skin.shadowdom.js.map +1 -0
  185. package/js/santrix/skins/ui/oxide-dark/skin.shadowdom.min.css +2 -0
  186. package/js/santrix/skins/ui/oxide-dark/skin.shadowdom.min.css.map +1 -0
  187. package/js/santrix/skins/ui/santrix-5/content.css +785 -0
  188. package/js/santrix/skins/ui/santrix-5/content.inline.css +779 -0
  189. package/js/santrix/skins/ui/santrix-5/content.inline.js +2 -0
  190. package/js/santrix/skins/ui/santrix-5/content.inline.js.map +1 -0
  191. package/js/santrix/skins/ui/santrix-5/content.inline.min.css +2 -0
  192. package/js/santrix/skins/ui/santrix-5/content.inline.min.css.map +1 -0
  193. package/js/santrix/skins/ui/santrix-5/content.js +2 -0
  194. package/js/santrix/skins/ui/santrix-5/content.js.map +1 -0
  195. package/js/santrix/skins/ui/santrix-5/content.min.css +2 -0
  196. package/js/santrix/skins/ui/santrix-5/content.min.css.map +1 -0
  197. package/js/santrix/skins/ui/santrix-5/skin.css +4116 -0
  198. package/js/santrix/skins/ui/santrix-5/skin.js +2 -0
  199. package/js/santrix/skins/ui/santrix-5/skin.js.map +1 -0
  200. package/js/santrix/skins/ui/santrix-5/skin.min.css +2 -0
  201. package/js/santrix/skins/ui/santrix-5/skin.min.css.map +1 -0
  202. package/js/santrix/skins/ui/santrix-5/skin.shadowdom.css +30 -0
  203. package/js/santrix/skins/ui/santrix-5/skin.shadowdom.js +2 -0
  204. package/js/santrix/skins/ui/santrix-5/skin.shadowdom.js.map +1 -0
  205. package/js/santrix/skins/ui/santrix-5/skin.shadowdom.min.css +2 -0
  206. package/js/santrix/skins/ui/santrix-5/skin.shadowdom.min.css.map +1 -0
  207. package/js/santrix/skins/ui/santrix-5-dark/content.css +766 -0
  208. package/js/santrix/skins/ui/santrix-5-dark/content.inline.css +779 -0
  209. package/js/santrix/skins/ui/santrix-5-dark/content.inline.js +2 -0
  210. package/js/santrix/skins/ui/santrix-5-dark/content.inline.js.map +1 -0
  211. package/js/santrix/skins/ui/santrix-5-dark/content.inline.min.css +2 -0
  212. package/js/santrix/skins/ui/santrix-5-dark/content.inline.min.css.map +1 -0
  213. package/js/santrix/skins/ui/santrix-5-dark/content.js +2 -0
  214. package/js/santrix/skins/ui/santrix-5-dark/content.js.map +1 -0
  215. package/js/santrix/skins/ui/santrix-5-dark/content.min.css +2 -0
  216. package/js/santrix/skins/ui/santrix-5-dark/content.min.css.map +1 -0
  217. package/js/santrix/skins/ui/santrix-5-dark/skin.css +4116 -0
  218. package/js/santrix/skins/ui/santrix-5-dark/skin.js +2 -0
  219. package/js/santrix/skins/ui/santrix-5-dark/skin.js.map +1 -0
  220. package/js/santrix/skins/ui/santrix-5-dark/skin.min.css +2 -0
  221. package/js/santrix/skins/ui/santrix-5-dark/skin.min.css.map +1 -0
  222. package/js/santrix/skins/ui/santrix-5-dark/skin.shadowdom.css +30 -0
  223. package/js/santrix/skins/ui/santrix-5-dark/skin.shadowdom.js +2 -0
  224. package/js/santrix/skins/ui/santrix-5-dark/skin.shadowdom.js.map +1 -0
  225. package/js/santrix/skins/ui/santrix-5-dark/skin.shadowdom.min.css +2 -0
  226. package/js/santrix/skins/ui/santrix-5-dark/skin.shadowdom.min.css.map +1 -0
  227. package/js/santrix/themes/silver/theme.js +30787 -0
  228. package/js/santrix/themes/silver/theme.min.js +339 -0
  229. package/package.json +49 -0
@@ -0,0 +1,570 @@
1
+ /**
2
+ * SanTrix version 0.1.0 (2026-01-18)
3
+ * Copyright (c) 2026 SanTrix Team
4
+ * Portions Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
5
+ * Licensed under the MIT license (https://github.com/NopeThisIsShini/SanTrix/blob/main/LICENSE.TXT)
6
+ */
7
+
8
+ (function () {
9
+ 'use strict';
10
+
11
+ var global$3 = santrix.util.Tools.resolve('santrix.PluginManager');
12
+
13
+ const hasProto = (v, constructor, predicate) => {
14
+ var _a;
15
+ if (predicate(v, constructor.prototype)) {
16
+ return true;
17
+ } else {
18
+ return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
19
+ }
20
+ };
21
+ const typeOf = x => {
22
+ const t = typeof x;
23
+ if (x === null) {
24
+ return 'null';
25
+ } else if (t === 'object' && Array.isArray(x)) {
26
+ return 'array';
27
+ } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
28
+ return 'string';
29
+ } else {
30
+ return t;
31
+ }
32
+ };
33
+ const isType = type => value => typeOf(value) === type;
34
+ const isSimpleType = type => value => typeof value === type;
35
+ const isString = isType('string');
36
+ const isObject = isType('object');
37
+ const isArray = isType('array');
38
+ const isNullable = a => a === null || a === undefined;
39
+ const isNonNullable = a => !isNullable(a);
40
+ const isFunction = isSimpleType('function');
41
+ const isArrayOf = (value, pred) => {
42
+ if (isArray(value)) {
43
+ for (let i = 0, len = value.length; i < len; ++i) {
44
+ if (!pred(value[i])) {
45
+ return false;
46
+ }
47
+ }
48
+ return true;
49
+ }
50
+ return false;
51
+ };
52
+
53
+ const constant = value => {
54
+ return () => {
55
+ return value;
56
+ };
57
+ };
58
+ function curry(fn, ...initialArgs) {
59
+ return (...restArgs) => {
60
+ const all = initialArgs.concat(restArgs);
61
+ return fn.apply(null, all);
62
+ };
63
+ }
64
+ const never = constant(false);
65
+
66
+ const escape = text => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
67
+
68
+ var global$2 = santrix.util.Tools.resolve('santrix.util.Tools');
69
+
70
+ const option = name => editor => editor.options.get(name);
71
+ const register$2 = editor => {
72
+ const registerOption = editor.options.register;
73
+ registerOption('template_cdate_classes', {
74
+ processor: 'string',
75
+ default: 'cdate'
76
+ });
77
+ registerOption('template_mdate_classes', {
78
+ processor: 'string',
79
+ default: 'mdate'
80
+ });
81
+ registerOption('template_selected_content_classes', {
82
+ processor: 'string',
83
+ default: 'selcontent'
84
+ });
85
+ registerOption('template_preview_replace_values', { processor: 'object' });
86
+ registerOption('template_replace_values', { processor: 'object' });
87
+ registerOption('templates', {
88
+ processor: value => isString(value) || isArrayOf(value, isObject) || isFunction(value),
89
+ default: []
90
+ });
91
+ registerOption('template_cdate_format', {
92
+ processor: 'string',
93
+ default: editor.translate('%Y-%m-%d')
94
+ });
95
+ registerOption('template_mdate_format', {
96
+ processor: 'string',
97
+ default: editor.translate('%Y-%m-%d')
98
+ });
99
+ };
100
+ const getCreationDateClasses = option('template_cdate_classes');
101
+ const getModificationDateClasses = option('template_mdate_classes');
102
+ const getSelectedContentClasses = option('template_selected_content_classes');
103
+ const getPreviewReplaceValues = option('template_preview_replace_values');
104
+ const getTemplateReplaceValues = option('template_replace_values');
105
+ const getTemplates = option('templates');
106
+ const getCdateFormat = option('template_cdate_format');
107
+ const getMdateFormat = option('template_mdate_format');
108
+ const getContentStyle = option('content_style');
109
+ const shouldUseContentCssCors = option('content_css_cors');
110
+ const getBodyClass = option('body_class');
111
+
112
+ const addZeros = (value, len) => {
113
+ value = '' + value;
114
+ if (value.length < len) {
115
+ for (let i = 0; i < len - value.length; i++) {
116
+ value = '0' + value;
117
+ }
118
+ }
119
+ return value;
120
+ };
121
+ const getDateTime = (editor, fmt, date = new Date()) => {
122
+ const daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' ');
123
+ const daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' ');
124
+ const monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
125
+ const monthsLong = 'January February March April May June July August September October November December'.split(' ');
126
+ fmt = fmt.replace('%D', '%m/%d/%Y');
127
+ fmt = fmt.replace('%r', '%I:%M:%S %p');
128
+ fmt = fmt.replace('%Y', '' + date.getFullYear());
129
+ fmt = fmt.replace('%y', '' + date.getYear());
130
+ fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2));
131
+ fmt = fmt.replace('%d', addZeros(date.getDate(), 2));
132
+ fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2));
133
+ fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2));
134
+ fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2));
135
+ fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1));
136
+ fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM'));
137
+ fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()]));
138
+ fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()]));
139
+ fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()]));
140
+ fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()]));
141
+ fmt = fmt.replace('%%', '%');
142
+ return fmt;
143
+ };
144
+
145
+ class Optional {
146
+ constructor(tag, value) {
147
+ this.tag = tag;
148
+ this.value = value;
149
+ }
150
+ static some(value) {
151
+ return new Optional(true, value);
152
+ }
153
+ static none() {
154
+ return Optional.singletonNone;
155
+ }
156
+ fold(onNone, onSome) {
157
+ if (this.tag) {
158
+ return onSome(this.value);
159
+ } else {
160
+ return onNone();
161
+ }
162
+ }
163
+ isSome() {
164
+ return this.tag;
165
+ }
166
+ isNone() {
167
+ return !this.tag;
168
+ }
169
+ map(mapper) {
170
+ if (this.tag) {
171
+ return Optional.some(mapper(this.value));
172
+ } else {
173
+ return Optional.none();
174
+ }
175
+ }
176
+ bind(binder) {
177
+ if (this.tag) {
178
+ return binder(this.value);
179
+ } else {
180
+ return Optional.none();
181
+ }
182
+ }
183
+ exists(predicate) {
184
+ return this.tag && predicate(this.value);
185
+ }
186
+ forall(predicate) {
187
+ return !this.tag || predicate(this.value);
188
+ }
189
+ filter(predicate) {
190
+ if (!this.tag || predicate(this.value)) {
191
+ return this;
192
+ } else {
193
+ return Optional.none();
194
+ }
195
+ }
196
+ getOr(replacement) {
197
+ return this.tag ? this.value : replacement;
198
+ }
199
+ or(replacement) {
200
+ return this.tag ? this : replacement;
201
+ }
202
+ getOrThunk(thunk) {
203
+ return this.tag ? this.value : thunk();
204
+ }
205
+ orThunk(thunk) {
206
+ return this.tag ? this : thunk();
207
+ }
208
+ getOrDie(message) {
209
+ if (!this.tag) {
210
+ throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
211
+ } else {
212
+ return this.value;
213
+ }
214
+ }
215
+ static from(value) {
216
+ return isNonNullable(value) ? Optional.some(value) : Optional.none();
217
+ }
218
+ getOrNull() {
219
+ return this.tag ? this.value : null;
220
+ }
221
+ getOrUndefined() {
222
+ return this.value;
223
+ }
224
+ each(worker) {
225
+ if (this.tag) {
226
+ worker(this.value);
227
+ }
228
+ }
229
+ toArray() {
230
+ return this.tag ? [this.value] : [];
231
+ }
232
+ toString() {
233
+ return this.tag ? `some(${ this.value })` : 'none()';
234
+ }
235
+ }
236
+ Optional.singletonNone = new Optional(false);
237
+
238
+ const exists = (xs, pred) => {
239
+ for (let i = 0, len = xs.length; i < len; i++) {
240
+ const x = xs[i];
241
+ if (pred(x, i)) {
242
+ return true;
243
+ }
244
+ }
245
+ return false;
246
+ };
247
+ const map = (xs, f) => {
248
+ const len = xs.length;
249
+ const r = new Array(len);
250
+ for (let i = 0; i < len; i++) {
251
+ const x = xs[i];
252
+ r[i] = f(x, i);
253
+ }
254
+ return r;
255
+ };
256
+ const findUntil = (xs, pred, until) => {
257
+ for (let i = 0, len = xs.length; i < len; i++) {
258
+ const x = xs[i];
259
+ if (pred(x, i)) {
260
+ return Optional.some(x);
261
+ } else if (until(x, i)) {
262
+ break;
263
+ }
264
+ }
265
+ return Optional.none();
266
+ };
267
+ const find = (xs, pred) => {
268
+ return findUntil(xs, pred, never);
269
+ };
270
+
271
+ const hasOwnProperty = Object.hasOwnProperty;
272
+ const get = (obj, key) => {
273
+ return has(obj, key) ? Optional.from(obj[key]) : Optional.none();
274
+ };
275
+ const has = (obj, key) => hasOwnProperty.call(obj, key);
276
+
277
+ var global$1 = santrix.util.Tools.resolve('santrix.html.Serializer');
278
+
279
+ const entitiesAttr = {
280
+ '"': '&quot;',
281
+ '<': '&lt;',
282
+ '>': '&gt;',
283
+ '&': '&amp;',
284
+ '\'': '&#039;'
285
+ };
286
+ const htmlEscape = html => html.replace(/["'<>&]/g, match => get(entitiesAttr, match).getOr(match));
287
+ const hasAnyClasses = (dom, n, classes) => exists(classes.split(/\s+/), c => dom.hasClass(n, c));
288
+ const parseAndSerialize = (editor, html) => global$1({ validate: true }, editor.schema).serialize(editor.parser.parse(html, { insert: true }));
289
+
290
+ const createTemplateList = (editor, callback) => {
291
+ return () => {
292
+ const templateList = getTemplates(editor);
293
+ if (isFunction(templateList)) {
294
+ templateList(callback);
295
+ } else if (isString(templateList)) {
296
+ fetch(templateList).then(res => {
297
+ if (res.ok) {
298
+ res.json().then(callback);
299
+ }
300
+ });
301
+ } else {
302
+ callback(templateList);
303
+ }
304
+ };
305
+ };
306
+ const replaceTemplateValues = (html, templateValues) => {
307
+ global$2.each(templateValues, (v, k) => {
308
+ if (isFunction(v)) {
309
+ v = v(k);
310
+ }
311
+ html = html.replace(new RegExp('\\{\\$' + escape(k) + '\\}', 'g'), v);
312
+ });
313
+ return html;
314
+ };
315
+ const replaceVals = (editor, scope) => {
316
+ const dom = editor.dom, vl = getTemplateReplaceValues(editor);
317
+ global$2.each(dom.select('*', scope), e => {
318
+ global$2.each(vl, (v, k) => {
319
+ if (dom.hasClass(e, k)) {
320
+ if (isFunction(v)) {
321
+ v(e);
322
+ }
323
+ }
324
+ });
325
+ });
326
+ };
327
+ const insertTemplate = (editor, _ui, html) => {
328
+ const dom = editor.dom;
329
+ const sel = editor.selection.getContent();
330
+ html = replaceTemplateValues(html, getTemplateReplaceValues(editor));
331
+ let el = dom.create('div', {}, parseAndSerialize(editor, html));
332
+ const n = dom.select('.mceTmpl', el);
333
+ if (n && n.length > 0) {
334
+ el = dom.create('div');
335
+ el.appendChild(n[0].cloneNode(true));
336
+ }
337
+ global$2.each(dom.select('*', el), n => {
338
+ if (hasAnyClasses(dom, n, getCreationDateClasses(editor))) {
339
+ n.innerHTML = getDateTime(editor, getCdateFormat(editor));
340
+ }
341
+ if (hasAnyClasses(dom, n, getModificationDateClasses(editor))) {
342
+ n.innerHTML = getDateTime(editor, getMdateFormat(editor));
343
+ }
344
+ if (hasAnyClasses(dom, n, getSelectedContentClasses(editor))) {
345
+ n.innerHTML = sel;
346
+ }
347
+ });
348
+ replaceVals(editor, el);
349
+ editor.execCommand('mceInsertContent', false, el.innerHTML);
350
+ editor.addVisual();
351
+ };
352
+
353
+ var global = santrix.util.Tools.resolve('santrix.Env');
354
+
355
+ const getPreviewContent = (editor, html) => {
356
+ var _a;
357
+ let previewHtml = parseAndSerialize(editor, html);
358
+ if (html.indexOf('<html>') === -1) {
359
+ let contentCssEntries = '';
360
+ const contentStyle = (_a = getContentStyle(editor)) !== null && _a !== void 0 ? _a : '';
361
+ const cors = shouldUseContentCssCors(editor) ? ' crossorigin="anonymous"' : '';
362
+ global$2.each(editor.contentCSS, url => {
363
+ contentCssEntries += '<link type="text/css" rel="stylesheet" href="' + editor.documentBaseURI.toAbsolute(url) + '"' + cors + '>';
364
+ });
365
+ if (contentStyle) {
366
+ contentCssEntries += '<style type="text/css">' + contentStyle + '</style>';
367
+ }
368
+ const bodyClass = getBodyClass(editor);
369
+ const encode = editor.dom.encode;
370
+ const isMetaKeyPressed = global.os.isMacOS() || global.os.isiOS() ? 'e.metaKey' : 'e.ctrlKey && !e.altKey';
371
+ const preventClicksOnLinksScript = '<script>' + 'document.addEventListener && document.addEventListener("click", function(e) {' + 'for (var elm = e.target; elm; elm = elm.parentNode) {' + 'if (elm.nodeName === "A" && !(' + isMetaKeyPressed + ')) {' + 'e.preventDefault();' + '}' + '}' + '}, false);' + '</script> ';
372
+ const directionality = editor.getBody().dir;
373
+ const dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : '';
374
+ previewHtml = '<!DOCTYPE html>' + '<html>' + '<head>' + '<base href="' + encode(editor.documentBaseURI.getURI()) + '">' + contentCssEntries + preventClicksOnLinksScript + '</head>' + '<body class="' + encode(bodyClass) + '"' + dirAttr + '>' + previewHtml + '</body>' + '</html>';
375
+ }
376
+ return replaceTemplateValues(previewHtml, getPreviewReplaceValues(editor));
377
+ };
378
+ const open = (editor, templateList) => {
379
+ const createTemplates = () => {
380
+ if (!templateList || templateList.length === 0) {
381
+ const message = editor.translate('No templates defined.');
382
+ editor.notificationManager.open({
383
+ text: message,
384
+ type: 'info'
385
+ });
386
+ return Optional.none();
387
+ }
388
+ return Optional.from(global$2.map(templateList, (template, index) => {
389
+ const isUrlTemplate = t => t.url !== undefined;
390
+ return {
391
+ selected: index === 0,
392
+ text: template.title,
393
+ value: {
394
+ url: isUrlTemplate(template) ? Optional.from(template.url) : Optional.none(),
395
+ content: !isUrlTemplate(template) ? Optional.from(template.content) : Optional.none(),
396
+ description: template.description
397
+ }
398
+ };
399
+ }));
400
+ };
401
+ const createSelectBoxItems = templates => map(templates, t => ({
402
+ text: t.text,
403
+ value: t.text
404
+ }));
405
+ const findTemplate = (templates, templateTitle) => find(templates, t => t.text === templateTitle);
406
+ const loadFailedAlert = api => {
407
+ editor.windowManager.alert('Could not load the specified template.', () => api.focus('template'));
408
+ };
409
+ const getTemplateContent = t => t.value.url.fold(() => Promise.resolve(t.value.content.getOr('')), url => fetch(url).then(res => res.ok ? res.text() : Promise.reject()));
410
+ const onChange = (templates, updateDialog) => (api, change) => {
411
+ if (change.name === 'template') {
412
+ const newTemplateTitle = api.getData().template;
413
+ findTemplate(templates, newTemplateTitle).each(t => {
414
+ api.block('Loading...');
415
+ getTemplateContent(t).then(previewHtml => {
416
+ updateDialog(api, t, previewHtml);
417
+ }).catch(() => {
418
+ updateDialog(api, t, '');
419
+ api.setEnabled('save', false);
420
+ loadFailedAlert(api);
421
+ });
422
+ });
423
+ }
424
+ };
425
+ const onSubmit = templates => api => {
426
+ const data = api.getData();
427
+ findTemplate(templates, data.template).each(t => {
428
+ getTemplateContent(t).then(previewHtml => {
429
+ editor.execCommand('mceInsertTemplate', false, previewHtml);
430
+ api.close();
431
+ }).catch(() => {
432
+ api.setEnabled('save', false);
433
+ loadFailedAlert(api);
434
+ });
435
+ });
436
+ };
437
+ const openDialog = templates => {
438
+ const selectBoxItems = createSelectBoxItems(templates);
439
+ const buildDialogSpec = (bodyItems, initialData) => ({
440
+ title: 'Insert Template',
441
+ size: 'large',
442
+ body: {
443
+ type: 'panel',
444
+ items: bodyItems
445
+ },
446
+ initialData,
447
+ buttons: [
448
+ {
449
+ type: 'cancel',
450
+ name: 'cancel',
451
+ text: 'Cancel'
452
+ },
453
+ {
454
+ type: 'submit',
455
+ name: 'save',
456
+ text: 'Save',
457
+ primary: true
458
+ }
459
+ ],
460
+ onSubmit: onSubmit(templates),
461
+ onChange: onChange(templates, updateDialog)
462
+ });
463
+ const updateDialog = (dialogApi, template, previewHtml) => {
464
+ const content = getPreviewContent(editor, previewHtml);
465
+ const bodyItems = [
466
+ {
467
+ type: 'listbox',
468
+ name: 'template',
469
+ label: 'Templates',
470
+ items: selectBoxItems
471
+ },
472
+ {
473
+ type: 'htmlpanel',
474
+ html: `<p aria-live="polite">${ htmlEscape(template.value.description) }</p>`
475
+ },
476
+ {
477
+ label: 'Preview',
478
+ type: 'iframe',
479
+ name: 'preview',
480
+ sandboxed: false,
481
+ transparent: false
482
+ }
483
+ ];
484
+ const initialData = {
485
+ template: template.text,
486
+ preview: content
487
+ };
488
+ dialogApi.unblock();
489
+ dialogApi.redial(buildDialogSpec(bodyItems, initialData));
490
+ dialogApi.focus('template');
491
+ };
492
+ const dialogApi = editor.windowManager.open(buildDialogSpec([], {
493
+ template: '',
494
+ preview: ''
495
+ }));
496
+ dialogApi.block('Loading...');
497
+ getTemplateContent(templates[0]).then(previewHtml => {
498
+ updateDialog(dialogApi, templates[0], previewHtml);
499
+ }).catch(() => {
500
+ updateDialog(dialogApi, templates[0], '');
501
+ dialogApi.setEnabled('save', false);
502
+ loadFailedAlert(dialogApi);
503
+ });
504
+ };
505
+ const optTemplates = createTemplates();
506
+ optTemplates.each(openDialog);
507
+ };
508
+
509
+ const showDialog = editor => templates => {
510
+ open(editor, templates);
511
+ };
512
+ const register$1 = editor => {
513
+ editor.addCommand('mceInsertTemplate', curry(insertTemplate, editor));
514
+ editor.addCommand('mceTemplate', createTemplateList(editor, showDialog(editor)));
515
+ };
516
+
517
+ const setup = editor => {
518
+ editor.on('PreProcess', o => {
519
+ const dom = editor.dom, dateFormat = getMdateFormat(editor);
520
+ global$2.each(dom.select('div', o.node), e => {
521
+ if (dom.hasClass(e, 'mceTmpl')) {
522
+ global$2.each(dom.select('*', e), e => {
523
+ if (hasAnyClasses(dom, e, getModificationDateClasses(editor))) {
524
+ e.innerHTML = getDateTime(editor, dateFormat);
525
+ }
526
+ });
527
+ replaceVals(editor, e);
528
+ }
529
+ });
530
+ });
531
+ };
532
+
533
+ const onSetupEditable = editor => api => {
534
+ const nodeChanged = () => {
535
+ api.setEnabled(editor.selection.isEditable());
536
+ };
537
+ editor.on('NodeChange', nodeChanged);
538
+ nodeChanged();
539
+ return () => {
540
+ editor.off('NodeChange', nodeChanged);
541
+ };
542
+ };
543
+ const register = editor => {
544
+ const onAction = () => editor.execCommand('mceTemplate');
545
+ editor.ui.registry.addButton('template', {
546
+ icon: 'template',
547
+ tooltip: 'Insert template',
548
+ onSetup: onSetupEditable(editor),
549
+ onAction
550
+ });
551
+ editor.ui.registry.addMenuItem('template', {
552
+ icon: 'template',
553
+ text: 'Insert template...',
554
+ onSetup: onSetupEditable(editor),
555
+ onAction
556
+ });
557
+ };
558
+
559
+ var Plugin = () => {
560
+ global$3.add('template', editor => {
561
+ register$2(editor);
562
+ register(editor);
563
+ register$1(editor);
564
+ setup(editor);
565
+ });
566
+ };
567
+
568
+ Plugin();
569
+
570
+ })();
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SanTrix version 0.1.0 (2026-01-18)
3
+ * Copyright (c) 2026 SanTrix Team
4
+ * Portions Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
5
+ * Licensed under the MIT license (https://github.com/NopeThisIsShini/SanTrix/blob/main/LICENSE.TXT)
6
+ */
7
+ !function(){"use strict";var e=santrix.util.Tools.resolve("santrix.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(a=n=e,(r=String).prototype.isPrototypeOf(a)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var a,n,r,s})(t)===e,a=t("string"),n=t("object"),r=t("array"),s=e=>"function"==typeof e;const l=()=>false;var o=santrix.util.Tools.resolve("santrix.util.Tools");const c=e=>t=>t.options.get(e),i=c("template_cdate_classes"),u=c("template_mdate_classes"),p=c("template_selected_content_classes"),m=c("template_preview_replace_values"),d=c("template_replace_values"),h=c("templates"),g=c("template_cdate_format"),v=c("template_mdate_format"),f=c("content_style"),y=c("content_css_cors"),b=c("body_class"),_=(e,t)=>{if((e=""+e).length<t)for(let a=0;a<t-e.length;a++)e="0"+e;return e},x=(e,t,a=new Date)=>{const n="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),r="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),s="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),l="January February March April May June July August September October November December".split(" ");return(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",_(a.getMonth()+1,2))).replace("%d",_(a.getDate(),2))).replace("%H",""+_(a.getHours(),2))).replace("%M",""+_(a.getMinutes(),2))).replace("%S",""+_(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(l[a.getMonth()]))).replace("%b",""+e.translate(s[a.getMonth()]))).replace("%A",""+e.translate(r[a.getDay()]))).replace("%a",""+e.translate(n[a.getDay()]))).replace("%%","%")};class M{constructor(e,t){this.tag=e,this.value=t}static some(e){return new M(!0,e)}static none(){return M.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?M.some(e(this.value)):M.none()}bind(e){return this.tag?e(this.value):M.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:M.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?M.none():M.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}M.singletonNone=new M(!1);const T=Object.hasOwnProperty;var S=santrix.util.Tools.resolve("santrix.html.Serializer");const C={'"':"&quot;","<":"&lt;",">":"&gt;","&":"&amp;","'":"&#039;"},w=e=>e.replace(/["'<>&]/g,e=>{return(t=C,a=e,((e,t)=>T.call(e,t))(t,a)?M.from(t[a]):M.none()).getOr(e);var t,a}),O=(e,t,a)=>((e,t)=>{for(let a=0,n=e.length;a<n;a++)if(t(e[a]))return!0;return!1})(a.split(/\s+/),a=>e.hasClass(t,a)),A=(e,t)=>S({validate:!0},e.schema).serialize(e.parser.parse(t,{insert:!0})),D=(e,t)=>(o.each(t,(t,a)=>{s(t)&&(t=t(a)),e=e.replace(new RegExp("\\{\\$"+a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"\\}","g"),t)}),e),N=(e,t)=>{const a=e.dom,n=d(e);o.each(a.select("*",t),e=>{o.each(n,(t,n)=>{a.hasClass(e,n)&&s(t)&&t(e)})})},I=(e,t,a)=>{const n=e.dom,r=e.selection.getContent();a=D(a,d(e));let s=n.create("div",{},A(e,a));const l=n.select(".mceTmpl",s);l&&l.length>0&&(s=n.create("div"),s.appendChild(l[0].cloneNode(!0))),o.each(n.select("*",s),t=>{O(n,t,i(e))&&(t.innerHTML=x(e,g(e))),O(n,t,u(e))&&(t.innerHTML=x(e,v(e))),O(n,t,p(e))&&(t.innerHTML=r)}),N(e,s),e.execCommand("mceInsertContent",!1,s.innerHTML),e.addVisual()};var E=santrix.util.Tools.resolve("santrix.Env");const k=(e,t)=>{const a=(e,t)=>((e,t,a)=>{for(let n=0,r=e.length;n<r;n++){const r=e[n];if(t(r,n))return M.some(r);if(a(r,n))break}return M.none()})(e,e=>e.text===t,l),n=t=>{e.windowManager.alert("Could not load the specified template.",()=>t.focus("template"))},r=e=>e.value.url.fold(()=>Promise.resolve(e.value.content.getOr("")),e=>fetch(e).then(e=>e.ok?e.text():Promise.reject())),s=(e,t)=>(s,l)=>{if("template"===l.name){const l=s.getData().template;a(e,l).each(e=>{s.block("Loading..."),r(e).then(a=>{t(s,e,a)}).catch(()=>{t(s,e,""),s.setEnabled("save",!1),n(s)})})}},c=t=>s=>{const l=s.getData();a(t,l.template).each(t=>{r(t).then(t=>{e.execCommand("mceInsertTemplate",!1,t),s.close()}).catch(()=>{s.setEnabled("save",!1),n(s)})})};(()=>{if(!t||0===t.length){const t=e.translate("No templates defined.");return e.notificationManager.open({text:t,type:"info"}),M.none()}return M.from(o.map(t,(e,t)=>{const a=e=>void 0!==e.url;return{selected:0===t,text:e.title,value:{url:a(e)?M.from(e.url):M.none(),content:a(e)?M.none():M.from(e.content),description:e.description}}}))})().each(t=>{const a=(e=>((e,t)=>{const a=e.length,n=new Array(a);for(let r=0;r<a;r++){const a=e[r];n[r]=t(a)}return n})(e,e=>({text:e.text,value:e.text})))(t),l=(e,a)=>({title:"Insert Template",size:"large",body:{type:"panel",items:e},initialData:a,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:c(t),onChange:s(t,i)}),i=(t,n,r)=>{const s=((e,t)=>{var a;let n=A(e,t);if(-1===t.indexOf("<html>")){let t="";const r=null!==(a=f(e))&&void 0!==a?a:"",s=y(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,a=>{t+='<link type="text/css" rel="stylesheet" href="'+e.documentBaseURI.toAbsolute(a)+'"'+s+">"}),r&&(t+='<style type="text/css">'+r+"</style>");const l=b(e),c=e.dom.encode,i='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(E.os.isMacOS()||E.os.isiOS()?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",u=e.getBody().dir,p=u?' dir="'+c(u)+'"':"";n='<!DOCTYPE html><html><head><base href="'+c(e.documentBaseURI.getURI())+'">'+t+i+'</head><body class="'+c(l)+'"'+p+">"+n+"</body></html>"}return D(n,m(e))})(e,r),c=[{type:"listbox",name:"template",label:"Templates",items:a},{type:"htmlpanel",html:`<p aria-live="polite">${w(n.value.description)}</p>`},{label:"Preview",type:"iframe",name:"preview",sandboxed:!1,transparent:!1}],i={template:n.text,preview:s};t.unblock(),t.redial(l(c,i)),t.focus("template")},u=e.windowManager.open(l([],{template:"",preview:""}));u.block("Loading..."),r(t[0]).then(e=>{i(u,t[0],e)}).catch(()=>{i(u,t[0],""),u.setEnabled("save",!1),n(u)})})},P=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("template",e=>{(e=>{const t=e.options.register;t("template_cdate_classes",{processor:"string",default:"cdate"}),t("template_mdate_classes",{processor:"string",default:"mdate"}),t("template_selected_content_classes",{processor:"string",default:"selcontent"}),t("template_preview_replace_values",{processor:"object"}),t("template_replace_values",{processor:"object"}),t("templates",{processor:e=>a(e)||((e,t)=>{if(r(e)){for(let a=0,n=e.length;a<n;++a)if(!t(e[a]))return!1;return!0}return!1})(e,n)||s(e),default:[]}),t("template_cdate_format",{processor:"string",default:e.translate("%Y-%m-%d")}),t("template_mdate_format",{processor:"string",default:e.translate("%Y-%m-%d")})})(e),(e=>{const t=()=>e.execCommand("mceTemplate");e.ui.registry.addButton("template",{icon:"template",tooltip:"Insert template",onSetup:P(e),onAction:t}),e.ui.registry.addMenuItem("template",{icon:"template",text:"Insert template...",onSetup:P(e),onAction:t})})(e),(e=>{e.addCommand("mceInsertTemplate",function(e,...t){return(...a)=>{const n=t.concat(a);return e.apply(null,n)}}(I,e)),e.addCommand("mceTemplate",((e,t)=>()=>{const n=h(e);s(n)?n(t):a(n)?fetch(n).then(e=>{e.ok&&e.json().then(t)}):t(n)})(e,(e=>t=>{k(e,t)})(e)))})(e),(e=>{e.on("PreProcess",t=>{const a=e.dom,n=v(e);o.each(a.select("div",t.node),t=>{a.hasClass(t,"mceTmpl")&&(o.each(a.select("*",t),t=>{O(a,t,u(e))&&(t.innerHTML=x(e,n))}),N(e,t))})})})(e)})}();