[pLog-svn] r7092 - plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource

mark at devel.lifetype.net mark at devel.lifetype.net
Mon Dec 20 12:29:08 EST 2010


Author: mark
Date: 2010-12-20 12:29:08 -0500 (Mon, 20 Dec 2010)
New Revision: 7092

Modified:
   plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin.js
   plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin_src.js
Log:
Refactoring the insert resource plugin based on DOMUtils from Tinymce(from sizzler), and also fixed some bugs. (PS. the media plugin will hijack the embed code from insert resource plugin, therefore the _edit2html does not do anything if media plugin enabled.)

Modified: plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin.js
===================================================================
--- plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin.js	2010-12-19 17:43:03 UTC (rev 7091)
+++ plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin.js	2010-12-20 17:29:08 UTC (rev 7092)
@@ -1,22 +1,4 @@
 
-(function(){tinymce.PluginManager.requireLangPack('insertresource');tinymce.create('tinymce.plugins.InsertResourcePlugin',{init:function(ed,url){var t=this;ed.onBeforeSetContent.add(function(ed,o){o.content=t.edit2html(t,o.content);});ed.onPostProcess.add(function(ed,o){if(o.set){o.content=t.edit2html(t,o.content);}
-if(o.get){o.content=t.html2edit(t,o.content);}});ed.addCommand('mceInsertResource',function(){ed.windowManager.open({file:url+'../../../../../admin.php?op=resourceList&mode=1',width:500+parseInt(ed.getLang('InsertResource.delta_width',0)),height:450+parseInt(ed.getLang('InsertResource.delta_height',0)),inline:1},{plugin_url:url,});});ed.addButton('insertresource',{title:'insertresource.desc',cmd:'mceInsertResource',image:url+'/img/insertresource.gif'});ed.onInit.add(function(){if(ed.settings.content_css!==false)
-ed.dom.loadCSS(url+"/css/content.css");});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('insertresource',n.nodeName=='IMG');});},getInfo:function(){return{longname:'InsertResource plugin',author:'LifeType',authorurl:'http://lifetype.net',infourl:'',version:"2.0"};},edit2html:function(t,content){var startPos=0;var embedList=new Array();content=content.replace(new RegExp('<[ ]*object','gi'),'<object');content=content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');var index=0;while((startPos=content.indexOf('<object',startPos))!=-1){endPos=content.indexOf('</object>',startPos);endPos+=9;objectTag=content.substring(startPos,endPos);attribs=t._parseAttributes(objectTag);var cssClass="";if(!attribs||attribs["value"]==undefined||attribs["class"]!="ltPlayer"){startPos++;continue;}
-var regexp=/.*file=([a-zA-Z0-9\-\/:._%]*)/i;result=regexp.exec(attribs["value"]);var fileUrl="";if(result){fileUrl=result[1];}
-if(attribs["height"]==undefined)
-attribs["height"]=20;if(attribs["width"]==undefined)
-attribs["width"]=320;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+fileUrl+'"';content+=' alt="'+fileUrl+'" class="ltFlashPlayer" />'+content.substring(endPos);content+=contentAfter;index++;startPos++;}
-return content;},html2edit:function(t,content){var startPos=-1;while((startPos=content.indexOf('<img',startPos+1))!=-1){var endPos=content.indexOf('/>',startPos);var attribs=t._parseAttributes(content.substring(startPos+4,endPos));if(!attribs||attribs['class']!="ltFlashPlayer")
-continue;endPos+=2;var embedHTML='';if(attribs["height"]==undefined)
-attribs["height"]=20;if(attribs["width"]==undefined)
-attribs["width"]=320;embedHTML=getFlashPlayerHTML(attribs["alt"],attribs["height"],attribs["width"]);chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter;}
-return content;},_parseAttributes:function(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)
-return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"')&&!withInValue)
-withInValue=true;else if((chr=='"')&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)
-attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue="";}
-else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)
-withInName=true;if(chr=='='&&withInName)
-withInName=false;if(withInName)
-attributeName+=chr;if(withInValue)
-attributeValue+=chr;}
-return attributes;}});tinymce.PluginManager.add('insertresource',tinymce.plugins.InsertResourcePlugin);})();
\ No newline at end of file
+(function(){tinymce.PluginManager.requireLangPack('insertresource');tinymce.create('tinymce.plugins.InsertResourcePlugin',{init:function(ed,url){var t=this;t.ed=ed;t.url=url;ed.onBeforeSetContent.add(function(ed,o){o.content=t._edit2html(t,o.content);});ed.onPostProcess.add(function(ed,o){if(o.set){o.content=t._edit2html(t,o.content);}
+if(o.get){o.content=t._html2edit(t,o.content);}});ed.addCommand('mceInsertResource',function(){ed.windowManager.open({file:url+'../../../../../admin.php?op=resourceList&mode=1',width:500+parseInt(ed.getLang('InsertResource.delta_width',0)),height:450+parseInt(ed.getLang('InsertResource.delta_height',0)),inline:1},{plugin_url:url,});});ed.addButton('insertresource',{title:'insertresource.desc',cmd:'mceInsertResource',image:url+'/img/insertresource.gif'});ed.onInit.add(function(){if(ed.settings.content_css!==false)
+ed.dom.loadCSS(url+"/css/content.css");});},getInfo:function(){return{longname:'Insert Resource',author:'LifeType Team',authorurl:'http://www.lifetype.net',infourl:'http://www.lifetype.net',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_edit2html:function(t,content){cdom=t.ed.dom.create('div');t.ed.dom.setHTML(cdom,content);elems=t.ed.dom.select('object[class=ltPlayer]',cdom);tinymce.each(elems,function(e){html=e.innerHTML;result=html.match(/.*file=([a-zA-Z0-9\-\/:._%]*)/i);src=(result?result[1]:0);if(src){height=(e.height?e.height:20);width=(e.width?e.width:320);imgHTML=t._createImg(src,height,width);t.ed.dom.setOuterHTML(e,imgHTML);}});content=cdom.innerHTML;t.ed.dom.remove(cdom);return content;},_html2edit:function(t,content){cdom=t.ed.dom.create('div');t.ed.dom.setHTML(cdom,content);elems=t.ed.dom.select('img[class=ltFlashPlayer]',cdom);tinymce.each(elems,function(e){if(e.alt){height=(e.height?e.height:20);width=(e.width?e.width:320);src=e.alt;embedHTML=getFla
 shPlayerHTML(src,height,width);t.ed.dom.setOuterHTML(e,embedHTML);}});content=cdom.innerHTML;t.ed.dom.remove(cdom);return content;},_createImg:function(src,height,width){imgHTML='<img width="'+width+'" height="'+height+'"';imgHTML+=' src="'+this.url+'/img/spacer.gif'+'" title="'+src+'"';imgHTML+=' alt="'+src+'" class="ltFlashPlayer" />';return imgHTML;}});tinymce.PluginManager.add('insertresource',tinymce.plugins.InsertResourcePlugin);})();
\ No newline at end of file

Modified: plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin_src.js
===================================================================
--- plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin_src.js	2010-12-19 17:43:03 UTC (rev 7091)
+++ plog/branches/lifetype-1.2/js/tinymce/plugins/insertresource/editor_plugin_src.js	2010-12-20 17:29:08 UTC (rev 7092)
@@ -1,219 +1,125 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2010, Lifetype Team, http://www.lifetype.net
+ * Released under GPLv2 License.
+ */
+
 (function() {
-	// Load plugin specific language pack
-	tinymce.PluginManager.requireLangPack('insertresource');
+    tinymce.PluginManager.requireLangPack('insertresource');
+    tinymce.create('tinymce.plugins.InsertResourcePlugin', {
+        init : function(ed, url) {
+            var t = this;
+                t.ed = ed;
+                t.url = url;
 
-	tinymce.create('tinymce.plugins.InsertResourcePlugin', {
-		/**
-		 * Initializes the plugin, this will be executed after the plugin has been created.
-		 * This call is done before the editor instance has finished it's initialization so use the onInit event
-		 * of the editor instance to intercept that event.
-		 *
-		 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
-		 * @param {string} url Absolute URL to where the plugin is located.
-		 */
-		init : function(ed, url) {
-            var t=this;
-
             ed.onBeforeSetContent.add(function(ed, o) {
-               o.content = t.edit2html(t, o.content);
+                o.content = t._edit2html(t, o.content);
             });
 
             ed.onPostProcess.add(function(ed, o) {
-               if (o.set){
-                   o.content = t.edit2html(t, o.content);
-               }
-               if (o.get){
-                   o.content = t.html2edit(t, o.content);
-               }
+                if (o.set){
+                    o.content = t._edit2html(t, o.content);
+                }
+                if (o.get){
+                    o.content = t._html2edit(t, o.content);
+                }
             });
 
-			ed.addCommand('mceInsertResource', function() {
-				ed.windowManager.open({
-                      file : url + '../../../../../admin.php?op=resourceList&mode=1', // Relative to theme
-                      width : 500 + parseInt(ed.getLang('InsertResource.delta_width', 0)),
-					  height : 450 + parseInt(ed.getLang('InsertResource.delta_height', 0)),
-					  inline : 1
-				}, {
-					plugin_url : url, // Plugin absolute URL
-				});
-			});
+            ed.addCommand('mceInsertResource', function() {
+                ed.windowManager.open({
+                    file : url + '../../../../../admin.php?op=resourceList&mode=1', // Relative to theme
+                    width : 500 + parseInt(ed.getLang('InsertResource.delta_width', 0)),
+                    height : 450 + parseInt(ed.getLang('InsertResource.delta_height', 0)),
+                    inline : 1
+                }, {
+                    plugin_url : url, // Plugin absolute URL
+                });
+            });
 
-			// Register insertresource button
-			ed.addButton('insertresource', {
-				title : 'insertresource.desc',
-				cmd : 'mceInsertResource',
-				image : url + '/img/insertresource.gif'
-			});
+            // Register insertresource button
+            ed.addButton('insertresource', {
+                title : 'insertresource.desc',
+                cmd : 'mceInsertResource',
+                image : url + '/img/insertresource.gif'
+            });
 
             ed.onInit.add(function() {
-                    if (ed.settings.content_css !== false)
-                        ed.dom.loadCSS(url + "/css/content.css");
+                if (ed.settings.content_css !== false)
+                    ed.dom.loadCSS(url + "/css/content.css");
             });
+        },
 
-			// Add a node change handler, selects the button in the UI when a image is selected
-			ed.onNodeChange.add(function(ed, cm, n) {
-				cm.setActive('insertresource', n.nodeName == 'IMG');
-			});
-            },
-
-		/**
-		 * Returns information about the plugin as a name/value array.
-		 * The current keys are longname, author, authorurl, infourl and version.
-		 *
-		 * @return {Object} Name/value array containing information about the plugin.
-		 */
-		getInfo : function() {
-			return {
-				longname : 'InsertResource plugin',
-				author : 'LifeType',
-				authorurl : 'http://lifetype.net',
-				infourl : '',
-				version : "2.0"
-			};
+        /**
+         * Returns information about the plugin as a name/value array.
+         * The current keys are longname, author, authorurl, infourl and version.
+         *
+         * @return {Object} Name/value array containing information about the plugin.
+         */
+        getInfo : function() {
+            return {
+                longname : 'Insert Resource',
+                author : 'LifeType Team',
+                authorurl : 'http://www.lifetype.net',
+                infourl : 'http://www.lifetype.net',
+                version : tinymce.majorVersion + "." + tinymce.minorVersion
+            };
         },
 
-        edit2html : function(t,content){
-           var startPos = 0;
-           var embedList = new Array();			
-           
-               // Fix the embed and object elements
-           content = content.replace(new RegExp('<[ ]*object','gi'),'<object');
-           content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');			
-           
-               // Parse all object tags and replace them with images from the embed data
-           var index = 0;
-           while ((startPos = content.indexOf('<object', startPos)) != -1) {
-               
-                   // Find end of object
-               endPos = content.indexOf('</object>', startPos);
-               endPos += 9;
-               
-               objectTag = content.substring(startPos,endPos);
-               
-                   /**
-                    * NOTE: this method call relies in a bug of the _parseAttributes method.
-                    * This method parses a tag and returns a list of its attributes. It works fine
-                    * when presented with a single tag but now that we're passing a whole <object>...</object>
-                    * block, it will also parse any other tags in the block. This means that it will return the
-                    * value we're looking for as long as "FlashVars" is passed as the last parameter
-                    * in the <object> block.
-                    */
-               attribs = t._parseAttributes( objectTag );
-               
-               var cssClass = "";					
-               if( !attribs || attribs["value"] == undefined || attribs["class"] != "ltPlayer" ) {
-                   startPos++;
-                   continue;
-               }
-               
-                   // find the value in "file=XXX"
-               var regexp = /.*file=([a-zA-Z0-9\-\/:._%]*)/i;
-               result = regexp.exec( attribs["value"] );
-               var fileUrl = "";
-               if( result ) {
-                   fileUrl = result[1];
-               }			
-               
-                   // default values for height and width in case they were not defined (for some reason)
-               if( attribs["height"] == undefined )
-                   attribs["height"] = 20;
-               if( attribs["width"] == undefined )
-                   attribs["width"] = 320;
+        _edit2html : function(t,content){
+            // Parse all object[class=ltPlayer] tags and replace them with img
+            cdom = t.ed.dom.create('div');
+            t.ed.dom.setHTML(cdom, content);
+            elems = t.ed.dom.select('object[class=ltPlayer]', cdom);
 
-                   // Insert image						
-               var contentAfter = content.substring(endPos);
-               content = content.substring(0, startPos);
-               content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';
-               content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + fileUrl + '"';
-               content += ' alt="' + fileUrl + '" class="ltFlashPlayer" />' + content.substring(endPos);
-               content += contentAfter;
-               
-               index++;
-               
-               startPos++;
-           }
-           return content;
-        },
+            tinymce.each(elems, function(e) {
+                html = e.innerHTML;
+                result = html.match(/.*file=([a-zA-Z0-9\-\/:._%]*)/i);
+                src = (result ? result[1] : 0);
+                if (src) {
+                    height = (e.height? e.height : 20);
+                    width = (e.width ? e.width : 320);
+                    imgHTML = t._createImg(src, height, width);
+                    t.ed.dom.setOuterHTML(e, imgHTML);
+                }
+            });
 
-        html2edit : function(t,content){
-                // Parse all img[class=ltFlashPlayer] tags and replace them with object+embed
-           var startPos = -1;
-                
-           while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
-               var endPos = content.indexOf('/>', startPos);
-               var attribs = t._parseAttributes(content.substring(startPos + 4, endPos));
-               
-                   // If not flash, skip it
-               if (!attribs || attribs['class'] != "ltFlashPlayer" )
-                   continue;					
-               
-               endPos += 2;
-               
-               var embedHTML = '';
-               
-               if( attribs["height"] == undefined )
-                   attribs["height"] = 20;
-               if( attribs["width"] == undefined )
-                   attribs["width"] = 320;			
-               
-               embedHTML = getFlashPlayerHTML( attribs["alt"], attribs["height"], attribs["width"] );
-               
-                   // Insert embed/object chunk
-               chunkBefore = content.substring(0, startPos);
-               chunkAfter = content.substring(endPos);
-               content = chunkBefore + embedHTML + chunkAfter;
-           }
-           return content;
+            content = cdom.innerHTML;
+            t.ed.dom.remove(cdom);
+
+            return content;
         },
 
-              // Private plugin internal functions
+        _html2edit : function(t, content) {
+            // Parse all img[class=ltFlashPlayer] tags and replace them with object+embed
+            cdom = t.ed.dom.create('div');
+            t.ed.dom.setHTML(cdom, content);
+            elems = t.ed.dom.select('img[class=ltFlashPlayer]', cdom);
 
-        _parseAttributes : function(attribute_string) {
-            var attributeName = "";
-            var attributeValue = "";
-            var withInName;
-            var withInValue;
-            var attributes = new Array();
-            var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
-            
-            if (attribute_string == null || attribute_string.length < 2)
-                return null;
-            
-            withInName = withInValue = false;
-            
-            for (var i=0; i<attribute_string.length; i++) {
-                var chr = attribute_string.charAt(i);
-                
-                if ((chr == '"' ) && !withInValue)
-                    withInValue = true;
-                else if ((chr == '"' ) && withInValue) {
-                    withInValue = false;
-                    
-                    var pos = attributeName.lastIndexOf(' ');
-                    if (pos != -1)
-                        attributeName = attributeName.substring(pos+1);
-                    
-                    attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
-                    
-                    attributeName = "";
-                    attributeValue = "";
+            tinymce.each(elems, function(e) {
+                if (e.alt) {
+                    height = (e.height? e.height : 20);
+                    width = (e.width ? e.width : 320);
+                    src = e.alt;
+                    embedHTML = getFlashPlayerHTML(src, height, width);
+                    t.ed.dom.setOuterHTML(e, embedHTML);
                 }
-                else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
-                    withInName = true;
-                
-                if (chr == '=' && withInName)
-                    withInName = false;
-                
-                if (withInName)
-                    attributeName += chr;
-                
-                if (withInValue)
-                    attributeValue += chr;
-            }
-            
-            return attributes;
+            });
+
+            content = cdom.innerHTML;
+            t.ed.dom.remove(cdom);
+
+            return content;
+        },
+
+        _createImg : function(src, height, width) {
+            imgHTML  = '<img width="' + width + '" height="' + height + '"';
+            imgHTML += ' src="' + this.url + '/img/spacer.gif' + '" title="' + src + '"';
+            imgHTML += ' alt="' + src + '" class="ltFlashPlayer" />';
+
+            return imgHTML;
         }
     });
-        // Register plugin
-	tinymce.PluginManager.add('insertresource', tinymce.plugins.InsertResourcePlugin);
+    // Register plugin
+    tinymce.PluginManager.add('insertresource', tinymce.plugins.InsertResourcePlugin);
 })();



More information about the pLog-svn mailing list