tinymce_plugins_textpattern.js 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  1. import {
  2. __commonJS
  3. } from "./chunk-2LSFTFF7.js";
  4. // node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/textpattern/plugin.js
  5. var require_plugin = __commonJS({
  6. "node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/textpattern/plugin.js"() {
  7. (function() {
  8. "use strict";
  9. var Cell = function(initial) {
  10. var value2 = initial;
  11. var get2 = function() {
  12. return value2;
  13. };
  14. var set = function(v) {
  15. value2 = v;
  16. };
  17. return {
  18. get: get2,
  19. set
  20. };
  21. };
  22. var global$5 = tinymce.util.Tools.resolve("tinymce.PluginManager");
  23. var __assign = function() {
  24. __assign = Object.assign || function __assign2(t) {
  25. for (var s, i = 1, n = arguments.length; i < n; i++) {
  26. s = arguments[i];
  27. for (var p in s)
  28. if (Object.prototype.hasOwnProperty.call(s, p))
  29. t[p] = s[p];
  30. }
  31. return t;
  32. };
  33. return __assign.apply(this, arguments);
  34. };
  35. function __spreadArray(to, from2, pack) {
  36. if (pack || arguments.length === 2)
  37. for (var i = 0, l = from2.length, ar; i < l; i++) {
  38. if (ar || !(i in from2)) {
  39. if (!ar)
  40. ar = Array.prototype.slice.call(from2, 0, i);
  41. ar[i] = from2[i];
  42. }
  43. }
  44. return to.concat(ar || Array.prototype.slice.call(from2));
  45. }
  46. var typeOf = function(x) {
  47. var t = typeof x;
  48. if (x === null) {
  49. return "null";
  50. } else if (t === "object" && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === "Array")) {
  51. return "array";
  52. } else if (t === "object" && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === "String")) {
  53. return "string";
  54. } else {
  55. return t;
  56. }
  57. };
  58. var isType = function(type) {
  59. return function(value2) {
  60. return typeOf(value2) === type;
  61. };
  62. };
  63. var isString = isType("string");
  64. var isObject = isType("object");
  65. var isArray = isType("array");
  66. var noop = function() {
  67. };
  68. var constant = function(value2) {
  69. return function() {
  70. return value2;
  71. };
  72. };
  73. var identity = function(x) {
  74. return x;
  75. };
  76. var die = function(msg) {
  77. return function() {
  78. throw new Error(msg);
  79. };
  80. };
  81. var never = constant(false);
  82. var always = constant(true);
  83. var none = function() {
  84. return NONE;
  85. };
  86. var NONE = function() {
  87. var call = function(thunk) {
  88. return thunk();
  89. };
  90. var id = identity;
  91. var me = {
  92. fold: function(n, _s) {
  93. return n();
  94. },
  95. isSome: never,
  96. isNone: always,
  97. getOr: id,
  98. getOrThunk: call,
  99. getOrDie: function(msg) {
  100. throw new Error(msg || "error: getOrDie called on none.");
  101. },
  102. getOrNull: constant(null),
  103. getOrUndefined: constant(void 0),
  104. or: id,
  105. orThunk: call,
  106. map: none,
  107. each: noop,
  108. bind: none,
  109. exists: never,
  110. forall: always,
  111. filter: function() {
  112. return none();
  113. },
  114. toArray: function() {
  115. return [];
  116. },
  117. toString: constant("none()")
  118. };
  119. return me;
  120. }();
  121. var some = function(a) {
  122. var constant_a = constant(a);
  123. var self = function() {
  124. return me;
  125. };
  126. var bind = function(f) {
  127. return f(a);
  128. };
  129. var me = {
  130. fold: function(n, s) {
  131. return s(a);
  132. },
  133. isSome: always,
  134. isNone: never,
  135. getOr: constant_a,
  136. getOrThunk: constant_a,
  137. getOrDie: constant_a,
  138. getOrNull: constant_a,
  139. getOrUndefined: constant_a,
  140. or: self,
  141. orThunk: self,
  142. map: function(f) {
  143. return some(f(a));
  144. },
  145. each: function(f) {
  146. f(a);
  147. },
  148. bind,
  149. exists: bind,
  150. forall: bind,
  151. filter: function(f) {
  152. return f(a) ? me : NONE;
  153. },
  154. toArray: function() {
  155. return [a];
  156. },
  157. toString: function() {
  158. return "some(" + a + ")";
  159. }
  160. };
  161. return me;
  162. };
  163. var from = function(value2) {
  164. return value2 === null || value2 === void 0 ? NONE : some(value2);
  165. };
  166. var Optional = {
  167. some,
  168. none,
  169. from
  170. };
  171. var nativeSlice = Array.prototype.slice;
  172. var nativeIndexOf = Array.prototype.indexOf;
  173. var rawIndexOf = function(ts, t) {
  174. return nativeIndexOf.call(ts, t);
  175. };
  176. var contains = function(xs, x) {
  177. return rawIndexOf(xs, x) > -1;
  178. };
  179. var map = function(xs, f) {
  180. var len = xs.length;
  181. var r = new Array(len);
  182. for (var i = 0; i < len; i++) {
  183. var x = xs[i];
  184. r[i] = f(x, i);
  185. }
  186. return r;
  187. };
  188. var each = function(xs, f) {
  189. for (var i = 0, len = xs.length; i < len; i++) {
  190. var x = xs[i];
  191. f(x, i);
  192. }
  193. };
  194. var eachr = function(xs, f) {
  195. for (var i = xs.length - 1; i >= 0; i--) {
  196. var x = xs[i];
  197. f(x, i);
  198. }
  199. };
  200. var filter = function(xs, pred) {
  201. var r = [];
  202. for (var i = 0, len = xs.length; i < len; i++) {
  203. var x = xs[i];
  204. if (pred(x, i)) {
  205. r.push(x);
  206. }
  207. }
  208. return r;
  209. };
  210. var foldr = function(xs, f, acc) {
  211. eachr(xs, function(x, i) {
  212. acc = f(acc, x, i);
  213. });
  214. return acc;
  215. };
  216. var foldl = function(xs, f, acc) {
  217. each(xs, function(x, i) {
  218. acc = f(acc, x, i);
  219. });
  220. return acc;
  221. };
  222. var findUntil = function(xs, pred, until) {
  223. for (var i = 0, len = xs.length; i < len; i++) {
  224. var x = xs[i];
  225. if (pred(x, i)) {
  226. return Optional.some(x);
  227. } else if (until(x, i)) {
  228. break;
  229. }
  230. }
  231. return Optional.none();
  232. };
  233. var find = function(xs, pred) {
  234. return findUntil(xs, pred, never);
  235. };
  236. var forall = function(xs, pred) {
  237. for (var i = 0, len = xs.length; i < len; ++i) {
  238. var x = xs[i];
  239. if (pred(x, i) !== true) {
  240. return false;
  241. }
  242. }
  243. return true;
  244. };
  245. var sort = function(xs, comparator) {
  246. var copy = nativeSlice.call(xs, 0);
  247. copy.sort(comparator);
  248. return copy;
  249. };
  250. var get$1 = function(xs, i) {
  251. return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
  252. };
  253. var head = function(xs) {
  254. return get$1(xs, 0);
  255. };
  256. var keys = Object.keys;
  257. var hasOwnProperty = Object.hasOwnProperty;
  258. var has = function(obj, key) {
  259. return hasOwnProperty.call(obj, key);
  260. };
  261. var generate$1 = function(cases) {
  262. if (!isArray(cases)) {
  263. throw new Error("cases must be an array");
  264. }
  265. if (cases.length === 0) {
  266. throw new Error("there must be at least one case");
  267. }
  268. var constructors = [];
  269. var adt = {};
  270. each(cases, function(acase, count) {
  271. var keys$1 = keys(acase);
  272. if (keys$1.length !== 1) {
  273. throw new Error("one and only one name per case");
  274. }
  275. var key = keys$1[0];
  276. var value2 = acase[key];
  277. if (adt[key] !== void 0) {
  278. throw new Error("duplicate key detected:" + key);
  279. } else if (key === "cata") {
  280. throw new Error("cannot have a case named cata (sorry)");
  281. } else if (!isArray(value2)) {
  282. throw new Error("case arguments must be an array");
  283. }
  284. constructors.push(key);
  285. adt[key] = function() {
  286. var args = [];
  287. for (var _i = 0; _i < arguments.length; _i++) {
  288. args[_i] = arguments[_i];
  289. }
  290. var argLength = args.length;
  291. if (argLength !== value2.length) {
  292. throw new Error("Wrong number of arguments to case " + key + ". Expected " + value2.length + " (" + value2 + "), got " + argLength);
  293. }
  294. var match = function(branches) {
  295. var branchKeys = keys(branches);
  296. if (constructors.length !== branchKeys.length) {
  297. throw new Error("Wrong number of arguments to match. Expected: " + constructors.join(",") + "\nActual: " + branchKeys.join(","));
  298. }
  299. var allReqd = forall(constructors, function(reqKey) {
  300. return contains(branchKeys, reqKey);
  301. });
  302. if (!allReqd) {
  303. throw new Error("Not all branches were specified when using match. Specified: " + branchKeys.join(", ") + "\nRequired: " + constructors.join(", "));
  304. }
  305. return branches[key].apply(null, args);
  306. };
  307. return {
  308. fold: function() {
  309. var foldArgs = [];
  310. for (var _i2 = 0; _i2 < arguments.length; _i2++) {
  311. foldArgs[_i2] = arguments[_i2];
  312. }
  313. if (foldArgs.length !== cases.length) {
  314. throw new Error("Wrong number of arguments to fold. Expected " + cases.length + ", got " + foldArgs.length);
  315. }
  316. var target = foldArgs[count];
  317. return target.apply(null, args);
  318. },
  319. match,
  320. log: function(label) {
  321. console.log(label, {
  322. constructors,
  323. constructor: key,
  324. params: args
  325. });
  326. }
  327. };
  328. };
  329. });
  330. return adt;
  331. };
  332. var Adt = { generate: generate$1 };
  333. Adt.generate([
  334. {
  335. bothErrors: [
  336. "error1",
  337. "error2"
  338. ]
  339. },
  340. {
  341. firstError: [
  342. "error1",
  343. "value2"
  344. ]
  345. },
  346. {
  347. secondError: [
  348. "value1",
  349. "error2"
  350. ]
  351. },
  352. {
  353. bothValues: [
  354. "value1",
  355. "value2"
  356. ]
  357. }
  358. ]);
  359. var partition = function(results) {
  360. var errors = [];
  361. var values = [];
  362. each(results, function(result) {
  363. result.fold(function(err) {
  364. errors.push(err);
  365. }, function(value2) {
  366. values.push(value2);
  367. });
  368. });
  369. return {
  370. errors,
  371. values
  372. };
  373. };
  374. var value = function(o) {
  375. var or = function(_opt) {
  376. return value(o);
  377. };
  378. var orThunk = function(_f) {
  379. return value(o);
  380. };
  381. var map2 = function(f) {
  382. return value(f(o));
  383. };
  384. var mapError = function(_f) {
  385. return value(o);
  386. };
  387. var each2 = function(f) {
  388. f(o);
  389. };
  390. var bind = function(f) {
  391. return f(o);
  392. };
  393. var fold = function(_, onValue) {
  394. return onValue(o);
  395. };
  396. var exists = function(f) {
  397. return f(o);
  398. };
  399. var forall2 = function(f) {
  400. return f(o);
  401. };
  402. var toOptional = function() {
  403. return Optional.some(o);
  404. };
  405. return {
  406. isValue: always,
  407. isError: never,
  408. getOr: constant(o),
  409. getOrThunk: constant(o),
  410. getOrDie: constant(o),
  411. or,
  412. orThunk,
  413. fold,
  414. map: map2,
  415. mapError,
  416. each: each2,
  417. bind,
  418. exists,
  419. forall: forall2,
  420. toOptional
  421. };
  422. };
  423. var error$1 = function(message) {
  424. var getOrThunk = function(f) {
  425. return f();
  426. };
  427. var getOrDie = function() {
  428. return die(String(message))();
  429. };
  430. var or = identity;
  431. var orThunk = function(f) {
  432. return f();
  433. };
  434. var map2 = function(_f) {
  435. return error$1(message);
  436. };
  437. var mapError = function(f) {
  438. return error$1(f(message));
  439. };
  440. var bind = function(_f) {
  441. return error$1(message);
  442. };
  443. var fold = function(onError, _) {
  444. return onError(message);
  445. };
  446. return {
  447. isValue: never,
  448. isError: always,
  449. getOr: identity,
  450. getOrThunk,
  451. getOrDie,
  452. or,
  453. orThunk,
  454. fold,
  455. map: map2,
  456. mapError,
  457. each: noop,
  458. bind,
  459. exists: never,
  460. forall: always,
  461. toOptional: Optional.none
  462. };
  463. };
  464. var fromOption = function(opt, err) {
  465. return opt.fold(function() {
  466. return error$1(err);
  467. }, value);
  468. };
  469. var Result = {
  470. value,
  471. error: error$1,
  472. fromOption
  473. };
  474. var isInlinePattern = function(pattern) {
  475. return pattern.type === "inline-command" || pattern.type === "inline-format";
  476. };
  477. var isBlockPattern = function(pattern) {
  478. return pattern.type === "block-command" || pattern.type === "block-format";
  479. };
  480. var sortPatterns = function(patterns) {
  481. return sort(patterns, function(a, b) {
  482. if (a.start.length === b.start.length) {
  483. return 0;
  484. }
  485. return a.start.length > b.start.length ? -1 : 1;
  486. });
  487. };
  488. var normalizePattern = function(pattern) {
  489. var err = function(message) {
  490. return Result.error({
  491. message,
  492. pattern
  493. });
  494. };
  495. var formatOrCmd = function(name, onFormat, onCommand) {
  496. if (pattern.format !== void 0) {
  497. var formats = void 0;
  498. if (isArray(pattern.format)) {
  499. if (!forall(pattern.format, isString)) {
  500. return err(name + " pattern has non-string items in the `format` array");
  501. }
  502. formats = pattern.format;
  503. } else if (isString(pattern.format)) {
  504. formats = [pattern.format];
  505. } else {
  506. return err(name + " pattern has non-string `format` parameter");
  507. }
  508. return Result.value(onFormat(formats));
  509. } else if (pattern.cmd !== void 0) {
  510. if (!isString(pattern.cmd)) {
  511. return err(name + " pattern has non-string `cmd` parameter");
  512. }
  513. return Result.value(onCommand(pattern.cmd, pattern.value));
  514. } else {
  515. return err(name + " pattern is missing both `format` and `cmd` parameters");
  516. }
  517. };
  518. if (!isObject(pattern)) {
  519. return err("Raw pattern is not an object");
  520. }
  521. if (!isString(pattern.start)) {
  522. return err("Raw pattern is missing `start` parameter");
  523. }
  524. if (pattern.end !== void 0) {
  525. if (!isString(pattern.end)) {
  526. return err("Inline pattern has non-string `end` parameter");
  527. }
  528. if (pattern.start.length === 0 && pattern.end.length === 0) {
  529. return err("Inline pattern has empty `start` and `end` parameters");
  530. }
  531. var start_1 = pattern.start;
  532. var end_1 = pattern.end;
  533. if (end_1.length === 0) {
  534. end_1 = start_1;
  535. start_1 = "";
  536. }
  537. return formatOrCmd("Inline", function(format) {
  538. return {
  539. type: "inline-format",
  540. start: start_1,
  541. end: end_1,
  542. format
  543. };
  544. }, function(cmd, value2) {
  545. return {
  546. type: "inline-command",
  547. start: start_1,
  548. end: end_1,
  549. cmd,
  550. value: value2
  551. };
  552. });
  553. } else if (pattern.replacement !== void 0) {
  554. if (!isString(pattern.replacement)) {
  555. return err("Replacement pattern has non-string `replacement` parameter");
  556. }
  557. if (pattern.start.length === 0) {
  558. return err("Replacement pattern has empty `start` parameter");
  559. }
  560. return Result.value({
  561. type: "inline-command",
  562. start: "",
  563. end: pattern.start,
  564. cmd: "mceInsertContent",
  565. value: pattern.replacement
  566. });
  567. } else {
  568. if (pattern.start.length === 0) {
  569. return err("Block pattern has empty `start` parameter");
  570. }
  571. return formatOrCmd("Block", function(formats) {
  572. return {
  573. type: "block-format",
  574. start: pattern.start,
  575. format: formats[0]
  576. };
  577. }, function(command, commandValue) {
  578. return {
  579. type: "block-command",
  580. start: pattern.start,
  581. cmd: command,
  582. value: commandValue
  583. };
  584. });
  585. }
  586. };
  587. var denormalizePattern = function(pattern) {
  588. if (pattern.type === "block-command") {
  589. return {
  590. start: pattern.start,
  591. cmd: pattern.cmd,
  592. value: pattern.value
  593. };
  594. } else if (pattern.type === "block-format") {
  595. return {
  596. start: pattern.start,
  597. format: pattern.format
  598. };
  599. } else if (pattern.type === "inline-command") {
  600. if (pattern.cmd === "mceInsertContent" && pattern.start === "") {
  601. return {
  602. start: pattern.end,
  603. replacement: pattern.value
  604. };
  605. } else {
  606. return {
  607. start: pattern.start,
  608. end: pattern.end,
  609. cmd: pattern.cmd,
  610. value: pattern.value
  611. };
  612. }
  613. } else if (pattern.type === "inline-format") {
  614. return {
  615. start: pattern.start,
  616. end: pattern.end,
  617. format: pattern.format.length === 1 ? pattern.format[0] : pattern.format
  618. };
  619. }
  620. };
  621. var createPatternSet = function(patterns) {
  622. return {
  623. inlinePatterns: filter(patterns, isInlinePattern),
  624. blockPatterns: sortPatterns(filter(patterns, isBlockPattern))
  625. };
  626. };
  627. var get = function(patternsState) {
  628. var setPatterns = function(newPatterns) {
  629. var normalized = partition(map(newPatterns, normalizePattern));
  630. if (normalized.errors.length > 0) {
  631. var firstError = normalized.errors[0];
  632. throw new Error(firstError.message + ":\n" + JSON.stringify(firstError.pattern, null, 2));
  633. }
  634. patternsState.set(createPatternSet(normalized.values));
  635. };
  636. var getPatterns = function() {
  637. return __spreadArray(__spreadArray([], map(patternsState.get().inlinePatterns, denormalizePattern), true), map(patternsState.get().blockPatterns, denormalizePattern), true);
  638. };
  639. return {
  640. setPatterns,
  641. getPatterns
  642. };
  643. };
  644. var Global = typeof window !== "undefined" ? window : Function("return this;")();
  645. var error = function() {
  646. var args = [];
  647. for (var _i = 0; _i < arguments.length; _i++) {
  648. args[_i] = arguments[_i];
  649. }
  650. var console2 = Global.console;
  651. if (console2) {
  652. if (console2.error) {
  653. console2.error.apply(console2, args);
  654. } else {
  655. console2.log.apply(console2, args);
  656. }
  657. }
  658. };
  659. var defaultPatterns = [
  660. {
  661. start: "*",
  662. end: "*",
  663. format: "italic"
  664. },
  665. {
  666. start: "**",
  667. end: "**",
  668. format: "bold"
  669. },
  670. {
  671. start: "#",
  672. format: "h1"
  673. },
  674. {
  675. start: "##",
  676. format: "h2"
  677. },
  678. {
  679. start: "###",
  680. format: "h3"
  681. },
  682. {
  683. start: "####",
  684. format: "h4"
  685. },
  686. {
  687. start: "#####",
  688. format: "h5"
  689. },
  690. {
  691. start: "######",
  692. format: "h6"
  693. },
  694. {
  695. start: "1. ",
  696. cmd: "InsertOrderedList"
  697. },
  698. {
  699. start: "* ",
  700. cmd: "InsertUnorderedList"
  701. },
  702. {
  703. start: "- ",
  704. cmd: "InsertUnorderedList"
  705. }
  706. ];
  707. var getPatternSet = function(editor) {
  708. var patterns = editor.getParam("textpattern_patterns", defaultPatterns, "array");
  709. if (!isArray(patterns)) {
  710. error("The setting textpattern_patterns should be an array");
  711. return {
  712. inlinePatterns: [],
  713. blockPatterns: []
  714. };
  715. }
  716. var normalized = partition(map(patterns, normalizePattern));
  717. each(normalized.errors, function(err) {
  718. return error(err.message, err.pattern);
  719. });
  720. return createPatternSet(normalized.values);
  721. };
  722. var getForcedRootBlock = function(editor) {
  723. var block = editor.getParam("forced_root_block", "p");
  724. if (block === false) {
  725. return "";
  726. } else if (block === true) {
  727. return "p";
  728. } else {
  729. return block;
  730. }
  731. };
  732. var global$4 = tinymce.util.Tools.resolve("tinymce.util.Delay");
  733. var global$3 = tinymce.util.Tools.resolve("tinymce.util.VK");
  734. var zeroWidth = "\uFEFF";
  735. var nbsp = " ";
  736. var global$2 = tinymce.util.Tools.resolve("tinymce.util.Tools");
  737. var global$1 = tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");
  738. var global = tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");
  739. var point = function(container, offset) {
  740. return {
  741. container,
  742. offset
  743. };
  744. };
  745. var isText = function(node) {
  746. return node.nodeType === Node.TEXT_NODE;
  747. };
  748. var cleanEmptyNodes = function(dom, node, isRoot) {
  749. if (node && dom.isEmpty(node) && !isRoot(node)) {
  750. var parent_1 = node.parentNode;
  751. dom.remove(node);
  752. cleanEmptyNodes(dom, parent_1, isRoot);
  753. }
  754. };
  755. var deleteRng = function(dom, rng, isRoot, clean) {
  756. if (clean === void 0) {
  757. clean = true;
  758. }
  759. var startParent = rng.startContainer.parentNode;
  760. var endParent = rng.endContainer.parentNode;
  761. rng.deleteContents();
  762. if (clean && !isRoot(rng.startContainer)) {
  763. if (isText(rng.startContainer) && rng.startContainer.data.length === 0) {
  764. dom.remove(rng.startContainer);
  765. }
  766. if (isText(rng.endContainer) && rng.endContainer.data.length === 0) {
  767. dom.remove(rng.endContainer);
  768. }
  769. cleanEmptyNodes(dom, startParent, isRoot);
  770. if (startParent !== endParent) {
  771. cleanEmptyNodes(dom, endParent, isRoot);
  772. }
  773. }
  774. };
  775. var isBlockFormatName = function(name, formatter) {
  776. var formatSet = formatter.get(name);
  777. return isArray(formatSet) && head(formatSet).exists(function(format) {
  778. return has(format, "block");
  779. });
  780. };
  781. var isReplacementPattern = function(pattern) {
  782. return pattern.start.length === 0;
  783. };
  784. var getParentBlock = function(editor, rng) {
  785. var parentBlockOpt = Optional.from(editor.dom.getParent(rng.startContainer, editor.dom.isBlock));
  786. if (getForcedRootBlock(editor) === "") {
  787. return parentBlockOpt.orThunk(function() {
  788. return Optional.some(editor.getBody());
  789. });
  790. } else {
  791. return parentBlockOpt;
  792. }
  793. };
  794. var DOM = global$1.DOM;
  795. var alwaysNext = function(startNode) {
  796. return function(node) {
  797. return startNode === node ? -1 : 0;
  798. };
  799. };
  800. var isBoundary = function(dom) {
  801. return function(node) {
  802. return dom.isBlock(node) || contains([
  803. "BR",
  804. "IMG",
  805. "HR",
  806. "INPUT"
  807. ], node.nodeName) || dom.getContentEditable(node) === "false";
  808. };
  809. };
  810. var textBefore = function(node, offset, rootNode) {
  811. if (isText(node) && offset >= 0) {
  812. return Optional.some(point(node, offset));
  813. } else {
  814. var textSeeker = global(DOM);
  815. return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).map(function(prev) {
  816. return point(prev.container, prev.container.data.length);
  817. });
  818. }
  819. };
  820. var textAfter = function(node, offset, rootNode) {
  821. if (isText(node) && offset >= node.length) {
  822. return Optional.some(point(node, offset));
  823. } else {
  824. var textSeeker = global(DOM);
  825. return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).map(function(prev) {
  826. return point(prev.container, 0);
  827. });
  828. }
  829. };
  830. var scanLeft = function(node, offset, rootNode) {
  831. if (!isText(node)) {
  832. return Optional.none();
  833. }
  834. var text = node.textContent;
  835. if (offset >= 0 && offset <= text.length) {
  836. return Optional.some(point(node, offset));
  837. } else {
  838. var textSeeker = global(DOM);
  839. return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).bind(function(prev) {
  840. var prevText = prev.container.data;
  841. return scanLeft(prev.container, offset + prevText.length, rootNode);
  842. });
  843. }
  844. };
  845. var scanRight = function(node, offset, rootNode) {
  846. if (!isText(node)) {
  847. return Optional.none();
  848. }
  849. var text = node.textContent;
  850. if (offset <= text.length) {
  851. return Optional.some(point(node, offset));
  852. } else {
  853. var textSeeker = global(DOM);
  854. return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).bind(function(next) {
  855. return scanRight(next.container, offset - text.length, rootNode);
  856. });
  857. }
  858. };
  859. var repeatLeft = function(dom, node, offset, process, rootNode) {
  860. var search = global(dom, isBoundary(dom));
  861. return Optional.from(search.backwards(node, offset, process, rootNode));
  862. };
  863. var generatePath = function(root, node, offset) {
  864. if (isText(node) && (offset < 0 || offset > node.data.length)) {
  865. return [];
  866. }
  867. var p = [offset];
  868. var current = node;
  869. while (current !== root && current.parentNode) {
  870. var parent_1 = current.parentNode;
  871. for (var i = 0; i < parent_1.childNodes.length; i++) {
  872. if (parent_1.childNodes[i] === current) {
  873. p.push(i);
  874. break;
  875. }
  876. }
  877. current = parent_1;
  878. }
  879. return current === root ? p.reverse() : [];
  880. };
  881. var generatePathRange = function(root, startNode, startOffset, endNode, endOffset) {
  882. var start = generatePath(root, startNode, startOffset);
  883. var end = generatePath(root, endNode, endOffset);
  884. return {
  885. start,
  886. end
  887. };
  888. };
  889. var resolvePath = function(root, path) {
  890. var nodePath = path.slice();
  891. var offset = nodePath.pop();
  892. var resolvedNode = foldl(nodePath, function(optNode, index) {
  893. return optNode.bind(function(node) {
  894. return Optional.from(node.childNodes[index]);
  895. });
  896. }, Optional.some(root));
  897. return resolvedNode.bind(function(node) {
  898. if (isText(node) && (offset < 0 || offset > node.data.length)) {
  899. return Optional.none();
  900. } else {
  901. return Optional.some({
  902. node,
  903. offset
  904. });
  905. }
  906. });
  907. };
  908. var resolvePathRange = function(root, range) {
  909. return resolvePath(root, range.start).bind(function(_a) {
  910. var startNode = _a.node, startOffset = _a.offset;
  911. return resolvePath(root, range.end).map(function(_a2) {
  912. var endNode = _a2.node, endOffset = _a2.offset;
  913. var rng = document.createRange();
  914. rng.setStart(startNode, startOffset);
  915. rng.setEnd(endNode, endOffset);
  916. return rng;
  917. });
  918. });
  919. };
  920. var generatePathRangeFromRange = function(root, range) {
  921. return generatePathRange(root, range.startContainer, range.startOffset, range.endContainer, range.endOffset);
  922. };
  923. var stripPattern = function(dom, block, pattern) {
  924. var firstTextNode = textAfter(block, 0, block);
  925. firstTextNode.each(function(spot) {
  926. var node = spot.container;
  927. scanRight(node, pattern.start.length, block).each(function(end) {
  928. var rng = dom.createRng();
  929. rng.setStart(node, 0);
  930. rng.setEnd(end.container, end.offset);
  931. deleteRng(dom, rng, function(e) {
  932. return e === block;
  933. });
  934. });
  935. });
  936. };
  937. var applyPattern$1 = function(editor, match) {
  938. var dom = editor.dom;
  939. var pattern = match.pattern;
  940. var rng = resolvePathRange(dom.getRoot(), match.range).getOrDie("Unable to resolve path range");
  941. getParentBlock(editor, rng).each(function(block) {
  942. if (pattern.type === "block-format") {
  943. if (isBlockFormatName(pattern.format, editor.formatter)) {
  944. editor.undoManager.transact(function() {
  945. stripPattern(editor.dom, block, pattern);
  946. editor.formatter.apply(pattern.format);
  947. });
  948. }
  949. } else if (pattern.type === "block-command") {
  950. editor.undoManager.transact(function() {
  951. stripPattern(editor.dom, block, pattern);
  952. editor.execCommand(pattern.cmd, false, pattern.value);
  953. });
  954. }
  955. });
  956. return true;
  957. };
  958. var findPattern$1 = function(patterns, text) {
  959. var nuText = text.replace(nbsp, " ");
  960. return find(patterns, function(pattern) {
  961. return text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0;
  962. });
  963. };
  964. var findPatterns$1 = function(editor, patterns) {
  965. var dom = editor.dom;
  966. var rng = editor.selection.getRng();
  967. return getParentBlock(editor, rng).filter(function(block) {
  968. var forcedRootBlock = getForcedRootBlock(editor);
  969. var matchesForcedRootBlock = forcedRootBlock === "" && dom.is(block, "body") || dom.is(block, forcedRootBlock);
  970. return block !== null && matchesForcedRootBlock;
  971. }).bind(function(block) {
  972. var blockText = block.textContent;
  973. var matchedPattern = findPattern$1(patterns, blockText);
  974. return matchedPattern.map(function(pattern) {
  975. if (global$2.trim(blockText).length === pattern.start.length) {
  976. return [];
  977. }
  978. return [{
  979. pattern,
  980. range: generatePathRange(dom.getRoot(), block, 0, block, 0)
  981. }];
  982. });
  983. }).getOr([]);
  984. };
  985. var applyMatches$1 = function(editor, matches) {
  986. if (matches.length === 0) {
  987. return;
  988. }
  989. var bookmark = editor.selection.getBookmark();
  990. each(matches, function(match) {
  991. return applyPattern$1(editor, match);
  992. });
  993. editor.selection.moveToBookmark(bookmark);
  994. };
  995. var unique = 0;
  996. var generate = function(prefix) {
  997. var date = /* @__PURE__ */ new Date();
  998. var time = date.getTime();
  999. var random = Math.floor(Math.random() * 1e9);
  1000. unique++;
  1001. return prefix + "_" + random + unique + String(time);
  1002. };
  1003. var checkRange = function(str, substr, start) {
  1004. return substr === "" || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
  1005. };
  1006. var endsWith = function(str, suffix) {
  1007. return checkRange(str, suffix, str.length - suffix.length);
  1008. };
  1009. var newMarker = function(dom, id) {
  1010. return dom.create("span", {
  1011. "data-mce-type": "bookmark",
  1012. id
  1013. });
  1014. };
  1015. var rangeFromMarker = function(dom, marker) {
  1016. var rng = dom.createRng();
  1017. rng.setStartAfter(marker.start);
  1018. rng.setEndBefore(marker.end);
  1019. return rng;
  1020. };
  1021. var createMarker = function(dom, markerPrefix, pathRange) {
  1022. var rng = resolvePathRange(dom.getRoot(), pathRange).getOrDie("Unable to resolve path range");
  1023. var startNode = rng.startContainer;
  1024. var endNode = rng.endContainer;
  1025. var textEnd = rng.endOffset === 0 ? endNode : endNode.splitText(rng.endOffset);
  1026. var textStart = rng.startOffset === 0 ? startNode : startNode.splitText(rng.startOffset);
  1027. return {
  1028. prefix: markerPrefix,
  1029. end: textEnd.parentNode.insertBefore(newMarker(dom, markerPrefix + "-end"), textEnd),
  1030. start: textStart.parentNode.insertBefore(newMarker(dom, markerPrefix + "-start"), textStart)
  1031. };
  1032. };
  1033. var removeMarker = function(dom, marker, isRoot) {
  1034. cleanEmptyNodes(dom, dom.get(marker.prefix + "-end"), isRoot);
  1035. cleanEmptyNodes(dom, dom.get(marker.prefix + "-start"), isRoot);
  1036. };
  1037. var matchesPattern = function(dom, block, patternContent) {
  1038. return function(element, offset) {
  1039. var text = element.data;
  1040. var searchText = text.substring(0, offset);
  1041. var startEndIndex = searchText.lastIndexOf(patternContent.charAt(patternContent.length - 1));
  1042. var startIndex = searchText.lastIndexOf(patternContent);
  1043. if (startIndex !== -1) {
  1044. return startIndex + patternContent.length;
  1045. } else if (startEndIndex !== -1) {
  1046. return startEndIndex + 1;
  1047. } else {
  1048. return -1;
  1049. }
  1050. };
  1051. };
  1052. var findPatternStartFromSpot = function(dom, pattern, block, spot) {
  1053. var startPattern = pattern.start;
  1054. var startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(dom, block, startPattern), block);
  1055. return startSpot.bind(function(spot2) {
  1056. if (spot2.offset >= startPattern.length) {
  1057. var rng = dom.createRng();
  1058. rng.setStart(spot2.container, spot2.offset - startPattern.length);
  1059. rng.setEnd(spot2.container, spot2.offset);
  1060. return Optional.some(rng);
  1061. } else {
  1062. var offset = spot2.offset - startPattern.length;
  1063. return scanLeft(spot2.container, offset, block).map(function(nextSpot) {
  1064. var rng2 = dom.createRng();
  1065. rng2.setStart(nextSpot.container, nextSpot.offset);
  1066. rng2.setEnd(spot2.container, spot2.offset);
  1067. return rng2;
  1068. }).filter(function(rng2) {
  1069. return rng2.toString() === startPattern;
  1070. }).orThunk(function() {
  1071. return findPatternStartFromSpot(dom, pattern, block, point(spot2.container, 0));
  1072. });
  1073. }
  1074. });
  1075. };
  1076. var findPatternStart = function(dom, pattern, node, offset, block, requireGap) {
  1077. if (requireGap === void 0) {
  1078. requireGap = false;
  1079. }
  1080. if (pattern.start.length === 0 && !requireGap) {
  1081. var rng = dom.createRng();
  1082. rng.setStart(node, offset);
  1083. rng.setEnd(node, offset);
  1084. return Optional.some(rng);
  1085. }
  1086. return textBefore(node, offset, block).bind(function(spot) {
  1087. var start = findPatternStartFromSpot(dom, pattern, block, spot);
  1088. return start.bind(function(startRange) {
  1089. if (requireGap) {
  1090. if (startRange.endContainer === spot.container && startRange.endOffset === spot.offset) {
  1091. return Optional.none();
  1092. } else if (spot.offset === 0 && startRange.endContainer.textContent.length === startRange.endOffset) {
  1093. return Optional.none();
  1094. }
  1095. }
  1096. return Optional.some(startRange);
  1097. });
  1098. });
  1099. };
  1100. var findPattern = function(editor, block, details) {
  1101. var dom = editor.dom;
  1102. var root = dom.getRoot();
  1103. var pattern = details.pattern;
  1104. var endNode = details.position.container;
  1105. var endOffset = details.position.offset;
  1106. return scanLeft(endNode, endOffset - details.pattern.end.length, block).bind(function(spot) {
  1107. var endPathRng = generatePathRange(root, spot.container, spot.offset, endNode, endOffset);
  1108. if (isReplacementPattern(pattern)) {
  1109. return Optional.some({
  1110. matches: [{
  1111. pattern,
  1112. startRng: endPathRng,
  1113. endRng: endPathRng
  1114. }],
  1115. position: spot
  1116. });
  1117. } else {
  1118. var resultsOpt = findPatternsRec(editor, details.remainingPatterns, spot.container, spot.offset, block);
  1119. var results_1 = resultsOpt.getOr({
  1120. matches: [],
  1121. position: spot
  1122. });
  1123. var pos = results_1.position;
  1124. var start = findPatternStart(dom, pattern, pos.container, pos.offset, block, resultsOpt.isNone());
  1125. return start.map(function(startRng) {
  1126. var startPathRng = generatePathRangeFromRange(root, startRng);
  1127. return {
  1128. matches: results_1.matches.concat([{
  1129. pattern,
  1130. startRng: startPathRng,
  1131. endRng: endPathRng
  1132. }]),
  1133. position: point(startRng.startContainer, startRng.startOffset)
  1134. };
  1135. });
  1136. }
  1137. });
  1138. };
  1139. var findPatternsRec = function(editor, patterns, node, offset, block) {
  1140. var dom = editor.dom;
  1141. return textBefore(node, offset, dom.getRoot()).bind(function(endSpot) {
  1142. var rng = dom.createRng();
  1143. rng.setStart(block, 0);
  1144. rng.setEnd(node, offset);
  1145. var text = rng.toString();
  1146. for (var i = 0; i < patterns.length; i++) {
  1147. var pattern = patterns[i];
  1148. if (!endsWith(text, pattern.end)) {
  1149. continue;
  1150. }
  1151. var patternsWithoutCurrent = patterns.slice();
  1152. patternsWithoutCurrent.splice(i, 1);
  1153. var result = findPattern(editor, block, {
  1154. pattern,
  1155. remainingPatterns: patternsWithoutCurrent,
  1156. position: endSpot
  1157. });
  1158. if (result.isSome()) {
  1159. return result;
  1160. }
  1161. }
  1162. return Optional.none();
  1163. });
  1164. };
  1165. var applyPattern = function(editor, pattern, patternRange) {
  1166. editor.selection.setRng(patternRange);
  1167. if (pattern.type === "inline-format") {
  1168. each(pattern.format, function(format) {
  1169. editor.formatter.apply(format);
  1170. });
  1171. } else {
  1172. editor.execCommand(pattern.cmd, false, pattern.value);
  1173. }
  1174. };
  1175. var applyReplacementPattern = function(editor, pattern, marker, isRoot) {
  1176. var markerRange = rangeFromMarker(editor.dom, marker);
  1177. deleteRng(editor.dom, markerRange, isRoot);
  1178. applyPattern(editor, pattern, markerRange);
  1179. };
  1180. var applyPatternWithContent = function(editor, pattern, startMarker, endMarker, isRoot) {
  1181. var dom = editor.dom;
  1182. var markerEndRange = rangeFromMarker(dom, endMarker);
  1183. var markerStartRange = rangeFromMarker(dom, startMarker);
  1184. deleteRng(dom, markerStartRange, isRoot);
  1185. deleteRng(dom, markerEndRange, isRoot);
  1186. var patternMarker = {
  1187. prefix: startMarker.prefix,
  1188. start: startMarker.end,
  1189. end: endMarker.start
  1190. };
  1191. var patternRange = rangeFromMarker(dom, patternMarker);
  1192. applyPattern(editor, pattern, patternRange);
  1193. };
  1194. var addMarkers = function(dom, matches) {
  1195. var markerPrefix = generate("mce_textpattern");
  1196. var matchesWithEnds = foldr(matches, function(acc, match) {
  1197. var endMarker = createMarker(dom, markerPrefix + ("_end" + acc.length), match.endRng);
  1198. return acc.concat([__assign(__assign({}, match), { endMarker })]);
  1199. }, []);
  1200. return foldr(matchesWithEnds, function(acc, match) {
  1201. var idx = matchesWithEnds.length - acc.length - 1;
  1202. var startMarker = isReplacementPattern(match.pattern) ? match.endMarker : createMarker(dom, markerPrefix + ("_start" + idx), match.startRng);
  1203. return acc.concat([__assign(__assign({}, match), { startMarker })]);
  1204. }, []);
  1205. };
  1206. var findPatterns = function(editor, patterns, space) {
  1207. var rng = editor.selection.getRng();
  1208. if (rng.collapsed === false) {
  1209. return [];
  1210. }
  1211. return getParentBlock(editor, rng).bind(function(block) {
  1212. var offset = rng.startOffset - (space ? 1 : 0);
  1213. return findPatternsRec(editor, patterns, rng.startContainer, offset, block);
  1214. }).fold(function() {
  1215. return [];
  1216. }, function(result) {
  1217. return result.matches;
  1218. });
  1219. };
  1220. var applyMatches = function(editor, matches) {
  1221. if (matches.length === 0) {
  1222. return;
  1223. }
  1224. var dom = editor.dom;
  1225. var bookmark = editor.selection.getBookmark();
  1226. var matchesWithMarkers = addMarkers(dom, matches);
  1227. each(matchesWithMarkers, function(match) {
  1228. var block = dom.getParent(match.startMarker.start, dom.isBlock);
  1229. var isRoot = function(node) {
  1230. return node === block;
  1231. };
  1232. if (isReplacementPattern(match.pattern)) {
  1233. applyReplacementPattern(editor, match.pattern, match.endMarker, isRoot);
  1234. } else {
  1235. applyPatternWithContent(editor, match.pattern, match.startMarker, match.endMarker, isRoot);
  1236. }
  1237. removeMarker(dom, match.endMarker, isRoot);
  1238. removeMarker(dom, match.startMarker, isRoot);
  1239. });
  1240. editor.selection.moveToBookmark(bookmark);
  1241. };
  1242. var handleEnter = function(editor, patternSet) {
  1243. if (!editor.selection.isCollapsed()) {
  1244. return false;
  1245. }
  1246. var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, false);
  1247. var blockMatches = findPatterns$1(editor, patternSet.blockPatterns);
  1248. if (blockMatches.length > 0 || inlineMatches.length > 0) {
  1249. editor.undoManager.add();
  1250. editor.undoManager.extra(function() {
  1251. editor.execCommand("mceInsertNewLine");
  1252. }, function() {
  1253. editor.insertContent(zeroWidth);
  1254. applyMatches(editor, inlineMatches);
  1255. applyMatches$1(editor, blockMatches);
  1256. var range = editor.selection.getRng();
  1257. var spot = textBefore(range.startContainer, range.startOffset, editor.dom.getRoot());
  1258. editor.execCommand("mceInsertNewLine");
  1259. spot.each(function(s) {
  1260. var node = s.container;
  1261. if (node.data.charAt(s.offset - 1) === zeroWidth) {
  1262. node.deleteData(s.offset - 1, 1);
  1263. cleanEmptyNodes(editor.dom, node.parentNode, function(e) {
  1264. return e === editor.dom.getRoot();
  1265. });
  1266. }
  1267. });
  1268. });
  1269. return true;
  1270. }
  1271. return false;
  1272. };
  1273. var handleInlineKey = function(editor, patternSet) {
  1274. var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, true);
  1275. if (inlineMatches.length > 0) {
  1276. editor.undoManager.transact(function() {
  1277. applyMatches(editor, inlineMatches);
  1278. });
  1279. }
  1280. };
  1281. var checkKeyEvent = function(codes, event, predicate) {
  1282. for (var i = 0; i < codes.length; i++) {
  1283. if (predicate(codes[i], event)) {
  1284. return true;
  1285. }
  1286. }
  1287. return false;
  1288. };
  1289. var checkKeyCode = function(codes, event) {
  1290. return checkKeyEvent(codes, event, function(code, event2) {
  1291. return code === event2.keyCode && global$3.modifierPressed(event2) === false;
  1292. });
  1293. };
  1294. var checkCharCode = function(chars, event) {
  1295. return checkKeyEvent(chars, event, function(chr, event2) {
  1296. return chr.charCodeAt(0) === event2.charCode;
  1297. });
  1298. };
  1299. var setup = function(editor, patternsState) {
  1300. var charCodes = [
  1301. ",",
  1302. ".",
  1303. ";",
  1304. ":",
  1305. "!",
  1306. "?"
  1307. ];
  1308. var keyCodes = [32];
  1309. editor.on("keydown", function(e) {
  1310. if (e.keyCode === 13 && !global$3.modifierPressed(e)) {
  1311. if (handleEnter(editor, patternsState.get())) {
  1312. e.preventDefault();
  1313. }
  1314. }
  1315. }, true);
  1316. editor.on("keyup", function(e) {
  1317. if (checkKeyCode(keyCodes, e)) {
  1318. handleInlineKey(editor, patternsState.get());
  1319. }
  1320. });
  1321. editor.on("keypress", function(e) {
  1322. if (checkCharCode(charCodes, e)) {
  1323. global$4.setEditorTimeout(editor, function() {
  1324. handleInlineKey(editor, patternsState.get());
  1325. });
  1326. }
  1327. });
  1328. };
  1329. function Plugin() {
  1330. global$5.add("textpattern", function(editor) {
  1331. var patternsState = Cell(getPatternSet(editor));
  1332. setup(editor, patternsState);
  1333. return get(patternsState);
  1334. });
  1335. }
  1336. Plugin();
  1337. })();
  1338. }
  1339. });
  1340. // node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/textpattern/index.js
  1341. require_plugin();
  1342. //# sourceMappingURL=tinymce_plugins_textpattern.js.map