plugin.js 44 KB

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