autolink.js 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. 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. offset = start.nodeValue.length;
  43. } else {
  44. start = range.startContainer;
  45. offset = range.startOffset;
  46. }
  47. range.setStart(start, offset - 1);
  48. charCode = range.toString().charCodeAt(0);
  49. } while (charCode != 160 && charCode != 32);
  50. if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) {
  51. while(range.toString().length){
  52. if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){
  53. break;
  54. }
  55. try{
  56. range.setStart(range.startContainer,range.startOffset+1)
  57. }catch(e){
  58. //trace:2121
  59. var start = range.startContainer;
  60. while(!(next = start.nextSibling)){
  61. if(domUtils.isBody(start)){
  62. return;
  63. }
  64. start = start.parentNode;
  65. }
  66. range.setStart(next,0)
  67. }
  68. }
  69. var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href;
  70. me.undoManger && me.undoManger.save();
  71. a.appendChild(range.extractContents());
  72. a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,'');
  73. href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),'');
  74. href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href;
  75. a.setAttribute('data_ue_src',href);
  76. a.href = href;
  77. range.insertNode(a);
  78. a.parentNode.insertBefore(text, a.nextSibling);
  79. range.setStart(text, 0);
  80. range.collapse(true);
  81. sel.removeAllRanges();
  82. sel.addRange(range);
  83. me.undoManger && me.undoManger.save();
  84. }
  85. }
  86. })
  87. };