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

中间件编程

开发平台:

HTML/CSS

  1. /*
  2.  * Media Plugin for FCKeditor 2.5 SVN
  3.  * Copyright (C) 2007 Riceball LEE (riceballl@hotmail.com)
  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 "Media" in the editor.
  22.  */
  23. // Register the related command.
  24. FCKCommands.RegisterCommand( 'Media', new FCKDialogCommand( 'Media', FCKLang.DlgMediaTitle, FCKPlugins.Items['Media'].Path + 'fck_media.html', 450, 428 ) ) ;
  25. // Create the "Media" toolbar button.
  26. var oMediaItem = new FCKToolbarButton( 'Media', FCKLang.MediaBtn,  FCKLang.MediaBtnTooltip) ;
  27. oMediaItem.IconPath = FCKPlugins.Items['Media'].Path + 'images/media.png' ;
  28. FCKToolbarItems.RegisterItem( 'Media', oMediaItem ) ;
  29. //--------------------------------------------------
  30. function _Import(aSrc) {
  31.    //document.write('<scr'+'ipt type="text/javascript" src="' + aSrc + '"></sc' + 'ript>');
  32.   var vElement = document.createElement("script");
  33.   vElement.type= "text/javascript";
  34.   vElement.src= aSrc;
  35.   var head=document.getElementsByTagName("head")[0];
  36.   head.appendChild(vElement);
  37. };
  38. function _ImportCSS(aSrc) {
  39.   var vElement = document.createElement("link");
  40.   vElement.rel   = "stylesheet";
  41.   vElement.type  = "text/css";
  42.   vElement.href  = aSrc;
  43.   //vElement.title= 'ddd';
  44.   //vElement.disabled=false;
  45.   var head=document.getElementsByTagName("head")[0];
  46.   head.appendChild(vElement);
  47. };
  48. _Import(FCKConfig.PluginsPath + 'media/js/fck_media_inc.js');
  49. var FCKMediaProcessor = FCKDocumentProcessor.AppendNew() ;
  50. //hack to add the media css to FCKEditingArea.
  51. FCKMediaProcessor.EditingArea_StartBefore = function ( html, secondCall )
  52. {
  53.   var sHeadExtra = '<link href="' + FCKConfig.PluginsPath + 'media/css/fck_media.css" rel="stylesheet" type="text/css" _fcktemp="true" />' ;
  54.   html = html.replace( FCKRegexLib.HeadCloser, sHeadExtra + '$&' ) ;
  55.   return arguments;
  56. }
  57. FCKEditingArea.prototype.Start =  Inject(FCKEditingArea.prototype.Start, FCKMediaProcessor.EditingArea_StartBefore);
  58. //hack and rewrite FCKConfig.ProtectedSource.Protect, for i do not wanna walk through twice.
  59. FCKConfig.ProtectedSource.Protect = function( html )
  60. {
  61.   var codeTag = this._CodeTag ;
  62.   function _Replace( protectedSource )
  63.   {
  64.     //check if it is the media object:
  65.     if (protectedSource.match(/<object[sS]+?</object>/gi) && (protectedSource.indexOf(cMediaTypeAttrName+'=') >=0)) {
  66.       var regexEmbed = new RegExp('<embed\s+(.+?)></embed>', 'i');
  67.       return '<'+cFckMediaElementName + ' '+ protectedSource.match(regexEmbed)[1] + '></'+cFckMediaElementName+'>';
  68.     }
  69.     var index = FCKTempBin.AddElement( protectedSource ) ;
  70.     return '<!--{' + codeTag + index + '}-->' ;
  71.   }
  72.   for ( var i = 0 ; i < this.RegexEntries.length ; i++ )
  73.   {
  74.     html = html.replace( this.RegexEntries[i], _Replace ) ;
  75.   }
  76.   return html ;
  77. }
  78. //hacked FCKConfig.ProtectedSource.Revert
  79. FCKMediaProcessor.ProtectedSource_RevertBefore = function ( html, clearBin )
  80. {
  81.   html = WrapObjectToMedia(html, cFckMediaElementName);
  82.   return arguments;
  83. }
  84. FCKConfig.ProtectedSource.Revert = Inject(FCKConfig.ProtectedSource.Revert, FCKMediaProcessor.ProtectedSource_RevertBefore)
  85. FCKMediaProcessor.ProcessDocument = function( aDocument )
  86. {
  87.   /* convert the source to WSWG design
  88.   Sample code:
  89.   This is some <embed src="/UserFiles/Flash/Yellow_Runners.swf" mediatype="0"></embed><strong>sample text</strong>. You are&nbsp;<a name="fred"></a> using <a href="http://www.fckeditor.net/">FCKeditor</a>.
  90.   */
  91.   var aEmbeds = aDocument.getElementsByTagName( cFckMediaElementName ) ;
  92.   var oEmbed ;
  93.   var i = aEmbeds.length - 1 ;
  94.   while ( i >= 0 && ( oEmbed = aEmbeds[i--] ) )
  95.   {
  96.     if (typeof(oEmbed.attributes[ cMediaTypeAttrName ]) != 'undefined') {
  97.       var vTypeId = oEmbed.attributes[ cMediaTypeAttrName ].value ;
  98.   
  99.       if (isInt(vTypeId))
  100.       {
  101.         var oCloned = oEmbed.cloneNode( true ) ;
  102.   
  103.         var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__Media_'+vTypeId, oCloned ) ;
  104.         oImg.setAttribute( '_fckmedia', 'true', 0 ) ;
  105.   
  106.         FCKMediaProcessor.RefreshView( oImg, oEmbed ) ;
  107.   
  108.         oEmbed.parentNode.replaceChild(oImg, oEmbed);
  109.       }
  110.     }
  111.   }
  112. }
  113. FCKMediaProcessor.RefreshView = function( placeHolderImage, originalEmbed )
  114. {
  115.   if ( originalEmbed.getAttribute( 'width' ) > 0 )
  116.     placeHolderImage.style.width = FCKTools.ConvertHtmlSizeToStyle( originalEmbed.getAttribute( 'width' ) ) ;
  117.   if ( originalEmbed.getAttribute( 'height' ) > 0 )
  118.     placeHolderImage.style.height = FCKTools.ConvertHtmlSizeToStyle( originalEmbed.getAttribute( 'height' ) ) ;
  119. }
  120. // Open the Media Properties dialog on double click.
  121. FCKMediaProcessor.OnDoubleClick = function( e )
  122. {
  123.   if ( e.tagName == 'IMG' && e.getAttribute('_fckmedia') == 'true' )
  124.     FCKCommands.GetCommand( 'Media' ).Execute() ;
  125. }
  126. FCK.RegisterDoubleClickHandler( FCKMediaProcessor.OnDoubleClick, 'IMG' ) ;
  127. FCK.ContextMenu.RegisterListener( {
  128.         AddItems : function( menu, tag, tagName )
  129.         {
  130.                 // under what circumstances do we display this option
  131.                 if ( tagName == 'IMG' && tag.getAttribute( '_fckmedia' ) )
  132.                 {
  133.                         // when the option is displayed, show a separator  the command
  134.                         menu.AddSeparator() ;
  135.                         // the command needs the registered command name, the title for the context menu, and the icon path
  136.                         menu.AddItem( 'Media', FCKLang.DlgMediaTitle, oMediaItem.IconPath ) ;
  137.                 }
  138.         }}
  139. );
  140. FCKMediaProcessor.GetRealElementAfter = function( fakeElement, Result ) 
  141. {
  142.   if ( fakeElement.getAttribute('_fckmedia') )
  143.   {
  144.     if ( fakeElement.style.width.length > 0 )
  145.         Result.width = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.width ) ;
  146.     if ( fakeElement.style.height.length > 0 )
  147.         Result.height = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.height ) ;
  148.   }
  149.   return Result ;
  150. }
  151. FCK.GetRealElement = Inject(FCK.GetRealElement, undefined, FCKMediaProcessor.GetRealElementAfter)
  152. /*
  153.   @desc  inject the function
  154.   @param aOrgFunc     the original function to be injected.
  155.   @param aBeforeExec  this is called before the execution of the aOrgFunc.
  156.                       you must return the arguments if you wanna modify the value of the aOrgFunc's arguments .
  157.   @param aAtferExec   this is called after the execution of the aOrgFunc.
  158.                       you must add a result argument at the last argument of the aAtferExec function if you wanna 
  159.                       get the result value of the aOrgFunc.
  160.                       you must return the result if you wanna modify the result value of the aOrgFunc .
  161.   @Usage  Obj.prototype.aMethod = Inject(Obj.prototype.aMethod, aFunctionBeforeExec[, aFunctionAtferExec]);
  162.   @author  Aimingoo&Riceball
  163.   eg:
  164.   var doTest = function (a) {return a};
  165.   function beforeTest(a) { alert('before exec: a='+a); a += 3; return arguments;};
  166.   function afterTest(a, result) { alert('after exec: a='+a+'; result='+result); return result+5;};
  167.   
  168.   doTest = Inject(doTest, beforeTest, afterTest);
  169.   
  170.   alert (doTest(2));
  171.   the result should be 10.
  172. */
  173. function Inject( aOrgFunc, aBeforeExec, aAtferExec ) {
  174.   return function() {
  175.     if (typeof(aBeforeExec) == 'function') arguments = aBeforeExec.apply(this, arguments) || arguments;
  176.     //convert arguments object to array
  177.     var Result, args = [].slice.call(arguments); 
  178.     args.push(aOrgFunc.apply(this, args));
  179.     if (typeof(aAtferExec) == 'function') Result = aAtferExec.apply(this, args);
  180.     return (typeof(Result) != 'undefined')?Result:args.pop();
  181.   }
  182. }