[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
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 }());
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |