blockquote.js 5.8 KB

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