autolink.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ///import core
  2. ///commands 为非ie浏览器自动添加a标签
  3. ///commandsName AutoLink
  4. ///commandsTitle 自动增加链接
  5. /**
  6. * @description 为非ie浏览器自动添加a标签
  7. * @author zhanyi
  8. */
  9. UE.plugins['autolink'] = function() {
  10. var cont = 0;
  11. if (browser.ie) {
  12. return;
  13. }
  14. var me = this;
  15. me.addListener('reset',function(){
  16. cont = 0;
  17. });
  18. me.addListener('keydown', function(type, evt) {
  19. var keyCode = evt.keyCode || evt.which;
  20. if (keyCode == 32 || keyCode == 13) {
  21. var sel = me.selection.getNative(),
  22. range = sel.getRangeAt(0).cloneRange(),
  23. offset,
  24. charCode;
  25. var start = range.startContainer;
  26. while (start.nodeType == 1 && range.startOffset > 0) {
  27. start = range.startContainer.childNodes[range.startOffset - 1];
  28. if (!start){
  29. break;
  30. }
  31. range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length);
  32. range.collapse(true);
  33. start = range.startContainer;
  34. }
  35. do{
  36. if (range.startOffset == 0) {
  37. start = range.startContainer.previousSibling;
  38. while (start && start.nodeType == 1) {
  39. start = start.lastChild;
  40. }
  41. if (!start || domUtils.isFillChar(start)){
  42. break;
  43. }
  44. offset = start.nodeValue.length;
  45. } else {
  46. start = range.startContainer;
  47. offset = range.startOffset;
  48. }
  49. range.setStart(start, offset - 1);
  50. charCode = range.toString().charCodeAt(0);
  51. } while (charCode != 160 && charCode != 32);
  52. if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) {
  53. while(range.toString().length){
  54. if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){
  55. break;
  56. }
  57. try{
  58. range.setStart(range.startContainer,range.startOffset+1);
  59. }catch(e){
  60. //trace:2121
  61. var start = range.startContainer;
  62. while(!(next = start.nextSibling)){
  63. if(domUtils.isBody(start)){
  64. return;
  65. }
  66. start = start.parentNode;
  67. }
  68. range.setStart(next,0);
  69. }
  70. }
  71. //range的开始边界已经在a标签里的不再处理
  72. if(domUtils.findParentByTagName(range.startContainer,'a',true)){
  73. return;
  74. }
  75. var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href;
  76. me.undoManger && me.undoManger.save();
  77. a.appendChild(range.extractContents());
  78. a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,'');
  79. href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),'');
  80. href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href;
  81. a.setAttribute('data_ue_src',utils.html(href));
  82. a.href = utils.html(href);
  83. range.insertNode(a);
  84. a.parentNode.insertBefore(text, a.nextSibling);
  85. range.setStart(text, 0);
  86. range.collapse(true);
  87. sel.removeAllRanges();
  88. sel.addRange(range);
  89. me.undoManger && me.undoManger.save();
  90. }
  91. }
  92. });
  93. };