[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/vendor/tinymce/plugins/autolink/ -> 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$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');
  13  
  14      var checkRange = function (str, substr, start) {
  15        return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
  16      };
  17      var contains = function (str, substr) {
  18        return str.indexOf(substr) !== -1;
  19      };
  20      var startsWith = function (str, prefix) {
  21        return checkRange(str, prefix, 0);
  22      };
  23  
  24      var global = tinymce.util.Tools.resolve('tinymce.Env');
  25  
  26      var link = function () {
  27        return /(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g;
  28      };
  29  
  30      var defaultLinkPattern = new RegExp('^' + link().source + '$', 'i');
  31      var getAutoLinkPattern = function (editor) {
  32        return editor.getParam('autolink_pattern', defaultLinkPattern);
  33      };
  34      var getDefaultLinkTarget = function (editor) {
  35        return editor.getParam('default_link_target', false);
  36      };
  37      var getDefaultLinkProtocol = function (editor) {
  38        return editor.getParam('link_default_protocol', 'http', 'string');
  39      };
  40  
  41      var rangeEqualsBracketOrSpace = function (rangeString) {
  42        return /^[(\[{ \u00a0]$/.test(rangeString);
  43      };
  44      var isTextNode = function (node) {
  45        return node.nodeType === 3;
  46      };
  47      var isElement = function (node) {
  48        return node.nodeType === 1;
  49      };
  50      var handleBracket = function (editor) {
  51        return parseCurrentLine(editor, -1);
  52      };
  53      var handleSpacebar = function (editor) {
  54        return parseCurrentLine(editor, 0);
  55      };
  56      var handleEnter = function (editor) {
  57        return parseCurrentLine(editor, -1);
  58      };
  59      var scopeIndex = function (container, index) {
  60        if (index < 0) {
  61          index = 0;
  62        }
  63        if (isTextNode(container)) {
  64          var len = container.data.length;
  65          if (index > len) {
  66            index = len;
  67          }
  68        }
  69        return index;
  70      };
  71      var setStart = function (rng, container, offset) {
  72        if (!isElement(container) || container.hasChildNodes()) {
  73          rng.setStart(container, scopeIndex(container, offset));
  74        } else {
  75          rng.setStartBefore(container);
  76        }
  77      };
  78      var setEnd = function (rng, container, offset) {
  79        if (!isElement(container) || container.hasChildNodes()) {
  80          rng.setEnd(container, scopeIndex(container, offset));
  81        } else {
  82          rng.setEndAfter(container);
  83        }
  84      };
  85      var hasProtocol = function (url) {
  86        return /^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(url);
  87      };
  88      var isPunctuation = function (char) {
  89        return /[?!,.;:]/.test(char);
  90      };
  91      var parseCurrentLine = function (editor, endOffset) {
  92        var end, endContainer, bookmark, text, prev, len, rngText;
  93        var autoLinkPattern = getAutoLinkPattern(editor);
  94        var defaultLinkTarget = getDefaultLinkTarget(editor);
  95        if (editor.dom.getParent(editor.selection.getNode(), 'a[href]') !== null) {
  96          return;
  97        }
  98        var rng = editor.selection.getRng().cloneRange();
  99        if (rng.startOffset < 5) {
 100          prev = rng.endContainer.previousSibling;
 101          if (!prev) {
 102            if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) {
 103              return;
 104            }
 105            prev = rng.endContainer.firstChild.nextSibling;
 106          }
 107          len = prev.length;
 108          setStart(rng, prev, len);
 109          setEnd(rng, prev, len);
 110          if (rng.endOffset < 5) {
 111            return;
 112          }
 113          end = rng.endOffset;
 114          endContainer = prev;
 115        } else {
 116          endContainer = rng.endContainer;
 117          if (!isTextNode(endContainer) && endContainer.firstChild) {
 118            while (!isTextNode(endContainer) && endContainer.firstChild) {
 119              endContainer = endContainer.firstChild;
 120            }
 121            if (isTextNode(endContainer)) {
 122              setStart(rng, endContainer, 0);
 123              setEnd(rng, endContainer, endContainer.nodeValue.length);
 124            }
 125          }
 126          if (rng.endOffset === 1) {
 127            end = 2;
 128          } else {
 129            end = rng.endOffset - 1 - endOffset;
 130          }
 131        }
 132        var start = end;
 133        do {
 134          setStart(rng, endContainer, end >= 2 ? end - 2 : 0);
 135          setEnd(rng, endContainer, end >= 1 ? end - 1 : 0);
 136          end -= 1;
 137          rngText = rng.toString();
 138        } while (!rangeEqualsBracketOrSpace(rngText) && end - 2 >= 0);
 139        if (rangeEqualsBracketOrSpace(rng.toString())) {
 140          setStart(rng, endContainer, end);
 141          setEnd(rng, endContainer, start);
 142          end += 1;
 143        } else if (rng.startOffset === 0) {
 144          setStart(rng, endContainer, 0);
 145          setEnd(rng, endContainer, start);
 146        } else {
 147          setStart(rng, endContainer, end);
 148          setEnd(rng, endContainer, start);
 149        }
 150        text = rng.toString();
 151        if (isPunctuation(text.charAt(text.length - 1))) {
 152          setEnd(rng, endContainer, start - 1);
 153        }
 154        text = rng.toString().trim();
 155        var matches = text.match(autoLinkPattern);
 156        var protocol = getDefaultLinkProtocol(editor);
 157        if (matches) {
 158          var url = matches[0];
 159          if (startsWith(url, 'www.')) {
 160            url = protocol + '://' + url;
 161          } else if (contains(url, '@') && !hasProtocol(url)) {
 162            url = 'mailto:' + url;
 163          }
 164          bookmark = editor.selection.getBookmark();
 165          editor.selection.setRng(rng);
 166          editor.execCommand('createlink', false, url);
 167          if (defaultLinkTarget !== false) {
 168            editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget);
 169          }
 170          editor.selection.moveToBookmark(bookmark);
 171          editor.nodeChanged();
 172        }
 173      };
 174      var setup = function (editor) {
 175        var autoUrlDetectState;
 176        editor.on('keydown', function (e) {
 177          if (e.keyCode === 13) {
 178            return handleEnter(editor);
 179          }
 180        });
 181        if (global.browser.isIE()) {
 182          editor.on('focus', function () {
 183            if (!autoUrlDetectState) {
 184              autoUrlDetectState = true;
 185              try {
 186                editor.execCommand('AutoUrlDetect', false, true);
 187              } catch (ex) {
 188              }
 189            }
 190          });
 191          return;
 192        }
 193        editor.on('keypress', function (e) {
 194          if (e.keyCode === 41 || e.keyCode === 93 || e.keyCode === 125) {
 195            return handleBracket(editor);
 196          }
 197        });
 198        editor.on('keyup', function (e) {
 199          if (e.keyCode === 32) {
 200            return handleSpacebar(editor);
 201          }
 202        });
 203      };
 204  
 205      function Plugin () {
 206        global$1.add('autolink', function (editor) {
 207          setup(editor);
 208        });
 209      }
 210  
 211      Plugin();
 212  
 213  }());


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