plugin.js 43 KB

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