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

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.  * Advanced document processors.
  22.  */
  23. var FCKDocumentProcessor = new Object() ;
  24. FCKDocumentProcessor._Items = new Array() ;
  25. FCKDocumentProcessor.AppendNew = function()
  26. {
  27. var oNewItem = new Object() ;
  28. this._Items.push( oNewItem ) ;
  29. return oNewItem ;
  30. }
  31. FCKDocumentProcessor.Process = function( document )
  32. {
  33. var bIsDirty = FCK.IsDirty() ;
  34. var oProcessor, i = 0 ;
  35. while( ( oProcessor = this._Items[i++] ) )
  36. oProcessor.ProcessDocument( document ) ;
  37. if ( !bIsDirty )
  38. FCK.ResetIsDirty() ;
  39. }
  40. var FCKDocumentProcessor_CreateFakeImage = function( fakeClass, realElement )
  41. {
  42. var oImg = FCKTools.GetElementDocument( realElement ).createElement( 'IMG' ) ;
  43. oImg.className = fakeClass ;
  44. oImg.src = FCKConfig.BasePath + 'images/spacer.gif' ;
  45. oImg.setAttribute( '_fckfakelement', 'true', 0 ) ;
  46. oImg.setAttribute( '_fckrealelement', FCKTempBin.AddElement( realElement ), 0 ) ;
  47. return oImg ;
  48. }
  49. // Link Anchors
  50. if ( FCKBrowserInfo.IsIE || FCKBrowserInfo.IsOpera )
  51. {
  52. var FCKAnchorsProcessor = FCKDocumentProcessor.AppendNew() ;
  53. FCKAnchorsProcessor.ProcessDocument = function( document )
  54. {
  55. var aLinks = document.getElementsByTagName( 'A' ) ;
  56. var oLink ;
  57. var i = aLinks.length - 1 ;
  58. while ( i >= 0 && ( oLink = aLinks[i--] ) )
  59. {
  60. // If it is anchor. Doesn't matter if it's also a link (even better: we show that it's both a link and an anchor)
  61. if ( oLink.name.length > 0 )
  62. {
  63. //if the anchor has some content then we just add a temporary class
  64. if ( oLink.innerHTML !== '' )
  65. {
  66. if ( FCKBrowserInfo.IsIE )
  67. oLink.className += ' FCK__AnchorC' ;
  68. }
  69. else
  70. {
  71. var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__Anchor', oLink.cloneNode(true) ) ;
  72. oImg.setAttribute( '_fckanchor', 'true', 0 ) ;
  73. oLink.parentNode.insertBefore( oImg, oLink ) ;
  74. oLink.parentNode.removeChild( oLink ) ;
  75. }
  76. }
  77. }
  78. }
  79. }
  80. // Page Breaks
  81. var FCKPageBreaksProcessor = FCKDocumentProcessor.AppendNew() ;
  82. FCKPageBreaksProcessor.ProcessDocument = function( document )
  83. {
  84. var aDIVs = document.getElementsByTagName( 'DIV' ) ;
  85. var eDIV ;
  86. var i = aDIVs.length - 1 ;
  87. while ( i >= 0 && ( eDIV = aDIVs[i--] ) )
  88. {
  89. if ( eDIV.style.pageBreakAfter == 'always' && eDIV.childNodes.length == 1 && eDIV.childNodes[0].style && eDIV.childNodes[0].style.display == 'none' )
  90. {
  91. var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', eDIV.cloneNode(true) ) ;
  92. eDIV.parentNode.insertBefore( oFakeImage, eDIV ) ;
  93. eDIV.parentNode.removeChild( eDIV ) ;
  94. }
  95. }
  96. /*
  97. var aCenters = document.getElementsByTagName( 'CENTER' ) ;
  98. var oCenter ;
  99. var i = aCenters.length - 1 ;
  100. while ( i >= 0 && ( oCenter = aCenters[i--] ) )
  101. {
  102. if ( oCenter.style.pageBreakAfter == 'always' && oCenter.innerHTML.Trim().length == 0 )
  103. {
  104. var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', oCenter.cloneNode(true) ) ;
  105. oCenter.parentNode.insertBefore( oFakeImage, oCenter ) ;
  106. oCenter.parentNode.removeChild( oCenter ) ;
  107. }
  108. }
  109. */
  110. }
  111. // EMBED and OBJECT tags.
  112. var FCKEmbedAndObjectProcessor = (function()
  113. {
  114. var customProcessors = [] ;
  115. var processElement = function( el )
  116. {
  117. var clone = el.cloneNode( true ) ;
  118. var replaceElement ;
  119. var fakeImg = replaceElement = FCKDocumentProcessor_CreateFakeImage( 'FCK__UnknownObject', clone ) ;
  120. FCKEmbedAndObjectProcessor.RefreshView( fakeImg, el ) ;
  121. for ( var i = 0 ; i < customProcessors.length ; i++ )
  122. replaceElement = customProcessors[i]( el, replaceElement ) || replaceElement ;
  123. if ( replaceElement != fakeImg )
  124. FCKTempBin.RemoveElement( fakeImg.getAttribute( '_fckrealelement' ) ) ;
  125. el.parentNode.replaceChild( replaceElement, el ) ;
  126. }
  127. var processElementsByName = function( elementName, doc )
  128. {
  129. var aObjects = doc.getElementsByTagName( elementName );
  130. for ( var i = aObjects.length - 1 ; i >= 0 ; i-- )
  131. processElement( aObjects[i] ) ;
  132. }
  133. var processObjectAndEmbed = function( doc )
  134. {
  135. processElementsByName( 'object', doc );
  136. processElementsByName( 'embed', doc );
  137. }
  138. return FCKTools.Merge( FCKDocumentProcessor.AppendNew(),
  139.        {
  140. ProcessDocument : function( doc )
  141. {
  142. // Firefox 3 would sometimes throw an unknown exception while accessing EMBEDs and OBJECTs
  143. // without the setTimeout().
  144. if ( FCKBrowserInfo.IsGecko )
  145. FCKTools.RunFunction( processObjectAndEmbed, this, [ doc ] ) ;
  146. else
  147. processObjectAndEmbed( doc ) ;
  148. },
  149. RefreshView : function( placeHolder, original )
  150. {
  151. if ( original.getAttribute( 'width' ) > 0 )
  152. placeHolder.style.width = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'width' ) ) ;
  153. if ( original.getAttribute( 'height' ) > 0 )
  154. placeHolder.style.height = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'height' ) ) ;
  155. },
  156. AddCustomHandler : function( func )
  157. {
  158. customProcessors.push( func ) ;
  159. }
  160. } ) ;
  161. } )() ;
  162. FCK.GetRealElement = function( fakeElement )
  163. {
  164. var e = FCKTempBin.Elements[ fakeElement.getAttribute('_fckrealelement') ] ;
  165. if ( fakeElement.getAttribute('_fckflash') )
  166. {
  167. if ( fakeElement.style.width.length > 0 )
  168. e.width = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.width ) ;
  169. if ( fakeElement.style.height.length > 0 )
  170. e.height = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.height ) ;
  171. }
  172. return e ;
  173. }
  174. // HR Processor.
  175. // This is a IE only (tricky) thing. We protect all HR tags before loading them
  176. // (see FCK.ProtectTags). Here we put the HRs back.
  177. if ( FCKBrowserInfo.IsIE )
  178. {
  179. FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )
  180. {
  181. var aHRs = document.getElementsByTagName( 'HR' ) ;
  182. var eHR ;
  183. var i = aHRs.length - 1 ;
  184. while ( i >= 0 && ( eHR = aHRs[i--] ) )
  185. {
  186. // Create the replacement HR.
  187. var newHR = document.createElement( 'hr' ) ;
  188. newHR.mergeAttributes( eHR, true ) ;
  189. // We must insert the new one after it. insertBefore will not work in all cases.
  190. FCKDomTools.InsertAfterNode( eHR, newHR ) ;
  191. eHR.parentNode.removeChild( eHR ) ;
  192. }
  193. }
  194. }
  195. // INPUT:hidden Processor.
  196. FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )
  197. {
  198. var aInputs = document.getElementsByTagName( 'INPUT' ) ;
  199. var oInput ;
  200. var i = aInputs.length - 1 ;
  201. while ( i >= 0 && ( oInput = aInputs[i--] ) )
  202. {
  203. if ( oInput.type == 'hidden' )
  204. {
  205. var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__InputHidden', oInput.cloneNode(true) ) ;
  206. oImg.setAttribute( '_fckinputhidden', 'true', 0 ) ;
  207. oInput.parentNode.insertBefore( oImg, oInput ) ;
  208. oInput.parentNode.removeChild( oInput ) ;
  209. }
  210. }
  211. }
  212. // Flash handler.
  213. FCKEmbedAndObjectProcessor.AddCustomHandler( function( el, fakeImg )
  214. {
  215. if ( ! ( el.nodeName.IEquals( 'embed' ) && ( el.type == 'application/x-shockwave-flash' || /.swf($|#|?)/i.test( el.src ) ) ) )
  216. return ;
  217. fakeImg.className = 'FCK__Flash' ;
  218. fakeImg.setAttribute( '_fckflash', 'true', 0 );
  219. } ) ;
  220. // Buggy <span class="Apple-style-span"> tags added by Safari.
  221. if ( FCKBrowserInfo.IsSafari )
  222. {
  223. FCKDocumentProcessor.AppendNew().ProcessDocument = function( doc )
  224. {
  225. var spans = doc.getElementsByClassName ?
  226. doc.getElementsByClassName( 'Apple-style-span' ) :
  227. Array.prototype.filter.call(
  228. doc.getElementsByTagName( 'span' ),
  229. function( item ){ return item.className == 'Apple-style-span' ; }
  230. ) ;
  231. for ( var i = spans.length - 1 ; i >= 0 ; i-- )
  232. FCKDomTools.RemoveNode( spans[i], true ) ;
  233. }
  234. }