swf_fu 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,45 @@
1
+ = swf_fu --- History
2
+
3
+ == Version 1.3.2 - February 19, 2010
4
+ * Packaged the plugin as a gem [Marcus Wyatt]
5
+
6
+ == Version 1.3.1 - February 5, 2010
7
+
8
+ * Improved compatibility with Rails 3.0: swf_tag now outputs html_safe content.
9
+
10
+ * Got rid of deprecation warning in Rails 2.2+ when using swf_tag in block form.
11
+
12
+ == Version 1.3.0 - June 20, 2009
13
+
14
+ * Updated to swf_object v2.2. Change should not be noticeable to users, except compatibility improvements and better auto install. Added the option +switch_off_auto_hide_show+.
15
+
16
+ == Version 1.2.0 - January 14, 2009
17
+
18
+ * flashvars[:id] will now default to the DOM id of the object. I didn't want to have any extra defaults than the very basic ones, but there is no easy way to get this from Flash (see http://www.actionscript.org/forums/showthread.php3?t=136044 ) and no easy way to specify that using +swf_default_options+.
19
+ * If flashvars is a string (e.g. "myVar=myValue") it will be parsed into a hash so that the behaviour for default values apply to strings or hashes. swf_default_options[:flashvars] can also be a string and will also be parsed before being merged.
20
+ * Small bug fix: the options passed as hashes (:flashvars, :parameters and :html_options) were changed if swf_default_options[:flashvars, ...] existed. They are now left unchanged.
21
+
22
+ == Version 1.1.0 - January 3, 2009
23
+
24
+ * Improved the way to specify alternate content
25
+
26
+ == Version 1.0.3 - January 3, 2009
27
+
28
+ * Improved javascript initialization
29
+
30
+ :initialize => [1, 2, 3] # produces in javascript: obj.initialize(1,2,3) instead of ([1,2,3])
31
+ # no :initialize produces in javascript: obj.initialize() instead of (null)
32
+ :initialize => nil # stil produces obj.initialize(null)
33
+
34
+ == Version 1.0.2 - January 3, 2009
35
+
36
+ * Bug fix for flashvars in dynamic method
37
+
38
+ == Version 1.0.1 - January 2, 2009
39
+
40
+ * File reorganization
41
+ * Bug fix for default options
42
+
43
+ == Version 1.0 - X-mas, 2008
44
+
45
+ === Initial release.
data/FLASH_OBJECT.rdoc ADDED
@@ -0,0 +1,31 @@
1
+ == Compatibility with FlashObject
2
+
3
+ This document is intended for users of FlashObject, a (much older) swf embedding plugin that inspired swf_fu.
4
+
5
+ You can choose to:
6
+
7
+ 1) keep both. They won't interfere and +flashobject_tag+ will continue to use the older SWFObject 1.5 library.
8
+
9
+ 2) remove FlashObject:
10
+
11
+ script/plugin remove flashobject_helper
12
+
13
+ You can also manually remove <tt>javascripts/flashobject.js</tt>
14
+
15
+ +swf_fu+ will take over the +flashobject_tag+ and will use the new SWFObject 2.2 library.
16
+ This should not have impacts as long as:
17
+ * your swf path is absolute (e.g. "/path/to/my_flash.swf"). If it is relative, move your swf file from 'public/' to the new 'public/swfs/' asset folder
18
+ * you include the default javascripts (otherwise you need to include 'swfobject' explicitely and stop including 'flashobject')
19
+ * you don't use the javascript object before the page is loaded. SWFObject 2.2 makes the changes to the web page later
20
+ * you don't rely on the +verify_file_exists+ option (it doesn't do anything anymore)
21
+
22
+ In either case 1 or 2, you change existing calls to +flashobject_tag+ for +swf_tag+ at your leisure.
23
+ The interface is similar and the main differences are some options name changes:
24
+ :flash_id => :id
25
+ :variables => :flashvars
26
+ :background_color => options[:parameters][:bgcolor]
27
+
28
+ Moreover, the following defaults are gone:
29
+ :flashvars[:lzproxied]
30
+ :parameters[:scale]
31
+ :parameters[:bgcolor]
data/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ # swf_fu plugin for rails
2
+ # Copyright (c) 2010, Marc-André Lafortune.
3
+ # All rights reserved.
4
+ # Inspired by FlashObject by Davide D'Agostino aka DAddYE (http://www.lipsiasoft.com)
5
+ # Uses SWFObject.js 2.1 (http://code.google.com/p/swfobject)
6
+ #
7
+ # Licensed under the terms of the (modified) BSD License below:
8
+ #
9
+ # Redistribution and use in source and binary forms, with or without
10
+ # modification, are permitted provided that the following conditions are met:
11
+ # * Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ # * Redistributions in binary form must reproduce the above copyright
14
+ # notice, this list of conditions and the following disclaimer in the
15
+ # documentation and/or other materials provided with the distribution.
16
+ # * Neither the name of the <organization> nor the
17
+ # names of its contributors may be used to endorse or promote products
18
+ # derived from this software without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY
21
+ # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
24
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.rdoc ADDED
@@ -0,0 +1,84 @@
1
+ = +swf_fu+
2
+
3
+ With the +swf_fu+ plugin, rails treats your swf files like any other asset (images, javascripts, etc...).
4
+
5
+ +swf_fu+ (pronounced "swif-fu", bonus joke for french speakers) uses SWFObject 2.2 to embed swf objects in HTML and supports all its options.
6
+ SWFObject 2 is such a nice library that Adobe now uses it as the official way to embed swf!
7
+ SWFObject's project can be found at http://code.google.com/p/swfobject
8
+
9
+ +swf_fu+ has been tested with rails v2.0 up to v3.0b and has decent test coverage so <tt>rake test:plugins</tt> should reveal any incompatibility. Comments and pull requests welcome: http://github.com/marcandre/swf_fu
10
+
11
+ == Install
12
+
13
+ Assuming you have git[http://git-scm.com/] installed (check with <q>git version</q>), it is easy to install from your applications directory:
14
+
15
+ rails plugin install git://github.com/marcandre/swf_fu.git # rails 3
16
+
17
+ script/plugin install git://github.com/marcandre/swf_fu.git # rails 2 (starting at 2.0.2)
18
+
19
+ For older versions of +rails+ or without +git+, you can always download
20
+ +swf_fu+ from github[http://github.com/marcandre/swf_fu/archives/master] and then install it manually:
21
+
22
+ rails plugin install ~/Download/swf_fu # rails 3
23
+
24
+ script/plugin install ~/Downloads/swf_fu # rails 2.x
25
+
26
+ == Usage
27
+
28
+ === Embedding in HTML
29
+
30
+ To embed a swf file, use +swf_tag+:
31
+ <%= swf_tag "i_like_flashing" %>
32
+
33
+ Exactly like images and javascripts, +swf_tag+ will use +swf_path+
34
+ to determine the path of the swf file; it will assume it is in <tt>/public/swfs/</tt>
35
+ unless specified otherwise and it will add the ".swf" extension automatically.
36
+
37
+ You can specify alternate content either with the options <q>:alt => "Get Flash!"</q> or you can use +swf_tag+ as a block:
38
+
39
+ <% swf_tag "i_like_flashing" do %>
40
+ Get Flash
41
+ <% end %>
42
+
43
+ === Options
44
+
45
+ * <tt>:id</tt> - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+
46
+ * <tt>:width, :height</tt> - the width & height of the Flash object. Defaults to "100%". These could also specified using :size
47
+ * <tt>:size</tt> - the size of the Flash object, in the form "400x300".
48
+ * <tt>:mode</tt> - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?]
49
+ * <tt>:flashvars</tt> - a Hash of variables that are passed to the swf. Can also be a string like <tt>"foo=bar&hello=world"</tt>. Defaults to <tt>{:id => the DOM id}</tt>
50
+ * <tt>:parameters</tt> - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional]
51
+ * <tt>:alt</tt> - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page. This can also be specified as a block (see embedding section). In Rails 3, this text is _assumed_ to be HTML, so there is no need to call +html_safe+ on it.
52
+ * <tt>:flash_version</tt> - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0")
53
+ * <tt>:auto_install</tt> - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by +swf_fu+)
54
+ * <tt>:javascript_class</tt> - specify a javascript class (e.g. "MyFlash") for your flash object. If it exists, the initialize method will be called.
55
+ * <tt>:initialize</tt> - arguments to pass to the initialization method of your javascript class.
56
+ * <tt>:div_id</tt> - the DOM +id+ of the containing div itself. Defaults to <tt>"#{option[:id]}"_div</tt>
57
+ * <tt>:switch_off_auto_hide_show</tt> - switch off SWFObject's default hide/show behavior. SWFObject temporarily hides your SWF or alternative content until the library has decided which content to display. Defaults to nil.
58
+
59
+ You can override these default options with a global setting:
60
+
61
+ ActionView::Base.swf_default_options = {:mode => :static} # All swf_tag will use the static mode by default
62
+
63
+ === Javascript
64
+
65
+ +swf_fu+ will add 'swfobject' to the list of default javascript files. If you don't include
66
+ the default javascripts, a simple <tt>javascript_include "swfobject"</tt> is needed.
67
+
68
+ === swf_path
69
+
70
+ +swf_tag+ implements and relies on +swf_path+ which behaves in a similar fashion to +image_path+, +javascript_path+, etc...:
71
+
72
+ swf_path("example") => /swfs/example.swf
73
+ swf_path("example.swf") => /swfs/example.swf
74
+ swf_path("fonts/optima") => /swfs/fonts/optima.swf
75
+ swf_path("/fonts/optima") => /fonts/optima.swf
76
+ swf_path("http://www.example.com/game.swf") => http://www.example.com/game.swf
77
+
78
+ It takes into account the global setting +asset_host+, like any other asset:
79
+
80
+ ActionController::Base.asset_host = "http://assets.example.com"
81
+ image_path("logo.jpg") => http://assets.example.com/images/logo.jpg
82
+ swf_path("fonts/optima") => http://assets.example.com/swfs/fonts/optima.swf
83
+
84
+ Copyright (c) 2010 Marc-André Lafortune, released under the BSD license
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.3.2
@@ -0,0 +1,4 @@
1
+ /* SWFObject v2.2 <http://code.google.com/p/swfobject/>
2
+ is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
3
+ */
4
+ var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
Binary file
@@ -0,0 +1,61 @@
1
+ module ActionView #:nodoc:
2
+
3
+ # <tt>ActionView::Base.swf_default_options</tt> is a hash that
4
+ # will be used to specify defaults in priority to the standard
5
+ # defaults.
6
+ class Base
7
+ @@swf_default_options = {}
8
+ cattr_accessor :swf_default_options
9
+ end
10
+
11
+ module Helpers # :nodoc:
12
+ module AssetTagHelper
13
+
14
+ # Computes the path to an swf asset in the public 'swfs' directory.
15
+ # Full paths from the document root will be passed through.
16
+ # Used internally by +swf_tag+ to build the swf path.
17
+ #
18
+ # ==== Examples
19
+ # swf_path("example") # => /swfs/example.swf
20
+ # swf_path("example.swf") # => /swfs/example.swf
21
+ # swf_path("fonts/optima") # => /swfs/fonts/optima.swf
22
+ # swf_path("/fonts/optima") # => /fonts/optima.swf
23
+ # swf_path("http://www.example.com/game.swf") # => http://www.example.com/game.swf
24
+ #
25
+ # It takes into account the global setting +asset_host+, like any other asset:
26
+ #
27
+ # ActionController::Base.asset_host = "http://assets.example.com"
28
+ # image_path("logo.jpg") # => http://assets.example.com/images/logo.jpg
29
+ # swf_path("fonts/optima") # => http://assets.example.com/swfs/fonts/optima.swf
30
+ #
31
+ def swf_path(source)
32
+ if defined? SwfTag
33
+ SwfTag.new(self, @controller, source).public_path
34
+ else
35
+ compute_public_path(source, SwfAsset::DIRECTORY, SwfAsset::EXTENSION)
36
+ end
37
+ end
38
+ alias_method :path_to_swf, :swf_path # aliased to avoid conflicts with a swf_path named route
39
+
40
+ private
41
+ module SwfAsset # :nodoc:
42
+ DIRECTORY = 'swfs'.freeze
43
+ EXTENSION = 'swf'.freeze
44
+
45
+ def directory
46
+ DIRECTORY
47
+ end
48
+
49
+ def extension
50
+ EXTENSION
51
+ end
52
+ end
53
+
54
+ # AssetTag is available since 2.1.1 (http://github.com/rails/rails/commit/900fd6eca9dd97d2341e89bcb27d7a82d62965bf )
55
+ class SwfTag < AssetTag # :nodoc:
56
+ include SwfAsset
57
+ end if defined? AssetTag
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,184 @@
1
+ module ActionView #:nodoc:
2
+ module Helpers # :nodoc:
3
+ module SwfFuHelper
4
+ # Returns a set of tags that display a Flash object within an
5
+ # HTML page.
6
+ #
7
+ # Options:
8
+ # * <tt>:id</tt> - the DOM +id+ of the flash +object+ element that is used to contain the Flash object; defaults to the name of the swf in +source+
9
+ # * <tt>:width, :height</tt> - the width & height of the Flash object. Defaults to "100%". These could also specified using :size
10
+ # * <tt>:size</tt> - the size of the Flash object, in the form "400x300".
11
+ # * <tt>:mode</tt> - Either :dynamic (default) or :static. Refer to SWFObject's doc[http://code.google.com/p/swfobject/wiki/documentation#Should_I_use_the_static_or_dynamic_publishing_method?]
12
+ # * <tt>:flashvars</tt> - a Hash of variables that are passed to the swf. Can also be a string like <tt>"foo=bar&hello=world"</tt>
13
+ # * <tt>:parameters</tt> - a Hash of configuration parameters for the swf. See Adobe's doc[http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12701#optional]
14
+ # * <tt>:alt</tt> - HTML text that is displayed when the Flash player is not available. Defaults to a "Get Flash" image pointing to Adobe Flash's installation page.
15
+ # * <tt>:flash_version</tt> - the version of the Flash player that is required (e.g. "7" (default) or "8.1.0")
16
+ # * <tt>:auto_install</tt> - a swf file that will upgrade flash player if needed (defaults to "expressInstall" which was installed by swf_fu)
17
+ # * <tt>:javascript_class</tt> - specify a javascript class (e.g. "MyFlash") for your flash object. The initialize method will be called when the flash object is ready.
18
+ # * <tt>:initialize</tt> - arguments to pass to the initialization method of your javascript class.
19
+ # * <tt>:div_id</tt> - the DOM +id+ of the containing div itself. Defaults to <tt>"#{option[:id]}"_div</tt>
20
+ #
21
+ def swf_tag(source, options={}, &block)
22
+ Generator.new(source, options, self).generate(&block)
23
+ end
24
+
25
+ # For compatibility with the older FlashObject.
26
+ # It modifies the given options before calling +swf_tag+.
27
+ # See FLASH_OBJECT.rdoc
28
+ def flashobject_tag_for_compatibility(source, options={})
29
+ options = options.reverse_merge(
30
+ :auto_install => nil,
31
+ :parameters => {:scale => "noscale"},
32
+ :variables => {:lzproxied => false},
33
+ :flash_id => "flashcontent_#{rand(1_100)}",
34
+ :background_color => "#ffffff"
35
+ )
36
+ { :variables => :flashvars, :flash_id => :id }.each{|from, to| options[to] ||= options.delete(from) }
37
+ options[:parameters][:bgcolor] ||= options.delete(:background_color)
38
+ swf_tag(source, options)
39
+ end
40
+
41
+ alias_method :flashobject_tag, :flashobject_tag_for_compatibility unless defined? flashobject_tag
42
+
43
+ private
44
+ DEFAULTS = {
45
+ :width => "100%",
46
+ :height => "100%",
47
+ :flash_version => 7,
48
+ :mode => :dynamic,
49
+ :auto_install => "expressInstall",
50
+ :alt => <<-"EOS".squeeze(" ").strip.freeze
51
+ <a href="http://www.adobe.com/go/getflashplayer">
52
+ <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
53
+ </a>
54
+ EOS
55
+ }.freeze
56
+
57
+ class Generator # :nodoc:
58
+ VALID_MODES = [:static, :dynamic]
59
+ def initialize(source, options, view)
60
+ @view = view
61
+ @source = view.swf_path(source)
62
+ options = ActionView::Base.swf_default_options.merge(options)
63
+ [:html_options, :parameters, :flashvars].each do |k|
64
+ options[k] = convert_to_hash(options[k]).reverse_merge convert_to_hash(ActionView::Base.swf_default_options[k])
65
+ end
66
+ options.reverse_merge!(DEFAULTS)
67
+ options[:id] ||= source.gsub(/^.*\//, '').gsub(/\.swf$/,'')
68
+ options[:div_id] ||= options[:id]+"_div"
69
+ options[:width], options[:height] = options[:size].scan(/^(\d*%?)x(\d*%?)$/).first if options[:size]
70
+ options[:auto_install] &&= @view.swf_path(options[:auto_install])
71
+ options[:flashvars][:id] ||= options[:id]
72
+ @mode = options.delete(:mode)
73
+ @options = options
74
+ unless VALID_MODES.include? @mode
75
+ raise ArgumentError, "options[:mode] should be either #{VALID_MODES.join(' or ')}"
76
+ end
77
+ end
78
+
79
+ def generate(&block)
80
+ if block_given?
81
+ @options[:alt] = @view.capture(&block)
82
+ if Rails::VERSION::STRING < "2.2"
83
+ @view.concat(send(@mode), block.binding)
84
+ else
85
+ @view.concat(send(@mode))
86
+ end
87
+ else
88
+ send(@mode)
89
+ end
90
+ end
91
+
92
+ private
93
+ CONCAT = ActiveSupport.const_defined?(:SafeBuffer) ? :safe_concat : :concat
94
+ def convert_to_hash(s)
95
+ case s
96
+ when Hash
97
+ s
98
+ when nil
99
+ {}
100
+ when String
101
+ s.split("&").inject({}) do |h, kvp|
102
+ key, value = kvp.split("=")
103
+ h[key.to_sym] = CGI::unescape(value)
104
+ h
105
+ end
106
+ else
107
+ raise ArgumentError, "#{s} should be a Hash, a String or nil"
108
+ end
109
+ end
110
+
111
+ def convert_to_string(h)
112
+ h.map do |key_value|
113
+ key_value.map{|val| CGI::escape(val.to_s)}.join("=")
114
+ end.join("&")
115
+ end
116
+
117
+ def static
118
+ param_list = @options[:parameters].map{|k,v| %(<param name="#{k}" value="#{v}"/>) }.join("\n")
119
+ param_list += %(\n<param name="flashvars" value="#{convert_to_string(@options[:flashvars])}"/>) unless @options[:flashvars].empty?
120
+ html_options = @options[:html_options].map{|k,v| %(#{k}="#{v}")}.join(" ")
121
+ r = @view.javascript_tag(
122
+ %(swfobject.registerObject("#{@options[:id]}_container", "#{@options[:flash_version]}", #{@options[:auto_install].to_json});)
123
+ )
124
+ r.send CONCAT, <<-"EOS".strip
125
+ <div id="#{@options[:div_id]}"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="#{@options[:width]}" height="#{@options[:height]}" id="#{@options[:id]}_container" #{html_options}>
126
+ <param name="movie" value="#{@source}" />
127
+ #{param_list}
128
+ <!--[if !IE]>-->
129
+ <object type="application/x-shockwave-flash" data="#{@source}" width="#{@options[:width]}" height="#{@options[:height]}" id="#{@options[:id]}">
130
+ #{param_list}
131
+ <!--<![endif]-->
132
+ #{@options[:alt]}
133
+ <!--[if !IE]>-->
134
+ </object>
135
+ <!--<![endif]-->
136
+ </object></div>
137
+ EOS
138
+ r << @view.javascript_tag(extend_js) if @options[:javascript_class]
139
+ r.send CONCAT, library_check
140
+ r
141
+ end
142
+
143
+ def dynamic
144
+ @options[:html_options] = @options[:html_options].merge(:id => @options[:id])
145
+ @options[:parameters] = @options[:parameters].dup # don't modify the original parameters
146
+ args = (([@source] + @options.values_at(:div_id,:width,:height,:flash_version)).map(&:to_s) +
147
+ @options.values_at(:auto_install,:flashvars,:parameters,:html_options)
148
+ ).map(&:to_json).join(",")
149
+ preambule = @options[:switch_off_auto_hide_show] ? "swfobject.switchOffAutoHideShow();" : ""
150
+ r = @view.javascript_tag(preambule + "swfobject.embedSWF(#{args})")
151
+ r.send CONCAT, <<-"EOS".strip
152
+ <div id="#{@options[:div_id]}">
153
+ #{@options[:alt]}
154
+ </div>
155
+ EOS
156
+ r << @view.javascript_tag("swfobject.addDomLoadEvent(function(){#{extend_js}})") if @options[:javascript_class]
157
+ r.send CONCAT, library_check
158
+ r
159
+ end
160
+
161
+ def extend_js
162
+ arglist = case
163
+ when @options[:initialize].instance_of?(Array)
164
+ @options[:initialize].map(&:to_json).join(",")
165
+ when @options.has_key?(:initialize)
166
+ @options[:initialize].to_json
167
+ else
168
+ ""
169
+ end
170
+ "Object.extend($('#{@options[:id]}'), #{@options[:javascript_class]}.prototype).initialize(#{arglist})"
171
+ end
172
+
173
+ def library_check
174
+ return "" unless 'development' == ENV['RAILS_ENV']
175
+ @view.javascript_tag(<<-"EOS")
176
+ if (typeof swfobject == 'undefined') {
177
+ document.getElementById('#{@options[:div_id]}').innerHTML = '<strong>Warning:</strong> SWFObject.js was not loaded properly. Make sure you <tt>&lt;%= javascript_include_tag :defaults %&gt;</tt> or <tt>&lt;%= javascript_include_tag :swfobject %&gt;</tt>';
178
+ }
179
+ EOS
180
+ end
181
+ end #class Generator
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,64 @@
1
+ require 'fileutils'
2
+
3
+ namespace :swf do
4
+
5
+ task :app_env do
6
+ if defined?(RAILS_ROOT)
7
+ Rake::Task[:environment].invoke
8
+ end
9
+ end
10
+
11
+ desc "Install swf_fu assets into your rails application"
12
+ task :install => :app_env do
13
+ if defined?(RAILS_ROOT)
14
+ # Some paths
15
+ src = File.dirname(__FILE__) + "/../../assets"
16
+ puts RAILS_ROOT + "/public"
17
+ dest = RAILS_ROOT + "/public"
18
+
19
+ filename = "#{dest}/javascripts/swfobject.js"
20
+ unless File.exist?(filename)
21
+ FileUtils.cp "#{src}/javascripts/swfobject.js", filename
22
+ puts "Copying 'swfobject.js'"
23
+ end
24
+
25
+ unless File.exist?("#{dest}/swfs/")
26
+ FileUtils.mkdir "#{dest}/swfs/"
27
+ puts "Creating new 'swfs' directory for swf assets"
28
+ end
29
+
30
+ filename = "#{dest}/swfs/expressInstall.swf"
31
+ unless File.exist?(filename)
32
+ FileUtils.cp "#{src}/swfs/expressInstall.swf", filename
33
+ puts "Copying 'expressInstall.swf', the default flash auto-installer."
34
+ end
35
+ puts "Installation done."
36
+ else
37
+ puts "Unable to do installation. We need to be in the root of a Rails Application."
38
+ end
39
+ end
40
+
41
+ desc "Uninstall swf_fu assets from your rails application"
42
+ task :uninstall => :app_env do
43
+ if defined?(RAILS_ROOT)
44
+ dest = RAILS_ROOT + "/public"
45
+ begin
46
+ FileUtils.rm "#{dest}/javascripts/swfobject.js"
47
+ rescue Exception => e
48
+ puts "Warning: swfobject.js could not be deleted"
49
+ end
50
+ begin
51
+ FileUtils.rm "#{dest}/swfs/expressInstall.swf"
52
+ rescue Exception => e
53
+ puts "Warning: expressInstall.swf could not be deleted"
54
+ end
55
+ begin
56
+ Dir.rmdir "#{dest}/swfs/"
57
+ rescue Exception => e
58
+ puts "Don't remove swf directory if directory is not empty"
59
+ end
60
+ else
61
+ puts "Unable to do uninstal. We need to be in the root of a Rails Application."
62
+ end
63
+ end
64
+ end
data/lib/swf_fu.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'action_view/helpers/swf_fu_helper'
2
+ require 'action_view/helpers/asset_tag_helper/swf_asset'
data/rails/init.rb ADDED
@@ -0,0 +1,14 @@
1
+ Dir[File.join(File.dirname(__FILE__), '../vendor/*/lib')].each do |path|
2
+ $LOAD_PATH.unshift path
3
+ end
4
+
5
+ require 'action_view/helpers/asset_tag_helper'
6
+
7
+ require 'swf_fu'
8
+
9
+ # ActionView::Helpers is for recent rails version, ActionView::Base for older ones (in which case ActionView::Helpers::AssetTagHelper is also needed for tests...)
10
+ ActionView::Helpers.class_eval { include ActionView::Helpers::SwfFuHelper } # For recent rails version...
11
+ ActionView::Base.class_eval { include ActionView::Helpers::SwfFuHelper } # ...and for older ones
12
+ ActionView::TestCase.class_eval { include ActionView::Helpers::SwfFuHelper } if defined? ActionView::TestCase # ...for tests in older versions
13
+
14
+ ActionView::Helpers::AssetTagHelper.register_javascript_include_default 'swfobject'
data/tasks/rails.rake ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '/../lib/swf_fu/tasks')
data/test/results.rb ADDED
@@ -0,0 +1,42 @@
1
+ DYNAMIC_RESULT = <<'EOS'
2
+ <script type="text/javascript">
3
+ //<![CDATA[
4
+ swfobject.embedSWF("/swfs/mySwf.swf","mySwf_div","456","123","7","/swfs/expressInstall.swf",{"myVar":"value 1 \u003E 2","id":"mySwf"},{"play":true},{"id":"mySwf"})
5
+ //]]>
6
+ </script><div id="mySwf_div">
7
+ <a href="http://www.adobe.com/go/getflashplayer">
8
+ <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
9
+ </a>
10
+ </div><script type="text/javascript">
11
+ //<![CDATA[
12
+ swfobject.addDomLoadEvent(function(){Object.extend($('mySwf'), SomeClass.prototype).initialize({"be":"good"})})
13
+ //]]>
14
+ </script>
15
+ EOS
16
+
17
+ STATIC_RESULT = <<'EOS'
18
+ <script type="text/javascript">
19
+ //<![CDATA[
20
+ swfobject.registerObject("mySwf_container", "7", "/swfs/expressInstall.swf");
21
+ //]]>
22
+ </script><div id="mySwf_div"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="456" height="123" id="mySwf_container" class="lots">
23
+ <param name="movie" value="/swfs/mySwf.swf" />
24
+ <param name="play" value="true"/>
25
+ <param name="flashvars" value="myVar=value+1+%3E+2&id=mySwf"/>
26
+ <!--[if !IE]>-->
27
+ <object type="application/x-shockwave-flash" data="/swfs/mySwf.swf" width="456" height="123" id="mySwf">
28
+ <param name="play" value="true"/>
29
+ <param name="flashvars" value="myVar=value+1+%3E+2&id=mySwf"/>
30
+ <!--<![endif]-->
31
+ <a href="http://www.adobe.com/go/getflashplayer">
32
+ <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
33
+ </a>
34
+ <!--[if !IE]>-->
35
+ </object>
36
+ <!--<![endif]-->
37
+ </object></div><script type="text/javascript">
38
+ //<![CDATA[
39
+ Object.extend($('mySwf'), SomeClass.prototype).initialize({"be":"good"})
40
+ //]]>
41
+ </script>
42
+ EOS
@@ -0,0 +1,131 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require File.dirname(__FILE__) + '/results'
3
+
4
+ class SwfFuTest < ActionView::TestCase
5
+
6
+ def assert_same_stripped(expect, test)
7
+ expect, test = [expect, test].map{|s| s.split("\n").map(&:strip)}
8
+ same = expect & test
9
+ delta_expect, delta_test = [expect, test].map{|a| a-same}
10
+ STDOUT << "\n\n---- Actual result: ----\n" << test.join("\n") << "\n---------\n" unless delta_expect == delta_test
11
+ assert_equal delta_expect, delta_test
12
+ end
13
+
14
+ context "swf_path" do
15
+ context "with no special asset host" do
16
+ should "deduce the extension" do
17
+ assert_equal swf_path("example.swf"), swf_path("example")
18
+ assert_starts_with "/swfs/example.swf", swf_path("example.swf")
19
+ end
20
+
21
+ should "accept relative paths" do
22
+ assert_starts_with "/swfs/whatever/example.swf", swf_path("whatever/example.swf")
23
+ end
24
+
25
+ should "leave full paths alone" do
26
+ ["/full/path.swf", "http://www.example.com/whatever.swf"].each do |p|
27
+ assert_starts_with p, swf_path(p)
28
+ end
29
+ end
30
+ end
31
+
32
+ context "with custom asset host" do
33
+ HOST = "http://assets.example.com"
34
+ setup do
35
+ ActionController::Base.asset_host = HOST
36
+ end
37
+
38
+ teardown do
39
+ ActionController::Base.asset_host = nil
40
+ end
41
+
42
+ should "take it into account" do
43
+ assert_equal "#{HOST}/swfs/whatever.swf", swf_path("whatever")
44
+ end
45
+ end
46
+ end
47
+
48
+ context "swf_tag" do
49
+ COMPLEX_OPTIONS = { :width => "456", :height => 123,
50
+ :flashvars => {:myVar => "value 1 > 2"}.freeze,
51
+ :javascript_class => "SomeClass",
52
+ :initialize => {:be => "good"}.freeze,
53
+ :parameters => {:play => true}.freeze
54
+ }.freeze
55
+
56
+ should "understand size" do
57
+ assert_equal swf_tag("hello", :size => "123x456"),
58
+ swf_tag("hello", :width => 123, :height => "456")
59
+ end
60
+
61
+ should "only accept valid modes" do
62
+ assert_raise(ArgumentError) { swf_tag("xyz", :mode => :xyz) }
63
+ end
64
+
65
+ context "with custom defaults" do
66
+ setup do
67
+ test = {:flashvars=> {:xyz => "abc", :hello => "world"}.freeze, :mode => :static, :size => "400x300"}.freeze
68
+ @expect = swf_tag("test", test)
69
+ @expect_with_hello = swf_tag("test", :flashvars => {:xyz => "abc", :hello => "my friend"}, :mode => :static, :size => "400x300")
70
+ ActionView::Base.swf_default_options = test
71
+ end
72
+
73
+ should "respect them" do
74
+ assert_equal @expect, swf_tag("test")
75
+ end
76
+
77
+ should "merge suboptions" do
78
+ assert_equal @expect_with_hello, swf_tag("test", :flashvars => {:hello => "my friend"}.freeze)
79
+ end
80
+
81
+ teardown { ActionView::Base.swf_default_options = {} }
82
+ end
83
+
84
+ context "with static mode" do
85
+ setup { ActionView::Base.swf_default_options = {:mode => :static} }
86
+
87
+ should "deal with string flashvars" do
88
+ assert_equal swf_tag("hello", :flashvars => "xyz=abc", :mode => :static),
89
+ swf_tag("hello", :flashvars => {:xyz => "abc"}, :mode => :static)
90
+ end
91
+
92
+ should "produce the expected code" do
93
+ assert_same_stripped STATIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS.merge(:html_options => {:class => "lots"}.freeze).freeze)
94
+ end
95
+
96
+ teardown { ActionView::Base.swf_default_options = {} }
97
+ end
98
+
99
+ context "with dynamic mode" do
100
+ should "produce the expected code" do
101
+ assert_same_stripped DYNAMIC_RESULT, swf_tag("mySwf", COMPLEX_OPTIONS)
102
+ end
103
+
104
+ end
105
+
106
+ should "treat initialize arrays as list of parameters" do
107
+ assert_match 'initialize("hello","world")', swf_tag("mySwf", :initialize => ["hello", "world"], :javascript_class => "SomeClass")
108
+ end
109
+ end
110
+
111
+ context "flashobject_tag" do
112
+ should "be the same as swf_tag with different defaults" do
113
+ assert_same_stripped swf_tag("mySwf",
114
+ :auto_install => nil,
115
+ :parameters => {:scale => "noscale", :bgcolor => "#ffffff"},
116
+ :flashvars => {:lzproxied => false},
117
+ :id => "myFlash"
118
+ ), flashobject_tag("mySwf", :flash_id => "myFlash")
119
+ end
120
+
121
+ should "be the same with custom settings" do
122
+ assert_same_stripped swf_tag("mySwf",
123
+ :auto_install => nil,
124
+ :parameters => {:scale => "noborder", :bgcolor => "#ffffff"},
125
+ :flashvars => {:answer_is => 42},
126
+ :id => "myFlash"
127
+ ), flashobject_tag("mySwf", :flash_id => "myFlash", :parameters => {:scale => "noborder"}, :variables => {:answer_is => 42})
128
+ end
129
+ end
130
+ end
131
+
@@ -0,0 +1,21 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ gem 'activesupport', '~> 2.3'
4
+ require 'active_support'
5
+ gem 'activerecord', '~> 2.3'
6
+ require 'active_record'
7
+ gem 'actionpack', '~> 2.3'
8
+ require 'active_support'
9
+ require 'action_view'
10
+ require 'action_controller'
11
+
12
+ #require File.dirname(__FILE__)+'/../../../../config/environment.rb'
13
+ require 'action_view/test_case'
14
+ require "action_controller/test_process"
15
+ require 'shoulda'
16
+
17
+ require File.dirname(__FILE__) + '/../rails/init'
18
+
19
+ def assert_starts_with(start, what)
20
+ assert what.starts_with?(start), "#{what} does not start with #{start}"
21
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: swf_fu
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.2
5
+ platform: ruby
6
+ authors:
7
+ - "Marc-Andr\xC3\xA9 Lafortune"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-19 00:00:00 +13:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thoughtbot-shoulda
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: |-
26
+ swf_fu (pronounced "swif-fu", bonus joke for french speakers) uses SWFObject 2.2 to embed swf objects in HTML and supports all its options.
27
+ SWFObject 2 is such a nice library that Adobe now uses it as the official way to embed swf!
28
+ SWFObject's project can be found at http://code.google.com/p/swfobject
29
+
30
+ swf_fu has been tested with rails v2.0 up to v3.0b and has decent test coverage so <tt>rake test:plugins</tt> should reveal any incompatibility. Comments and pull requests welcome: http://github.com/marcandre/swf_fu
31
+ email: marcus.wyatt@visfleet.com
32
+ executables: []
33
+
34
+ extensions: []
35
+
36
+ extra_rdoc_files:
37
+ - LICENSE
38
+ - README.rdoc
39
+ files:
40
+ - CHANGELOG.rdoc
41
+ - FLASH_OBJECT.rdoc
42
+ - LICENSE
43
+ - README.rdoc
44
+ - VERSION
45
+ - assets/javascripts/swfobject.js
46
+ - assets/swfs/expressInstall.swf
47
+ - lib/action_view/helpers/asset_tag_helper/swf_asset.rb
48
+ - lib/action_view/helpers/swf_fu_helper.rb
49
+ - lib/swf_fu.rb
50
+ - lib/swf_fu/tasks.rb
51
+ - rails/init.rb
52
+ - tasks/rails.rake
53
+ has_rdoc: true
54
+ homepage: http://github.com/marcus-wyatt/swf_fu
55
+ licenses: []
56
+
57
+ post_install_message: |+
58
+
59
+ swf_fu has rake tasks to install and uninstall the assets required
60
+ when running within a rails project. To enable the rake tasks, add
61
+ the following require to your Rakefile:
62
+
63
+ require 'swf_fu/tasks'
64
+
65
+ rdoc_options:
66
+ - --charset=UTF-8
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ requirements: []
82
+
83
+ rubyforge_project:
84
+ rubygems_version: 1.3.5
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: With the swf_fu gem, rails treats your swf files like any other asset (images, javascripts, etc...).
88
+ test_files:
89
+ - test/results.rb
90
+ - test/swf_fu_test.rb
91
+ - test/test_helper.rb