plugin.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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.1 (2019-02-21)
  8. */
  9. (function () {
  10. var help = (function () {
  11. 'use strict';
  12. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  13. var constant = function (value) {
  14. return function () {
  15. return value;
  16. };
  17. };
  18. function curry(fn) {
  19. var initialArgs = [];
  20. for (var _i = 1; _i < arguments.length; _i++) {
  21. initialArgs[_i - 1] = arguments[_i];
  22. }
  23. return function () {
  24. var restArgs = [];
  25. for (var _i = 0; _i < arguments.length; _i++) {
  26. restArgs[_i] = arguments[_i];
  27. }
  28. var all = initialArgs.concat(restArgs);
  29. return fn.apply(null, all);
  30. };
  31. }
  32. var not = function (f) {
  33. return function () {
  34. var args = [];
  35. for (var _i = 0; _i < arguments.length; _i++) {
  36. args[_i] = arguments[_i];
  37. }
  38. return !f.apply(null, args);
  39. };
  40. };
  41. var never = constant(false);
  42. var always = constant(true);
  43. var never$1 = never;
  44. var always$1 = always;
  45. var none = function () {
  46. return NONE;
  47. };
  48. var NONE = function () {
  49. var eq = function (o) {
  50. return o.isNone();
  51. };
  52. var call = function (thunk) {
  53. return thunk();
  54. };
  55. var id = function (n) {
  56. return n;
  57. };
  58. var noop = function () {
  59. };
  60. var nul = function () {
  61. return null;
  62. };
  63. var undef = function () {
  64. return undefined;
  65. };
  66. var me = {
  67. fold: function (n, s) {
  68. return n();
  69. },
  70. is: never$1,
  71. isSome: never$1,
  72. isNone: always$1,
  73. getOr: id,
  74. getOrThunk: call,
  75. getOrDie: function (msg) {
  76. throw new Error(msg || 'error: getOrDie called on none.');
  77. },
  78. getOrNull: nul,
  79. getOrUndefined: undef,
  80. or: id,
  81. orThunk: call,
  82. map: none,
  83. ap: none,
  84. each: noop,
  85. bind: none,
  86. flatten: none,
  87. exists: never$1,
  88. forall: always$1,
  89. filter: none,
  90. equals: eq,
  91. equals_: eq,
  92. toArray: function () {
  93. return [];
  94. },
  95. toString: constant('none()')
  96. };
  97. if (Object.freeze)
  98. Object.freeze(me);
  99. return me;
  100. }();
  101. var some = function (a) {
  102. var constant_a = function () {
  103. return a;
  104. };
  105. var self = function () {
  106. return me;
  107. };
  108. var map = function (f) {
  109. return some(f(a));
  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$1,
  122. isNone: never$1,
  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: map,
  131. ap: function (optfab) {
  132. return optfab.fold(none, function (fab) {
  133. return some(fab(a));
  134. });
  135. },
  136. each: function (f) {
  137. f(a);
  138. },
  139. bind: bind,
  140. flatten: constant_a,
  141. exists: bind,
  142. forall: bind,
  143. filter: function (f) {
  144. return f(a) ? me : NONE;
  145. },
  146. equals: function (o) {
  147. return o.is(a);
  148. },
  149. equals_: function (o, elementEq) {
  150. return o.fold(never$1, function (b) {
  151. return elementEq(a, b);
  152. });
  153. },
  154. toArray: function () {
  155. return [a];
  156. },
  157. toString: function () {
  158. return 'some(' + a + ')';
  159. }
  160. };
  161. return me;
  162. };
  163. var from = function (value) {
  164. return value === null || value === undefined ? NONE : some(value);
  165. };
  166. var Option = {
  167. some: some,
  168. none: none,
  169. from: from
  170. };
  171. var typeOf = function (x) {
  172. if (x === null)
  173. return 'null';
  174. var t = typeof x;
  175. if (t === 'object' && Array.prototype.isPrototypeOf(x))
  176. return 'array';
  177. if (t === 'object' && String.prototype.isPrototypeOf(x))
  178. return 'string';
  179. return t;
  180. };
  181. var isType = function (type) {
  182. return function (value) {
  183. return typeOf(value) === type;
  184. };
  185. };
  186. var isFunction = isType('function');
  187. var rawIndexOf = function () {
  188. var pIndexOf = Array.prototype.indexOf;
  189. var fastIndex = function (xs, x) {
  190. return pIndexOf.call(xs, x);
  191. };
  192. var slowIndex = function (xs, x) {
  193. return slowIndexOf(xs, x);
  194. };
  195. return pIndexOf === undefined ? slowIndex : fastIndex;
  196. }();
  197. var contains = function (xs, x) {
  198. return rawIndexOf(xs, x) > -1;
  199. };
  200. var map = function (xs, f) {
  201. var len = xs.length;
  202. var r = new Array(len);
  203. for (var i = 0; i < len; i++) {
  204. var x = xs[i];
  205. r[i] = f(x, i, xs);
  206. }
  207. return r;
  208. };
  209. var filter = function (xs, pred) {
  210. var r = [];
  211. for (var i = 0, len = xs.length; i < len; i++) {
  212. var x = xs[i];
  213. if (pred(x, i, xs)) {
  214. r.push(x);
  215. }
  216. }
  217. return r;
  218. };
  219. var find = function (xs, pred) {
  220. for (var i = 0, len = xs.length; i < len; i++) {
  221. var x = xs[i];
  222. if (pred(x, i, xs)) {
  223. return Option.some(x);
  224. }
  225. }
  226. return Option.none();
  227. };
  228. var slowIndexOf = function (xs, x) {
  229. for (var i = 0, len = xs.length; i < len; ++i) {
  230. if (xs[i] === x) {
  231. return i;
  232. }
  233. }
  234. return -1;
  235. };
  236. var slice = Array.prototype.slice;
  237. var from$1 = isFunction(Array.from) ? Array.from : function (x) {
  238. return slice.call(x);
  239. };
  240. var shortcuts = [
  241. {
  242. shortcuts: ['Meta + B'],
  243. action: 'Bold'
  244. },
  245. {
  246. shortcuts: ['Meta + I'],
  247. action: 'Italic'
  248. },
  249. {
  250. shortcuts: ['Meta + U'],
  251. action: 'Underline'
  252. },
  253. {
  254. shortcuts: ['Meta + A'],
  255. action: 'Select all'
  256. },
  257. {
  258. shortcuts: [
  259. 'Meta + Y',
  260. 'Meta + Shift + Z'
  261. ],
  262. action: 'Redo'
  263. },
  264. {
  265. shortcuts: ['Meta + Z'],
  266. action: 'Undo'
  267. },
  268. {
  269. shortcuts: ['Access + 1'],
  270. action: 'Header 1'
  271. },
  272. {
  273. shortcuts: ['Access + 2'],
  274. action: 'Header 2'
  275. },
  276. {
  277. shortcuts: ['Access + 3'],
  278. action: 'Header 3'
  279. },
  280. {
  281. shortcuts: ['Access + 4'],
  282. action: 'Header 4'
  283. },
  284. {
  285. shortcuts: ['Access + 5'],
  286. action: 'Header 5'
  287. },
  288. {
  289. shortcuts: ['Access + 6'],
  290. action: 'Header 6'
  291. },
  292. {
  293. shortcuts: ['Access + 7'],
  294. action: 'Paragraph'
  295. },
  296. {
  297. shortcuts: ['Access + 8'],
  298. action: 'Div'
  299. },
  300. {
  301. shortcuts: ['Access + 9'],
  302. action: 'Address'
  303. },
  304. {
  305. shortcuts: ['Alt + 0'],
  306. action: 'Open help dialog'
  307. },
  308. {
  309. shortcuts: ['Alt + F9'],
  310. action: 'Focus to menubar'
  311. },
  312. {
  313. shortcuts: ['Alt + F10'],
  314. action: 'Focus to toolbar'
  315. },
  316. {
  317. shortcuts: ['Alt + F11'],
  318. action: 'Focus to element path'
  319. },
  320. {
  321. shortcuts: ['Ctrl + F9'],
  322. action: 'Focus to contextual toolbar'
  323. },
  324. {
  325. shortcuts: ['Shift + Enter'],
  326. action: 'Open popup menu for split buttons'
  327. },
  328. {
  329. shortcuts: ['Meta + K'],
  330. action: 'Insert link (if link plugin activated)'
  331. },
  332. {
  333. shortcuts: ['Meta + S'],
  334. action: 'Save (if save plugin activated)'
  335. },
  336. {
  337. shortcuts: ['Meta + F'],
  338. action: 'Find (if searchreplace plugin activated)'
  339. },
  340. {
  341. shortcuts: ['Meta + Shift + F'],
  342. action: 'Switch to or from fullscreen mode'
  343. }
  344. ];
  345. var KeyboardShortcuts = { shortcuts: shortcuts };
  346. var keys = Object.keys;
  347. var hasOwnProperty = Object.hasOwnProperty;
  348. var has = function (obj, key) {
  349. return hasOwnProperty.call(obj, key);
  350. };
  351. var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
  352. var convertText = function (source) {
  353. var mac = {
  354. alt: '&#x2325;',
  355. ctrl: '&#x2303;',
  356. shift: '&#x21E7;',
  357. meta: '&#x2318;',
  358. access: '&#x2303;&#x2325;'
  359. };
  360. var other = {
  361. meta: 'Ctrl ',
  362. access: 'Shift + Alt '
  363. };
  364. var replace = global$1.mac ? mac : other;
  365. var shortcut = source.split('+');
  366. var updated = map(shortcut, function (segment) {
  367. var search = segment.toLowerCase().trim();
  368. return has(replace, search) ? replace[search] : segment;
  369. });
  370. return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+');
  371. };
  372. var ConvertShortcut = { convertText: convertText };
  373. var tab = function () {
  374. var shortcutList = map(KeyboardShortcuts.shortcuts, function (shortcut) {
  375. var shortcutText = map(shortcut.shortcuts, ConvertShortcut.convertText).join(' or ');
  376. return [
  377. shortcut.action,
  378. shortcutText
  379. ];
  380. });
  381. var tablePanel = {
  382. type: 'table',
  383. header: [
  384. 'Action',
  385. 'Shortcut'
  386. ],
  387. cells: shortcutList
  388. };
  389. return {
  390. title: 'Handy Shortcuts',
  391. items: [tablePanel]
  392. };
  393. };
  394. var KeyboardShortcutsTab = { tab: tab };
  395. var supplant = function (str, obj) {
  396. var isStringOrNumber = function (a) {
  397. var t = typeof a;
  398. return t === 'string' || t === 'number';
  399. };
  400. return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) {
  401. var value = obj[key];
  402. return isStringOrNumber(value) ? value.toString() : fullMatch;
  403. });
  404. };
  405. var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n');
  406. var urls = [
  407. {
  408. key: 'advlist',
  409. name: 'Advanced List'
  410. },
  411. {
  412. key: 'anchor',
  413. name: 'Anchor'
  414. },
  415. {
  416. key: 'autolink',
  417. name: 'Autolink'
  418. },
  419. {
  420. key: 'autoresize',
  421. name: 'Autoresize'
  422. },
  423. {
  424. key: 'autosave',
  425. name: 'Autosave'
  426. },
  427. {
  428. key: 'bbcode',
  429. name: 'BBCode'
  430. },
  431. {
  432. key: 'charmap',
  433. name: 'Character Map'
  434. },
  435. {
  436. key: 'code',
  437. name: 'Code'
  438. },
  439. {
  440. key: 'codesample',
  441. name: 'Code Sample'
  442. },
  443. {
  444. key: 'colorpicker',
  445. name: 'Color Picker'
  446. },
  447. {
  448. key: 'directionality',
  449. name: 'Directionality'
  450. },
  451. {
  452. key: 'emoticons',
  453. name: 'Emoticons'
  454. },
  455. {
  456. key: 'fullpage',
  457. name: 'Full Page'
  458. },
  459. {
  460. key: 'fullscreen',
  461. name: 'Full Screen'
  462. },
  463. {
  464. key: 'help',
  465. name: 'Help'
  466. },
  467. {
  468. key: 'hr',
  469. name: 'Horizontal Rule'
  470. },
  471. {
  472. key: 'image',
  473. name: 'Image'
  474. },
  475. {
  476. key: 'imagetools',
  477. name: 'Image Tools'
  478. },
  479. {
  480. key: 'importcss',
  481. name: 'Import CSS'
  482. },
  483. {
  484. key: 'insertdatetime',
  485. name: 'Insert Date/Time'
  486. },
  487. {
  488. key: 'legacyoutput',
  489. name: 'Legacy Output'
  490. },
  491. {
  492. key: 'link',
  493. name: 'Link'
  494. },
  495. {
  496. key: 'lists',
  497. name: 'Lists'
  498. },
  499. {
  500. key: 'media',
  501. name: 'Media'
  502. },
  503. {
  504. key: 'nonbreaking',
  505. name: 'Nonbreaking'
  506. },
  507. {
  508. key: 'noneditable',
  509. name: 'Noneditable'
  510. },
  511. {
  512. key: 'pagebreak',
  513. name: 'Page Break'
  514. },
  515. {
  516. key: 'paste',
  517. name: 'Paste'
  518. },
  519. {
  520. key: 'preview',
  521. name: 'Preview'
  522. },
  523. {
  524. key: 'print',
  525. name: 'Print'
  526. },
  527. {
  528. key: 'save',
  529. name: 'Save'
  530. },
  531. {
  532. key: 'searchreplace',
  533. name: 'Search and Replace'
  534. },
  535. {
  536. key: 'spellchecker',
  537. name: 'Spell Checker'
  538. },
  539. {
  540. key: 'tabfocus',
  541. name: 'Tab Focus'
  542. },
  543. {
  544. key: 'table',
  545. name: 'Table'
  546. },
  547. {
  548. key: 'template',
  549. name: 'Template'
  550. },
  551. {
  552. key: 'textcolor',
  553. name: 'Text Color'
  554. },
  555. {
  556. key: 'textpattern',
  557. name: 'Text Pattern'
  558. },
  559. {
  560. key: 'toc',
  561. name: 'Table of Contents'
  562. },
  563. {
  564. key: 'visualblocks',
  565. name: 'Visual Blocks'
  566. },
  567. {
  568. key: 'visualchars',
  569. name: 'Visual Characters'
  570. },
  571. {
  572. key: 'wordcount',
  573. name: 'Word Count'
  574. },
  575. {
  576. key: 'advcode',
  577. name: 'Advanced Code Editor*'
  578. },
  579. {
  580. key: 'formatpainter',
  581. name: 'Format Painter*'
  582. },
  583. {
  584. key: 'powerpaste',
  585. name: 'PowerPaste*'
  586. },
  587. {
  588. key: 'tinydrive',
  589. name: 'Tiny Drive*'
  590. },
  591. {
  592. key: 'tinymcespellchecker',
  593. name: 'Spell Checker Pro*'
  594. },
  595. {
  596. key: 'a11ychecker',
  597. name: 'Accessibility Checker*'
  598. },
  599. {
  600. key: 'linkchecker',
  601. name: 'Link Checker*'
  602. },
  603. {
  604. key: 'mentions',
  605. name: 'Mentions*'
  606. },
  607. {
  608. key: 'mediaembed',
  609. name: 'Enhanced Media Embed*'
  610. }
  611. ];
  612. var PluginUrls = { urls: urls };
  613. var tab$1 = function (editor) {
  614. var availablePlugins = function () {
  615. var premiumPlugins = [
  616. 'Accessibility Checker',
  617. 'Advanced Code Editor',
  618. 'Tiny Comments',
  619. 'Tiny Drive',
  620. 'Enhanced Media Embed',
  621. 'Format Painter',
  622. 'Link Checker',
  623. 'Mentions',
  624. 'MoxieManager',
  625. 'PowerPaste',
  626. 'Spell Checker Pro'
  627. ];
  628. var premiumPluginList = map(premiumPlugins, function (plugin) {
  629. return '<li>' + global$2.translate(plugin) + '</li>';
  630. }).join('');
  631. return '<div data-mce-tabstop="1" tabindex="-1">' + '<p><b>' + global$2.translate('Premium plugins:') + '</b></p>' + '<ul>' + premiumPluginList + '<li style="list-style: none; margin-top: 1em;"><a href="https://www.tiny.cloud/pricing/?utm_campaign=editor_referral&utm_medium=help_dialog&utm_source=tinymce" target="_blank">' + global$2.translate('Learn more...') + '</a></li>' + '</ul>' + '</div>';
  632. };
  633. var makeLink = curry(supplant, '<a href="${url}" target="_blank" rel="noopener">${name}</a>');
  634. var maybeUrlize = function (editor, key) {
  635. return find(PluginUrls.urls, function (x) {
  636. return x.key === key;
  637. }).fold(function () {
  638. var getMetadata = editor.plugins[key].getMetadata;
  639. return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key;
  640. }, function (x) {
  641. return makeLink({
  642. name: x.name,
  643. url: 'https://www.tiny.cloud/docs/plugins/' + x.key
  644. });
  645. });
  646. };
  647. var getPluginKeys = function (editor) {
  648. var keys$1 = keys(editor.plugins);
  649. return editor.settings.forced_plugins === undefined ? keys$1 : filter(keys$1, not(curry(contains, editor.settings.forced_plugins)));
  650. };
  651. var pluginLister = function (editor) {
  652. var pluginKeys = getPluginKeys(editor);
  653. var pluginLis = map(pluginKeys, function (key) {
  654. return '<li>' + maybeUrlize(editor, key) + '</li>';
  655. });
  656. var count = pluginLis.length;
  657. var pluginsString = pluginLis.join('');
  658. var html = '<p><b>' + global$2.translate([
  659. 'Plugins installed ({0}):',
  660. count
  661. ]) + '</b></p>' + '<ul>' + pluginsString + '</ul>';
  662. return html;
  663. };
  664. var installedPlugins = function (editor) {
  665. if (editor == null) {
  666. return '';
  667. }
  668. return '<div data-mce-tabstop="1" tabindex="-1">' + pluginLister(editor) + '</div>';
  669. };
  670. var htmlPanel = {
  671. type: 'htmlpanel',
  672. html: [
  673. installedPlugins(editor),
  674. availablePlugins()
  675. ].join('')
  676. };
  677. return {
  678. title: 'Plugins',
  679. items: [htmlPanel]
  680. };
  681. };
  682. var PluginsTab = { tab: tab$1 };
  683. var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager');
  684. var defaultPanel = function () {
  685. var getVersion = function (major, minor) {
  686. return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor;
  687. };
  688. var version = getVersion(global$3.majorVersion, global$3.minorVersion);
  689. var changeLogLink = '<a href="https://www.tinymce.com/docs/changelog/?utm_campaign=editor_referral&utm_medium=help_dialog&utm_source=tinymce" target="_blank">TinyMCE ' + version + '</a>';
  690. var htmlPanel = {
  691. type: 'htmlpanel',
  692. html: '<p>' + global$2.translate([
  693. 'You are using {0}',
  694. changeLogLink
  695. ]) + '</p>'
  696. };
  697. return htmlPanel;
  698. };
  699. var VersionPanel = { defaultPanel: defaultPanel };
  700. var getVersionPanel = function (editor) {
  701. return editor.getParam('help_version', VersionPanel.defaultPanel, 'function')();
  702. };
  703. var Settings = { getVersionPanel: getVersionPanel };
  704. var tab$2 = function (editor) {
  705. return {
  706. title: 'Version',
  707. items: [Settings.getVersionPanel(editor)]
  708. };
  709. };
  710. var VersionTab = { tab: tab$2 };
  711. var opener = function (editor) {
  712. return function () {
  713. var body = {
  714. type: 'tabpanel',
  715. tabs: [
  716. KeyboardShortcutsTab.tab(),
  717. PluginsTab.tab(editor),
  718. VersionTab.tab(editor)
  719. ]
  720. };
  721. editor.windowManager.open({
  722. title: 'Help',
  723. size: 'medium',
  724. body: body,
  725. buttons: [{
  726. type: 'cancel',
  727. name: 'close',
  728. text: 'Close',
  729. primary: true
  730. }],
  731. initialData: {}
  732. });
  733. };
  734. };
  735. var Dialog = { opener: opener };
  736. var register = function (editor) {
  737. editor.addCommand('mceHelp', Dialog.opener(editor));
  738. };
  739. var Commands = { register: register };
  740. var register$1 = function (editor) {
  741. editor.ui.registry.addButton('help', {
  742. icon: 'help',
  743. tooltip: 'Help',
  744. onAction: Dialog.opener(editor)
  745. });
  746. editor.ui.registry.addMenuItem('help', {
  747. text: 'Help',
  748. icon: 'help',
  749. shortcut: 'Alt+0',
  750. onAction: Dialog.opener(editor)
  751. });
  752. };
  753. var Buttons = { register: register$1 };
  754. global.add('help', function (editor) {
  755. Buttons.register(editor);
  756. Commands.register(editor);
  757. editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp');
  758. });
  759. function Plugin () {
  760. }
  761. return Plugin;
  762. }());
  763. })();