Subversion Repositories oidplus

Rev

Rev 1042 | Go to most recent revision | View as "text/javascript" | Blame | Compare with Previous | Last modification | View Log | RSS feed

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