formatmatch.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * 格式刷,只格式inline的
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. /**
  7. * 格式刷
  8. * @command formatmatch
  9. * @method execCommand
  10. * @remind 该操作不能复制段落格式
  11. * @param { String } cmd 命令字符串
  12. * @example
  13. * ```javascript
  14. * //editor是编辑器实例
  15. * //获取格式刷
  16. * editor.execCommand( 'formatmatch' );
  17. * ```
  18. */
  19. UE.plugins['formatmatch'] = function(){
  20. var me = this,
  21. list = [],img,
  22. flag = 0;
  23. me.addListener('reset',function(){
  24. list = [];
  25. flag = 0;
  26. });
  27. function addList(type,evt){
  28. if(browser.webkit){
  29. var target = evt.target.tagName == 'IMG' ? evt.target : null;
  30. }
  31. function addFormat(range){
  32. if(text){
  33. range.selectNode(text);
  34. }
  35. return range.applyInlineStyle(list[list.length-1].tagName,null,list);
  36. }
  37. me.undoManger && me.undoManger.save();
  38. var range = me.selection.getRange(),
  39. imgT = target || range.getClosedNode();
  40. if(img && imgT && imgT.tagName == 'IMG'){
  41. //trace:964
  42. imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline');
  43. img = null;
  44. }else{
  45. if(!img){
  46. var collapsed = range.collapsed;
  47. if(collapsed){
  48. var text = me.document.createTextNode('match');
  49. range.insertNode(text).select();
  50. }
  51. me.__hasEnterExecCommand = true;
  52. //不能把block上的属性干掉
  53. //trace:1553
  54. var removeFormatAttributes = me.options.removeFormatAttributes;
  55. me.options.removeFormatAttributes = '';
  56. me.execCommand('removeformat');
  57. me.options.removeFormatAttributes = removeFormatAttributes;
  58. me.__hasEnterExecCommand = false;
  59. //trace:969
  60. range = me.selection.getRange();
  61. if(list.length){
  62. addFormat(range);
  63. }
  64. if(text){
  65. range.setStartBefore(text).collapse(true);
  66. }
  67. range.select();
  68. text && domUtils.remove(text);
  69. }
  70. }
  71. me.undoManger && me.undoManger.save();
  72. me.removeListener('mouseup',addList);
  73. flag = 0;
  74. }
  75. me.commands['formatmatch'] = {
  76. execCommand : function( cmdName ) {
  77. if(flag){
  78. flag = 0;
  79. list = [];
  80. me.removeListener('mouseup',addList);
  81. return;
  82. }
  83. var range = me.selection.getRange();
  84. img = range.getClosedNode();
  85. if(!img || img.tagName != 'IMG'){
  86. range.collapse(true).shrinkBoundary();
  87. var start = range.startContainer;
  88. list = domUtils.findParents(start,true,function(node){
  89. return !domUtils.isBlockElm(node) && node.nodeType == 1;
  90. });
  91. //a不能加入格式刷, 并且克隆节点
  92. for(var i=0,ci;ci=list[i];i++){
  93. if(ci.tagName == 'A'){
  94. list.splice(i,1);
  95. break;
  96. }
  97. }
  98. }
  99. me.addListener('mouseup',addList);
  100. flag = 1;
  101. },
  102. queryCommandState : function() {
  103. return flag;
  104. },
  105. notNeedUndo : 1
  106. };
  107. };