plugin.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. (function () {
  2. var toc = (function () {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  5. var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  6. var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n');
  7. var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  8. var getTocClass = function (editor) {
  9. return editor.getParam('toc_class', 'mce-toc');
  10. };
  11. var getTocHeader = function (editor) {
  12. var tagName = editor.getParam('toc_header', 'h2');
  13. return /^h[1-6]$/.test(tagName) ? tagName : 'h2';
  14. };
  15. var getTocDepth = function (editor) {
  16. var depth = parseInt(editor.getParam('toc_depth', '3'), 10);
  17. return depth >= 1 && depth <= 9 ? depth : 3;
  18. };
  19. var $_7vx431sajkmcws8w = {
  20. getTocClass: getTocClass,
  21. getTocHeader: getTocHeader,
  22. getTocDepth: getTocDepth
  23. };
  24. var create = function (prefix) {
  25. var counter = 0;
  26. return function () {
  27. var guid = new Date().getTime().toString(32);
  28. return prefix + guid + (counter++).toString(32);
  29. };
  30. };
  31. var $_2iqtzbsbjkmcws8x = { create: create };
  32. var tocId = $_2iqtzbsbjkmcws8x.create('mcetoc_');
  33. var generateSelector = function generateSelector(depth) {
  34. var i;
  35. var selector = [];
  36. for (i = 1; i <= depth; i++) {
  37. selector.push('h' + i);
  38. }
  39. return selector.join(',');
  40. };
  41. var hasHeaders = function (editor) {
  42. return readHeaders(editor).length > 0;
  43. };
  44. var readHeaders = function (editor) {
  45. var tocClass = $_7vx431sajkmcws8w.getTocClass(editor);
  46. var headerTag = $_7vx431sajkmcws8w.getTocHeader(editor);
  47. var selector = generateSelector($_7vx431sajkmcws8w.getTocDepth(editor));
  48. var headers = editor.$(selector);
  49. if (headers.length && /^h[1-9]$/i.test(headerTag)) {
  50. headers = headers.filter(function (i, el) {
  51. return !editor.dom.hasClass(el.parentNode, tocClass);
  52. });
  53. }
  54. return global$3.map(headers, function (h) {
  55. return {
  56. id: h.id ? h.id : tocId(),
  57. level: parseInt(h.nodeName.replace(/^H/i, ''), 10),
  58. title: editor.$.text(h),
  59. element: h
  60. };
  61. });
  62. };
  63. var getMinLevel = function (headers) {
  64. var i, minLevel = 9;
  65. for (i = 0; i < headers.length; i++) {
  66. if (headers[i].level < minLevel) {
  67. minLevel = headers[i].level;
  68. }
  69. if (minLevel === 1) {
  70. return minLevel;
  71. }
  72. }
  73. return minLevel;
  74. };
  75. var generateTitle = function (tag, title) {
  76. var openTag = '<' + tag + ' contenteditable="true">';
  77. var closeTag = '</' + tag + '>';
  78. return openTag + global$1.DOM.encode(title) + closeTag;
  79. };
  80. var generateTocHtml = function (editor) {
  81. var html = generateTocContentHtml(editor);
  82. return '<div class="' + editor.dom.encode($_7vx431sajkmcws8w.getTocClass(editor)) + '" contenteditable="false">' + html + '</div>';
  83. };
  84. var generateTocContentHtml = function (editor) {
  85. var html = '';
  86. var headers = readHeaders(editor);
  87. var prevLevel = getMinLevel(headers) - 1;
  88. var i, ii, h, nextLevel;
  89. if (!headers.length) {
  90. return '';
  91. }
  92. html += generateTitle($_7vx431sajkmcws8w.getTocHeader(editor), global$2.translate('Table of Contents'));
  93. for (i = 0; i < headers.length; i++) {
  94. h = headers[i];
  95. h.element.id = h.id;
  96. nextLevel = headers[i + 1] && headers[i + 1].level;
  97. if (prevLevel === h.level) {
  98. html += '<li>';
  99. } else {
  100. for (ii = prevLevel; ii < h.level; ii++) {
  101. html += '<ul><li>';
  102. }
  103. }
  104. html += '<a href="#' + h.id + '">' + h.title + '</a>';
  105. if (nextLevel === h.level || !nextLevel) {
  106. html += '</li>';
  107. if (!nextLevel) {
  108. html += '</ul>';
  109. }
  110. } else {
  111. for (ii = h.level; ii > nextLevel; ii--) {
  112. html += '</li></ul><li>';
  113. }
  114. }
  115. prevLevel = h.level;
  116. }
  117. return html;
  118. };
  119. var isEmptyOrOffscren = function (editor, nodes) {
  120. return !nodes.length || editor.dom.getParents(nodes[0], '.mce-offscreen-selection').length > 0;
  121. };
  122. var insertToc = function (editor) {
  123. var tocClass = $_7vx431sajkmcws8w.getTocClass(editor);
  124. var $tocElm = editor.$('.' + tocClass);
  125. if (isEmptyOrOffscren(editor, $tocElm)) {
  126. editor.insertContent(generateTocHtml(editor));
  127. } else {
  128. updateToc(editor);
  129. }
  130. };
  131. var updateToc = function (editor) {
  132. var tocClass = $_7vx431sajkmcws8w.getTocClass(editor);
  133. var $tocElm = editor.$('.' + tocClass);
  134. if ($tocElm.length) {
  135. editor.undoManager.transact(function () {
  136. $tocElm.html(generateTocContentHtml(editor));
  137. });
  138. }
  139. };
  140. var $_1dj9nrs6jkmcws8q = {
  141. hasHeaders: hasHeaders,
  142. insertToc: insertToc,
  143. updateToc: updateToc
  144. };
  145. var register = function (editor) {
  146. editor.addCommand('mceInsertToc', function () {
  147. $_1dj9nrs6jkmcws8q.insertToc(editor);
  148. });
  149. editor.addCommand('mceUpdateToc', function () {
  150. $_1dj9nrs6jkmcws8q.updateToc(editor);
  151. });
  152. };
  153. var $_f9555ys5jkmcws8o = { register: register };
  154. var setup = function (editor) {
  155. var $ = editor.$, tocClass = $_7vx431sajkmcws8w.getTocClass(editor);
  156. editor.on('PreProcess', function (e) {
  157. var $tocElm = $('.' + tocClass, e.node);
  158. if ($tocElm.length) {
  159. $tocElm.removeAttr('contentEditable');
  160. $tocElm.find('[contenteditable]').removeAttr('contentEditable');
  161. }
  162. });
  163. editor.on('SetContent', function () {
  164. var $tocElm = $('.' + tocClass);
  165. if ($tocElm.length) {
  166. $tocElm.attr('contentEditable', false);
  167. $tocElm.children(':first-child').attr('contentEditable', true);
  168. }
  169. });
  170. };
  171. var $_bxhthfscjkmcws8y = { setup: setup };
  172. var toggleState = function (editor) {
  173. return function (e) {
  174. var ctrl = e.control;
  175. editor.on('LoadContent SetContent change', function () {
  176. ctrl.disabled(editor.readonly || !$_1dj9nrs6jkmcws8q.hasHeaders(editor));
  177. });
  178. };
  179. };
  180. var isToc = function (editor) {
  181. return function (elm) {
  182. return elm && editor.dom.is(elm, '.' + $_7vx431sajkmcws8w.getTocClass(editor)) && editor.getBody().contains(elm);
  183. };
  184. };
  185. var register$1 = function (editor) {
  186. editor.addButton('toc', {
  187. tooltip: 'Table of Contents',
  188. cmd: 'mceInsertToc',
  189. icon: 'toc',
  190. onPostRender: toggleState(editor)
  191. });
  192. editor.addButton('tocupdate', {
  193. tooltip: 'Update',
  194. cmd: 'mceUpdateToc',
  195. icon: 'reload'
  196. });
  197. editor.addMenuItem('toc', {
  198. text: 'Table of Contents',
  199. context: 'insert',
  200. cmd: 'mceInsertToc',
  201. onPostRender: toggleState(editor)
  202. });
  203. editor.addContextToolbar(isToc(editor), 'tocupdate');
  204. };
  205. var $_5n5bxlsdjkmcws8z = { register: register$1 };
  206. global.add('toc', function (editor) {
  207. $_f9555ys5jkmcws8o.register(editor);
  208. $_5n5bxlsdjkmcws8z.register(editor);
  209. $_bxhthfscjkmcws8y.setup(editor);
  210. });
  211. function Plugin () {
  212. }
  213. return Plugin;
  214. }());
  215. })();