fckplugin.js
上传用户:saigedz
上传日期:2019-10-14
资源大小:997k
文件大小:5k
源码类别:

中间件编程

开发平台:

HTML/CSS

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2008 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.  * Plugin to insert "Placeholders" in the editor.
  22.  */
  23. // Register the related command.
  24. FCKCommands.RegisterCommand( 'Placeholder', new FCKDialogCommand( 'Placeholder', FCKLang.PlaceholderDlgTitle, FCKPlugins.Items['placeholder'].Path + 'fck_placeholder.html', 340, 160 ) ) ;
  25. // Create the "Plaholder" toolbar button.
  26. var oPlaceholderItem = new FCKToolbarButton( 'Placeholder', FCKLang.PlaceholderBtn ) ;
  27. oPlaceholderItem.IconPath = FCKPlugins.Items['placeholder'].Path + 'placeholder.gif' ;
  28. FCKToolbarItems.RegisterItem( 'Placeholder', oPlaceholderItem ) ;
  29. // The object used for all Placeholder operations.
  30. var FCKPlaceholders = new Object() ;
  31. // Add a new placeholder at the actual selection.
  32. FCKPlaceholders.Add = function( name )
  33. {
  34. var oSpan = FCK.InsertElement( 'span' ) ;
  35. this.SetupSpan( oSpan, name ) ;
  36. }
  37. FCKPlaceholders.SetupSpan = function( span, name )
  38. {
  39. span.innerHTML = '[[ ' + name + ' ]]' ;
  40. span.style.backgroundColor = '#ffff00' ;
  41. span.style.color = '#000000' ;
  42. if ( FCKBrowserInfo.IsGecko )
  43. span.style.cursor = 'default' ;
  44. span._fckplaceholder = name ;
  45. span.contentEditable = false ;
  46. // To avoid it to be resized.
  47. span.onresizestart = function()
  48. {
  49. FCK.EditorWindow.event.returnValue = false ;
  50. return false ;
  51. }
  52. }
  53. // On Gecko we must do this trick so the user select all the SPAN when clicking on it.
  54. FCKPlaceholders._SetupClickListener = function()
  55. {
  56. FCKPlaceholders._ClickListener = function( e )
  57. {
  58. if ( e.target.tagName == 'SPAN' && e.target._fckplaceholder )
  59. FCKSelection.SelectNode( e.target ) ;
  60. }
  61. FCK.EditorDocument.addEventListener( 'click', FCKPlaceholders._ClickListener, true ) ;
  62. }
  63. // Open the Placeholder dialog on double click.
  64. FCKPlaceholders.OnDoubleClick = function( span )
  65. {
  66. if ( span.tagName == 'SPAN' && span._fckplaceholder )
  67. FCKCommands.GetCommand( 'Placeholder' ).Execute() ;
  68. }
  69. FCK.RegisterDoubleClickHandler( FCKPlaceholders.OnDoubleClick, 'SPAN' ) ;
  70. // Check if a Placholder name is already in use.
  71. FCKPlaceholders.Exist = function( name )
  72. {
  73. var aSpans = FCK.EditorDocument.getElementsByTagName( 'SPAN' ) ;
  74. for ( var i = 0 ; i < aSpans.length ; i++ )
  75. {
  76. if ( aSpans[i]._fckplaceholder == name )
  77. return true ;
  78. }
  79. return false ;
  80. }
  81. if ( FCKBrowserInfo.IsIE )
  82. {
  83. FCKPlaceholders.Redraw = function()
  84. {
  85. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  86. return ;
  87. var aPlaholders = FCK.EditorDocument.body.innerText.match( /[[[^[]]+]]/g ) ;
  88. if ( !aPlaholders )
  89. return ;
  90. var oRange = FCK.EditorDocument.body.createTextRange() ;
  91. for ( var i = 0 ; i < aPlaholders.length ; i++ )
  92. {
  93. if ( oRange.findText( aPlaholders[i] ) )
  94. {
  95. var sName = aPlaholders[i].match( /[[s*([^]]*?)s*]]/ )[1] ;
  96. oRange.pasteHTML( '<span style="color: #000000; background-color: #ffff00" contenteditable="false" _fckplaceholder="' + sName + '">' + aPlaholders[i] + '</span>' ) ;
  97. }
  98. }
  99. }
  100. }
  101. else
  102. {
  103. FCKPlaceholders.Redraw = function()
  104. {
  105. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  106. return ;
  107. var oInteractor = FCK.EditorDocument.createTreeWalker( FCK.EditorDocument.body, NodeFilter.SHOW_TEXT, FCKPlaceholders._AcceptNode, true ) ;
  108. var aNodes = new Array() ;
  109. while ( ( oNode = oInteractor.nextNode() ) )
  110. {
  111. aNodes[ aNodes.length ] = oNode ;
  112. }
  113. for ( var n = 0 ; n < aNodes.length ; n++ )
  114. {
  115. var aPieces = aNodes[n].nodeValue.split( /([[[^[]]+]])/g ) ;
  116. for ( var i = 0 ; i < aPieces.length ; i++ )
  117. {
  118. if ( aPieces[i].length > 0 )
  119. {
  120. if ( aPieces[i].indexOf( '[[' ) == 0 )
  121. {
  122. var sName = aPieces[i].match( /[[s*([^]]*?)s*]]/ )[1] ;
  123. var oSpan = FCK.EditorDocument.createElement( 'span' ) ;
  124. FCKPlaceholders.SetupSpan( oSpan, sName ) ;
  125. aNodes[n].parentNode.insertBefore( oSpan, aNodes[n] ) ;
  126. }
  127. else
  128. aNodes[n].parentNode.insertBefore( FCK.EditorDocument.createTextNode( aPieces[i] ) , aNodes[n] ) ;
  129. }
  130. }
  131. aNodes[n].parentNode.removeChild( aNodes[n] ) ;
  132. }
  133. FCKPlaceholders._SetupClickListener() ;
  134. }
  135. FCKPlaceholders._AcceptNode = function( node )
  136. {
  137. if ( /[[[^[]]+]]/.test( node.nodeValue ) )
  138. return NodeFilter.FILTER_ACCEPT ;
  139. else
  140. return NodeFilter.FILTER_SKIP ;
  141. }
  142. }
  143. FCK.Events.AttachEvent( 'OnAfterSetHTML', FCKPlaceholders.Redraw ) ;
  144. // We must process the SPAN tags to replace then with the real resulting value of the placeholder.
  145. FCKXHtml.TagProcessors['span'] = function( node, htmlNode )
  146. {
  147. if ( htmlNode._fckplaceholder )
  148. node = FCKXHtml.XML.createTextNode( '[[' + htmlNode._fckplaceholder + ']]' ) ;
  149. else
  150. FCKXHtml._AppendChildNodes( node, htmlNode, false ) ;
  151. return node ;
  152. }