[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/vendor/tinymce/plugins/toc/ -> plugin.js (source)

   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.5 (2022-05-25)
   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  }());


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer