plugin.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. (function () {
  2. var autolink = (function () {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  5. var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
  6. var getAutoLinkPattern = function (editor) {
  7. return editor.getParam('autolink_pattern', /^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i);
  8. };
  9. var getDefaultLinkTarget = function (editor) {
  10. return editor.getParam('default_link_target', '');
  11. };
  12. var $_etr1bi8vjkmcwo3m = {
  13. getAutoLinkPattern: getAutoLinkPattern,
  14. getDefaultLinkTarget: getDefaultLinkTarget
  15. };
  16. var rangeEqualsDelimiterOrSpace = function (rangeString, delimiter) {
  17. return rangeString === delimiter || rangeString === ' ' || rangeString.charCodeAt(0) === 160;
  18. };
  19. var handleEclipse = function (editor) {
  20. parseCurrentLine(editor, -1, '(');
  21. };
  22. var handleSpacebar = function (editor) {
  23. parseCurrentLine(editor, 0, '');
  24. };
  25. var handleEnter = function (editor) {
  26. parseCurrentLine(editor, -1, '');
  27. };
  28. var scopeIndex = function (container, index) {
  29. if (index < 0) {
  30. index = 0;
  31. }
  32. if (container.nodeType === 3) {
  33. var len = container.data.length;
  34. if (index > len) {
  35. index = len;
  36. }
  37. }
  38. return index;
  39. };
  40. var setStart = function (rng, container, offset) {
  41. if (container.nodeType !== 1 || container.hasChildNodes()) {
  42. rng.setStart(container, scopeIndex(container, offset));
  43. } else {
  44. rng.setStartBefore(container);
  45. }
  46. };
  47. var setEnd = function (rng, container, offset) {
  48. if (container.nodeType !== 1 || container.hasChildNodes()) {
  49. rng.setEnd(container, scopeIndex(container, offset));
  50. } else {
  51. rng.setEndAfter(container);
  52. }
  53. };
  54. var parseCurrentLine = function (editor, endOffset, delimiter) {
  55. var rng, end, start, endContainer, bookmark, text, matches, prev, len, rngText;
  56. var autoLinkPattern = $_etr1bi8vjkmcwo3m.getAutoLinkPattern(editor);
  57. var defaultLinkTarget = $_etr1bi8vjkmcwo3m.getDefaultLinkTarget(editor);
  58. if (editor.selection.getNode().tagName === 'A') {
  59. return;
  60. }
  61. rng = editor.selection.getRng(true).cloneRange();
  62. if (rng.startOffset < 5) {
  63. prev = rng.endContainer.previousSibling;
  64. if (!prev) {
  65. if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) {
  66. return;
  67. }
  68. prev = rng.endContainer.firstChild.nextSibling;
  69. }
  70. len = prev.length;
  71. setStart(rng, prev, len);
  72. setEnd(rng, prev, len);
  73. if (rng.endOffset < 5) {
  74. return;
  75. }
  76. end = rng.endOffset;
  77. endContainer = prev;
  78. } else {
  79. endContainer = rng.endContainer;
  80. if (endContainer.nodeType !== 3 && endContainer.firstChild) {
  81. while (endContainer.nodeType !== 3 && endContainer.firstChild) {
  82. endContainer = endContainer.firstChild;
  83. }
  84. if (endContainer.nodeType === 3) {
  85. setStart(rng, endContainer, 0);
  86. setEnd(rng, endContainer, endContainer.nodeValue.length);
  87. }
  88. }
  89. if (rng.endOffset === 1) {
  90. end = 2;
  91. } else {
  92. end = rng.endOffset - 1 - endOffset;
  93. }
  94. }
  95. start = end;
  96. do {
  97. setStart(rng, endContainer, end >= 2 ? end - 2 : 0);
  98. setEnd(rng, endContainer, end >= 1 ? end - 1 : 0);
  99. end -= 1;
  100. rngText = rng.toString();
  101. } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter);
  102. if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) {
  103. setStart(rng, endContainer, end);
  104. setEnd(rng, endContainer, start);
  105. end += 1;
  106. } else if (rng.startOffset === 0) {
  107. setStart(rng, endContainer, 0);
  108. setEnd(rng, endContainer, start);
  109. } else {
  110. setStart(rng, endContainer, end);
  111. setEnd(rng, endContainer, start);
  112. }
  113. text = rng.toString();
  114. if (text.charAt(text.length - 1) === '.') {
  115. setEnd(rng, endContainer, start - 1);
  116. }
  117. text = rng.toString().trim();
  118. matches = text.match(autoLinkPattern);
  119. if (matches) {
  120. if (matches[1] === 'www.') {
  121. matches[1] = 'http://www.';
  122. } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) {
  123. matches[1] = 'mailto:' + matches[1];
  124. }
  125. bookmark = editor.selection.getBookmark();
  126. editor.selection.setRng(rng);
  127. editor.execCommand('createlink', false, matches[1] + matches[2]);
  128. if (defaultLinkTarget) {
  129. editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget);
  130. }
  131. editor.selection.moveToBookmark(bookmark);
  132. editor.nodeChanged();
  133. }
  134. };
  135. var setup = function (editor) {
  136. var autoUrlDetectState;
  137. editor.on('keydown', function (e) {
  138. if (e.keyCode === 13) {
  139. return handleEnter(editor);
  140. }
  141. });
  142. if (global$1.ie) {
  143. editor.on('focus', function () {
  144. if (!autoUrlDetectState) {
  145. autoUrlDetectState = true;
  146. try {
  147. editor.execCommand('AutoUrlDetect', false, true);
  148. } catch (ex) {
  149. }
  150. }
  151. });
  152. return;
  153. }
  154. editor.on('keypress', function (e) {
  155. if (e.keyCode === 41) {
  156. return handleEclipse(editor);
  157. }
  158. });
  159. editor.on('keyup', function (e) {
  160. if (e.keyCode === 32) {
  161. return handleSpacebar(editor);
  162. }
  163. });
  164. };
  165. var $_eivkp88tjkmcwo3h = { setup: setup };
  166. global.add('autolink', function (editor) {
  167. $_eivkp88tjkmcwo3h.setup(editor);
  168. });
  169. function Plugin () {
  170. }
  171. return Plugin;
  172. }());
  173. })();