autolink.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. ///import core
  2. ///commands 为非ie浏览器自动添加a标签
  3. ///commandsName AutoLink
  4. ///commandsTitle 自动增加链接
  5. /**
  6. * @description 为非ie浏览器自动添加a标签
  7. * @author zhanyi
  8. */
  9. UE.plugin.register('autolink',function(){
  10. var cont = 0;
  11. return !browser.ie ? {
  12. bindEvents:{
  13. 'reset' : function(){
  14. cont = 0;
  15. },
  16. 'keydown':function(type, evt) {
  17. var me = this;
  18. var keyCode = evt.keyCode || evt.which;
  19. if (keyCode == 32 || keyCode == 13) {
  20. var sel = me.selection.getNative(),
  21. range = sel.getRangeAt(0).cloneRange(),
  22. offset,
  23. charCode;
  24. var start = range.startContainer;
  25. while (start.nodeType == 1 && range.startOffset > 0) {
  26. start = range.startContainer.childNodes[range.startOffset - 1];
  27. if (!start){
  28. break;
  29. }
  30. range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length);
  31. range.collapse(true);
  32. start = range.startContainer;
  33. }
  34. do{
  35. if (range.startOffset == 0) {
  36. start = range.startContainer.previousSibling;
  37. while (start && start.nodeType == 1) {
  38. start = start.lastChild;
  39. }
  40. if (!start || domUtils.isFillChar(start)){
  41. break;
  42. }
  43. offset = start.nodeValue.length;
  44. } else {
  45. start = range.startContainer;
  46. offset = range.startOffset;
  47. }
  48. range.setStart(start, offset - 1);
  49. charCode = range.toString().charCodeAt(0);
  50. } while (charCode != 160 && charCode != 32);
  51. if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) {
  52. while(range.toString().length){
  53. if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){
  54. break;
  55. }
  56. try{
  57. range.setStart(range.startContainer,range.startOffset+1);
  58. }catch(e){
  59. //trace:2121
  60. var start = range.startContainer;
  61. while(!(next = start.nextSibling)){
  62. if(domUtils.isBody(start)){
  63. return;
  64. }
  65. start = start.parentNode;
  66. }
  67. range.setStart(next,0);
  68. }
  69. }
  70. //range的开始边界已经在a标签里的不再处理
  71. if(domUtils.findParentByTagName(range.startContainer,'a',true)){
  72. return;
  73. }
  74. var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href;
  75. me.undoManger && me.undoManger.save();
  76. a.appendChild(range.extractContents());
  77. a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,'');
  78. href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),'');
  79. href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href;
  80. a.setAttribute('_src',utils.html(href));
  81. a.href = utils.html(href);
  82. range.insertNode(a);
  83. a.parentNode.insertBefore(text, a.nextSibling);
  84. range.setStart(text, 0);
  85. range.collapse(true);
  86. sel.removeAllRanges();
  87. sel.addRange(range);
  88. me.undoManger && me.undoManger.save();
  89. }
  90. }
  91. }
  92. }
  93. }:{}
  94. },function(){
  95. var keyCodes = {
  96. 37:1, 38:1, 39:1, 40:1,
  97. 13:1,32:1
  98. };
  99. function checkIsCludeLink(node){
  100. if(node.nodeType == 3){
  101. return null
  102. }
  103. if(node.nodeName == 'A'){
  104. return node;
  105. }
  106. var lastChild = node.lastChild;
  107. while(lastChild){
  108. if(lastChild.nodeName == 'A'){
  109. return lastChild;
  110. }
  111. if(lastChild.nodeType == 3){
  112. if(domUtils.isWhitespace(lastChild)){
  113. lastChild = lastChild.previousSibling;
  114. continue;
  115. }
  116. return null
  117. }
  118. lastChild = lastChild.lastChild;
  119. }
  120. }
  121. browser.ie && this.addListener('keyup',function(cmd,evt){
  122. var me = this,keyCode = evt.keyCode;
  123. if(keyCodes[keyCode]){
  124. var rng = me.selection.getRange();
  125. var start = rng.startContainer;
  126. if(keyCode == 13){
  127. while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){
  128. start = start.parentNode;
  129. }
  130. if(start && !domUtils.isBody(start) && start.nodeName == 'P'){
  131. var pre = start.previousSibling;
  132. if(pre && pre.nodeType == 1){
  133. var pre = checkIsCludeLink(pre);
  134. if(pre && !pre.getAttribute('_href')){
  135. domUtils.remove(pre,true);
  136. }
  137. }
  138. }
  139. }else if(keyCode == 32 ){
  140. if(start.nodeType == 3 && /^\s$/.test(start.nodeValue)){
  141. start = start.previousSibling;
  142. if(start && start.nodeName == 'A' && !start.getAttribute('_href')){
  143. domUtils.remove(start,true);
  144. }
  145. }
  146. }else {
  147. start = domUtils.findParentByTagName(start,'a',true);
  148. if(start && !start.getAttribute('_href')){
  149. var bk = rng.createBookmark();
  150. domUtils.remove(start,true);
  151. rng.moveToBookmark(bk).select(true)
  152. }
  153. }
  154. }
  155. });
  156. }
  157. );