fckblockquotecommand.js
上传用户:ah_jiwei
上传日期:2022-07-24
资源大小:54044k
文件大小:6k
源码类别:

数据库编程

开发平台:

Visual C++

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2007 Frederico Caldeira Knabben
  4.  *
  5.  * == BEGIN LICENSE ==
  6.  *
  7.  * Licensed under the terms of any of the following licenses at your
  8.  * choice:
  9.  *
  10.  *  - GNU General Public License Version 2 or later (the "GPL")
  11.  *    http://www.gnu.org/licenses/gpl.html
  12.  *
  13.  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  14.  *    http://www.gnu.org/licenses/lgpl.html
  15.  *
  16.  *  - Mozilla Public License Version 1.1 or later (the "MPL")
  17.  *    http://www.mozilla.org/MPL/MPL-1.1.html
  18.  *
  19.  * == END LICENSE ==
  20.  *
  21.  * FCKBlockQuoteCommand Class: adds or removes blockquote tags.
  22.  */
  23. var FCKBlockQuoteCommand = function()
  24. {
  25. }
  26. FCKBlockQuoteCommand.prototype = 
  27. {
  28. Execute : function()
  29. {
  30. FCKUndo.SaveUndoStep() ;
  31. var state = this.GetState() ;
  32. var range = new FCKDomRange( FCK.EditorWindow ) ;
  33. range.MoveToSelection() ;
  34. var bookmark = range.CreateBookmark() ;
  35. var iterator = new FCKDomRangeIterator( range ) ;
  36. var block ;
  37. if ( state == FCK_TRISTATE_OFF )
  38. {
  39. iterator.EnforceRealBlocks = true ;
  40. var paragraphs = [] ;
  41. while ( ( block = iterator.GetNextParagraph() ) )
  42. paragraphs.push( block ) ;
  43. // Make sure all paragraphs have the same parent.
  44. var commonParent = paragraphs[0].parentNode ;
  45. var tmp = [] ;
  46. for ( var i = 0 ; i < paragraphs.length ; i++ )
  47. {
  48. block = paragraphs[i] ;
  49. commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;
  50. }
  51. var lastBlock = null ;
  52. while ( paragraphs.length > 0 )
  53. {
  54. block = paragraphs.shift() ;
  55. while ( block.parentNode != commonParent )
  56. block = block.parentNode ;
  57. if ( block != lastBlock )
  58. tmp.push( block ) ;
  59. lastBlock = block ;
  60. }
  61. // If any of the selected blocks is a blockquote, remove it to prevent nested blockquotes.
  62. while ( tmp.length > 0 )
  63. {
  64. block = tmp.shift() ;
  65. if ( block.nodeName.IEquals( 'blockquote' ) )
  66. {
  67. var docFrag = block.ownerDocument.createDocumentFragment() ;
  68. while ( block.firstChild )
  69. {
  70. docFrag.appendChild( block.removeChild( block.firstChild ) ) ;
  71. paragraphs.push( docFrag.lastChild ) ;
  72. }
  73. block.parentNode.replaceChild( docFrag, block ) ;
  74. }
  75. else
  76. paragraphs.push( block ) ;
  77. }
  78. // Now we have all the blocks to be included in a new blockquote node.
  79. var bqBlock = range.Window.document.createElement( 'blockquote' ) ;
  80. commonParent.insertBefore( bqBlock, paragraphs[0] ) ;
  81. while ( paragraphs.length > 0 )
  82. {
  83. block = paragraphs.shift() ;
  84. bqBlock.appendChild( block ) ;
  85. }
  86. }
  87. else if ( state == FCK_TRISTATE_ON )
  88. {
  89. var moveOutNodes = [] ;
  90. while ( ( block = iterator.GetNextParagraph() ) )
  91. {
  92. var bqParent = null ;
  93. var bqChild = null ;
  94. while ( block.parentNode )
  95. {
  96. if ( block.parentNode.nodeName.IEquals( 'blockquote' ) )
  97. {
  98. bqParent = block.parentNode ;
  99. bqChild = block ;
  100. break ;
  101. }
  102. block = block.parentNode ;
  103. }
  104. if ( bqParent && bqChild )
  105. moveOutNodes.push( bqChild ) ;
  106. }
  107. var movedNodes = [] ;
  108. while ( moveOutNodes.length > 0 )
  109. {
  110. var node = moveOutNodes.shift() ;
  111. var bqBlock = node.parentNode ;
  112. // If the node is located at the beginning or the end, just take it out without splitting.
  113. // Otherwise, split the blockquote node and move the paragraph in between the two blockquote nodes.
  114. if ( node == node.parentNode.firstChild )
  115. {
  116. bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock ) ;
  117. if ( ! bqBlock.firstChild )
  118. bqBlock.parentNode.removeChild( bqBlock ) ;
  119. }
  120. else if ( node == node.parentNode.lastChild )
  121. {
  122. bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock.nextSibling ) ;
  123. if ( ! bqBlock.firstChild )
  124. bqBlock.parentNode.removeChild( bqBlock ) ;
  125. }
  126. else
  127. FCKDomTools.BreakParent( node, node.parentNode, range ) ;
  128. movedNodes.push( node ) ;
  129. }
  130. if ( FCKConfig.EnterMode.IEquals( 'br' ) )
  131. {
  132. while ( movedNodes.length )
  133. {
  134. var node = movedNodes.shift() ;
  135. var firstTime = true ;
  136. if ( node.nodeName.IEquals( 'div' ) )
  137. {
  138. var docFrag = node.ownerDocument.createDocumentFragment() ;
  139. var needBeginBr = firstTime && node.previousSibling && 
  140. !FCKListsLib.BlockBoundaries[node.previousSibling.nodeName.toLowerCase()] ;
  141. if ( firstTime && needBeginBr )
  142. docFrag.appendChild( node.ownerDocument.createElement( 'br' ) ) ;
  143. var needEndBr = node.nextSibling && 
  144. !FCKListsLib.BlockBoundaries[node.nextSibling.nodeName.toLowerCase()] ;
  145. while ( node.firstChild )
  146. docFrag.appendChild( node.removeChild( node.firstChild ) ) ;
  147. if ( needEndBr )
  148. docFrag.appendChild( node.ownerDocument.createElement( 'br' ) ) ;
  149. node.parentNode.replaceChild( docFrag, node ) ;
  150. firstTime = false ;
  151. }
  152. }
  153. }
  154. }
  155. range.MoveToBookmark( bookmark ) ;
  156. range.Select() ;
  157. FCK.Focus() ;
  158. FCK.Events.FireEvent( 'OnSelectionChange' ) ;
  159. },
  160. GetState : function()
  161. {
  162. // Disabled if not WYSIWYG.
  163. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
  164. return FCK_TRISTATE_DISABLED ;
  165. var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
  166. var firstBlock = path.Block || path.BlockLimit ;
  167. if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
  168. return FCK_TRISTATE_OFF ;
  169. // See if the first block has a blockquote parent.
  170. for ( var i = 0 ; i < path.Elements.length ; i++ )
  171. {
  172. if ( path.Elements[i].nodeName.IEquals( 'blockquote' ) )
  173. return FCK_TRISTATE_ON ;
  174. }
  175. return FCK_TRISTATE_OFF ;
  176. }
  177. } ;