3

We're writing a bunch of .jsx scripts, and in each one I have to mock out some functions so I can use things like Array.map() and String.trim(), but I don't want to have to include that code at the top of every script.

Is there a way to "include" / reference other scripts or libraries inside of a .jsx script file?

1

3 Answers 3

3

Not sure if this will work for Illustrator, but in Photoshop I've had success using this method in a configurator panel:

#include "coreFunctions.jsx"; saveImage("jpg", "", "web", "", ""); 

The above code is the contents of a file called "[email protected]", which calls the function "saveImage" (a user created function), declared in the coreFunctions.jsx file.

0

According to this thread in the Adobe Illustrator Scripting Community, it is possible.

Apparently the code you need is similar to this:

#target illustrator var scriptToLoad = new File("S:/NEW SCRIPTS/JAVASCRIPTS IN USE NOW/02) Make/01b) Shape P - 16 UP.jsx"); var win = new Window('palette', 'Copy Objects'); var btnSelect = win.add('button', undefined, 'Copy'); btnSelect.onClick = function(){ scriptToLoad.open("r"); var bt = new BridgeTalk; bt.target = "illustrator"; var script = scriptToLoad.read(); scriptToLoad.close(); bt.body = script; bt.send(); }// end function win.center(); win.show(); 

Note: this is just what I found searching, not something I've personally tried.

0

There was an answer here earlier today that seems to have disappeared, but it's what we're using now and it's working well. It's using the $ helper available in Illustrator, and the $.evalFile() method. Pass it a path and it will evaluate the file and return the result.

I created a little helper that I can include (minified, of course) at the top of my .jsx scripts so I can do Libraries.include("my-other-script") that will include, in my case, a file that's in my adobe_scripts root folder, in a directory called lib.

// indexOf polyfill from https://gist.github.com/atk/1034425 [].indexOf||(Array.prototype.indexOf=function(a,b,c){for(c=this.length,b=(c+~~b)%c;b<c&&(!(b in this)||this[b]!==a);b++);return b^c?b:-1;}); var Libraries = (function (libPath) { return { include: function (path) { if (!path.match(/\.jsx$/i)) { path = path + ".jsx"; } return $.evalFile(libPath + path); } }; })($.fileName.split("/").splice(0, $.fileName.split("/").indexOf("adobe_scripts") + 1).join("/") + "/lib/"); 

Minified version that I include:

/** * Libraries.include(path) -- path must be relative to adobe_scripts/lib/ * See: https://gist.github.com/jasonrhodes/5286526 */ [].indexOf||(Array.prototype.indexOf=function(a,b,c){for(c=this.length,b=(c+~~b)%c;b<c&&(!(b in this)||this[b]!==a);b++);return b^c?b:-1;});var Libraries=function(a){return{include:function(b){return b.match(/\.jsx$/i)||(b+=".jsx"),$.evalFile(a+b)}}}($.fileName.split("/").splice(0,$.fileName.split("/").indexOf("adobe_scripts")+1).join("/")+"/lib/"); 

See gist here: https://gist.github.com/jasonrhodes/5286526

1
  • That was my answer. I accidentally answered how you can do it photoshop. When I realized that, I did some quick googling and I found zero examples of the same method being available in illustrator. So I deleted my answer. Commented Apr 2, 2013 at 5:40

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.