fcklisthandler.js
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:5k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

ASP/ASPX

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2009 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.  * Tool object to manage HTML lists items (UL, OL and LI).
  22.  */
  23. var FCKListHandler =
  24. {
  25. OutdentListItem : function( listItem )
  26. {
  27. var eParent = listItem.parentNode ;
  28. // It may happen that a LI is not in a UL or OL (Orphan).
  29. if ( eParent.tagName.toUpperCase().Equals( 'UL','OL' ) )
  30. {
  31. var oDocument = FCKTools.GetElementDocument( listItem ) ;
  32. var oDogFrag = new FCKDocumentFragment( oDocument ) ;
  33. // All children and successive siblings will be moved to a a DocFrag.
  34. var eNextSiblings = oDogFrag.RootNode ;
  35. var eHasLiSibling = false ;
  36. // If we have nested lists inside it, let's move it to the list of siblings.
  37. var eChildList = FCKDomTools.GetFirstChild( listItem, ['UL','OL'] ) ;
  38. if ( eChildList )
  39. {
  40. eHasLiSibling = true ;
  41. var eChild ;
  42. // The extra () is to avoid a warning with strict error checking. This is ok.
  43. while ( (eChild = eChildList.firstChild) )
  44. eNextSiblings.appendChild( eChildList.removeChild( eChild ) ) ;
  45. FCKDomTools.RemoveNode( eChildList ) ;
  46. }
  47. // Move all successive siblings.
  48. var eSibling ;
  49. var eHasSuccessiveLiSibling = false ;
  50. // The extra () is to avoid a warning with strict error checking. This is ok.
  51. while ( (eSibling = listItem.nextSibling) )
  52. {
  53. if ( !eHasLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase() == 'LI' )
  54. eHasSuccessiveLiSibling = eHasLiSibling = true ;
  55. eNextSiblings.appendChild( eSibling.parentNode.removeChild( eSibling ) ) ;
  56. // If a sibling is a incorrectly nested UL or OL, consider only its children.
  57. if ( !eHasSuccessiveLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase().Equals( 'UL','OL' ) )
  58. FCKDomTools.RemoveNode( eSibling, true ) ;
  59. }
  60. // If we are in a list chain.
  61. var sParentParentTag = eParent.parentNode.tagName.toUpperCase() ;
  62. var bWellNested = ( sParentParentTag == 'LI' ) ;
  63. if ( bWellNested || sParentParentTag.Equals( 'UL','OL' ) )
  64. {
  65. if ( eHasLiSibling )
  66. {
  67. var eChildList = eParent.cloneNode( false ) ;
  68. oDogFrag.AppendTo( eChildList ) ;
  69. listItem.appendChild( eChildList ) ;
  70. }
  71. else if ( bWellNested )
  72. oDogFrag.InsertAfterNode( eParent.parentNode ) ;
  73. else
  74. oDogFrag.InsertAfterNode( eParent ) ;
  75. // Move the LI after its parent.parentNode (the upper LI in the hierarchy).
  76. if ( bWellNested )
  77. FCKDomTools.InsertAfterNode( eParent.parentNode, eParent.removeChild( listItem ) ) ;
  78. else
  79. FCKDomTools.InsertAfterNode( eParent, eParent.removeChild( listItem ) ) ;
  80. }
  81. else
  82. {
  83. if ( eHasLiSibling )
  84. {
  85. var eNextList = eParent.cloneNode( false ) ;
  86. oDogFrag.AppendTo( eNextList ) ;
  87. FCKDomTools.InsertAfterNode( eParent, eNextList ) ;
  88. }
  89. var eBlock = oDocument.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;
  90. FCKDomTools.MoveChildren( eParent.removeChild( listItem ), eBlock ) ;
  91. FCKDomTools.InsertAfterNode( eParent, eBlock ) ;
  92. if ( FCKConfig.EnterMode == 'br' )
  93. {
  94. // We need the bogus to make it work properly. In Gecko, we
  95. // need it before the new block, on IE, after it.
  96. if ( FCKBrowserInfo.IsGecko )
  97. eBlock.parentNode.insertBefore( FCKTools.CreateBogusBR( oDocument ), eBlock ) ;
  98. else
  99. FCKDomTools.InsertAfterNode( eBlock, FCKTools.CreateBogusBR( oDocument ) ) ;
  100. FCKDomTools.RemoveNode( eBlock, true ) ;
  101. }
  102. }
  103. if ( this.CheckEmptyList( eParent ) )
  104. FCKDomTools.RemoveNode( eParent, true ) ;
  105. }
  106. },
  107. CheckEmptyList : function( listElement )
  108. {
  109. return ( FCKDomTools.GetFirstChild( listElement, 'LI' ) == null ) ;
  110. },
  111. // Check if the list has contents (excluding nested lists).
  112. CheckListHasContents : function( listElement )
  113. {
  114. var eChildNode = listElement.firstChild ;
  115. while ( eChildNode )
  116. {
  117. switch ( eChildNode.nodeType )
  118. {
  119. case 1 :
  120. if ( !eChildNode.nodeName.IEquals( 'UL','LI' ) )
  121. return true ;
  122. break ;
  123. case 3 :
  124. if ( eChildNode.nodeValue.Trim().length > 0 )
  125. return true ;
  126. }
  127. eChildNode = eChildNode.nextSibling ;
  128. }
  129. return false ;
  130. }
  131. } ;