My goal was to place my generated swf deployment files into a separate directory from the fla source files(Flash 8 versions). I found quite a few JSFL based batch jobs for publishing multiple fla files in deployment directories but none for a single testMovie scenario. The batch scenario did not work for me because I wanted to develop a single fla page and then view and publish it in a separate location.
The JSFL documentation I found for Flash 8 was limited. I also wish I could have found documentation on the xml based publish profile files. The Flash IDE has a default publish profile which resides in the following directory:
C:\Documents and Settings\username\Local Settings\Application Data\Macromedia\Flash 8\en\Configuration\Publish Profiles\default.xml
I started from Steven Sacks blog about Using JSFL to Change Publish Profile Settings v2. I was coming at it from a beginners perspective with respect to JSFL and no real knowledge of how JSFL worked within the Flash IDE. He encapsulated his request within a function but I was unsure of the implications/side effects of all the JSFL functions called and which functions would work for my goal of just publishing a single fla page to a deployment directory. So I grabbed his code and stripped it down to what I thought was the bare minimum.
So I created as2TestDeploy.jsfl and placed it in the following directory:
C:\Documents and Settings\username\Local Settings\Application Data\Macromedia\Flash 8\en\Configuration\Commands\as2TestDeploy.jsfl
This script then became accessible from within the flash IDE by selecting the Commands menu > as2testDeploy
Here is the first pass at as2TestDeploy.jsfl:
//setup file variable name //first get the DOM for the current file var doc = fl.getDocumentDOM(); //next access the filename of the file var filename = doc.name; var filePath = doc.path; //Use jsfl trace statement to view info returned fl.trace("filename is " + filename); fl.trace("file path name is " + filePath); //set actionscript version var asVersion = 2; //next create the URI //tried to hardcode it but jsfl did not like my format //var tempURI = "file:///H|/nutrition/source/NEPP/RIA_src/pages/m100001-100200/" + filename; //used getDocumentPath function to get URI for JSFL //function appended at end var URI = getDocumentPath()+ "/" +filename; //now call publish profile function setPublishProfileSettings(URI,asVersion); /* * setPublishProfileSettings * * @param String full URI pathname to current file * @param Number version number for actionscript(2 or 3) * * @return void */ function setPublishProfileSettings(fileURI, asVersion) { // does flash file exist if (fl.fileExists(fileURI)) { var xml, from, to, delta; // open the flash file var doc = fl.openDocument(fileURI); //grab the file name from its folder path var fileName = fileURI.split("/").pop(); //get the current folder path var folderPath = fileURI.split(fileName)[0]; //remove fla extension fileName = fileName.split(".")[0]; //set pathname for a temp publish profile var pPath = folderPath + "_Profile_.xml"; //export default profile settings to temp file fl.getDocumentDOM().exportPublishProfile(pPath); //reload default settings into local xml var xml = FLfile.read(pPath); //OVERRIDE default settings for new profile //in xml variable to be written to pPath file //NOTE:The flag settings below are set to false //Impact - default name values are not used //Changing these flags will cause a //permanent side-effect, the publish path is reset //within the actual fla file which is my desired //behaviour // override default names to 0 from 1 from = xml.indexOf("<defaultNames>"); to = xml.indexOf("</defaultNames>"); delta = xml.substring(from, to); xml = xml.split(delta).join("<defaultNames>0"); // override flash default name to 0 from 1 from = xml.indexOf("<flashDefaultName>"); to = xml.indexOf("</flashDefaultName>"); delta = xml.substring(from, to); xml = xml.split(delta).join("<flashDefaultName>0"); // grab publish path indices for swf from = xml.indexOf("<flashFileName>"); to = xml.indexOf("</flashFileName>"); delta = xml.substring(from, to); //hard coded the desired deploy directory path var parentPath = "./../../../../RIA_deploy/AS" + asVersion + "/www/NIM/mod/"; //switch publish path for the swf xml = xml.split(delta).join("<flashFileName>" + parentPath + fileName + ".swf"); // write the modified profile to temp file FLfile.write(pPath, xml); //import new publish profile to be used by fla fl.getDocumentDOM().importPublishProfile(pPath); //request fla testMovie //generates swf in deployment directory fl.getDocumentDOM().testMovie(); // delete the publish profile xml (no longer needed) //FLfile.remove(pPath); } } //Found this function at: //http://www.phwinfo.com/forum/macromedia-flash/299555-jsfl-importing-images-text-file-x-ycoordinates.html // returns URI path of document running the JSFL script. function getDocumentPath() { var path = String(fl.getDocumentDOM().path).replace(/\\/ig,"/"); path = path.replace(/:/ig,"|"); path = "file:///"+path; path = path.replace(/\/+$/ig,""); path = path.substring(0,path.lastIndexOf("/")); return path; }
The above JSFL code works for basic fla files. It also performs two desired effects:
- The swf file will be output to the desired deployment directory
- The fla files publish directory setting has been modified to point to the deployment directory
Note the following side effect of this script:
Each time I run this jsfl command, the publish profile settings are changed so the fla file will be changed. This is a desired behaviour the first time it is run in order to reset the final publishing directory. If my fla file is included in a svn repository, I would then recommit the file to save the updated publish directory setting.
After the JSFL script has been run once, I can/should now just select Control > Test Movie and the swf file will be output to my deployment directory. This should be the desired sequence(run script first time, then use testMovie) because I don’t want to be constantly reverting or recommitting a fla file to/from my svn repository.
NOTO BENE:
To see the JSFL fl.trace output, you must comment out fl.getDocumentDOM().testMovie(). The testMovie() command clears the output panel and then generates publishing errors or trace statements from the fla timeline.
Finally, check JSFL Deploy Settings Part II for a fla file that is referencing my local class library files and how to update the script to point to my local library.
[…] flash 8 files for our website and integrate it with our desired project directory configuration. Part I discusses how to redirect the generation of the swf file which is to be deployed to a different […]