blockquote.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. ///import core
  2. ///commands 引用
  3. ///commandsName BlockQuote
  4. ///commandsTitle 引用
  5. /**
  6. *
  7. * 引用模块实现
  8. * @function
  9. * @name baidu.editor.execCommand
  10. * @param {String} cmdName blockquote引用
  11. */
  12. (function() {
  13. var getObj = function(editor){
  14. // var startNode = editor.selection.getStart();
  15. // return domUtils.findParentByTagName( startNode, 'blockquote', true )
  16. return utils.findNode(editor.selection.getStartElementPath(),['blockquote'])
  17. };
  18. UE.commands['blockquote'] = {
  19. execCommand : function( cmdName, attrs ) {
  20. var range = this.selection.getRange(),
  21. obj = getObj(this),
  22. blockquote = dtd.blockquote,
  23. bookmark = range.createBookmark(),
  24. tds = this.currentSelectedArr;
  25. if ( obj ) {
  26. if(tds && tds.length){
  27. domUtils.remove(obj,true)
  28. }else{
  29. var start = range.startContainer,
  30. startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}),
  31. end = range.endContainer,
  32. endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)});
  33. //处理一下li
  34. startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock;
  35. endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock;
  36. if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj){
  37. domUtils.remove(obj,true)
  38. }else{
  39. domUtils.breakParent(startBlock,obj);
  40. }
  41. if(startBlock !== endBlock){
  42. obj = domUtils.findParentByTagName(endBlock,'blockquote');
  43. if(obj){
  44. if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'){
  45. domUtils.remove(obj,true)
  46. }else{
  47. domUtils.breakParent(endBlock,obj);
  48. }
  49. }
  50. }
  51. var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote');
  52. for(var i=0,bi;bi=blockquotes[i++];){
  53. if(!bi.childNodes.length){
  54. domUtils.remove(bi)
  55. }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){
  56. domUtils.remove(bi,true)
  57. }
  58. }
  59. }
  60. } else {
  61. var tmpRange = range.cloneRange(),
  62. node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode,
  63. preNode = node,
  64. doEnd = 1;
  65. //调整开始
  66. while ( 1 ) {
  67. if ( domUtils.isBody(node) ) {
  68. if ( preNode !== node ) {
  69. if ( range.collapsed ) {
  70. tmpRange.selectNode( preNode );
  71. doEnd = 0;
  72. } else {
  73. tmpRange.setStartBefore( preNode );
  74. }
  75. }else{
  76. tmpRange.setStart(node,0)
  77. }
  78. break;
  79. }
  80. if ( !blockquote[node.tagName] ) {
  81. if ( range.collapsed ) {
  82. tmpRange.selectNode( preNode )
  83. } else
  84. tmpRange.setStartBefore( preNode);
  85. break;
  86. }
  87. preNode = node;
  88. node = node.parentNode;
  89. }
  90. //调整结束
  91. if ( doEnd ) {
  92. preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode;
  93. while ( 1 ) {
  94. if ( domUtils.isBody( node ) ) {
  95. if ( preNode !== node ) {
  96. tmpRange.setEndAfter( preNode );
  97. } else {
  98. tmpRange.setEnd( node, node.childNodes.length )
  99. }
  100. break;
  101. }
  102. if ( !blockquote[node.tagName] ) {
  103. tmpRange.setEndAfter( preNode );
  104. break;
  105. }
  106. preNode = node;
  107. node = node.parentNode;
  108. }
  109. }
  110. node = range.document.createElement( 'blockquote' );
  111. domUtils.setAttributes( node, attrs );
  112. node.appendChild( tmpRange.extractContents() );
  113. tmpRange.insertNode( node );
  114. //去除重复的
  115. var childs = domUtils.getElementsByTagName(node,'blockquote');
  116. for(var i=0,ci;ci=childs[i++];){
  117. if(ci.parentNode){
  118. domUtils.remove(ci,true)
  119. }
  120. }
  121. }
  122. range.moveToBookmark( bookmark ).select()
  123. },
  124. queryCommandState : function() {
  125. if(this.highlight){
  126. return -1;
  127. }
  128. return getObj(this) ? 1 : 0;
  129. }
  130. };
  131. })();