blockquote.js 5.5 KB

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