Can Adobe .jsx scripts include other script files?

2020-07-18 07:36发布

We're writing a bunch of .jsx scripts and in each 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" other .jsx scripts inside of a .jsx script file?

4条回答
虎瘦雄心在
2楼-- · 2020-07-18 07:46

Just wanted to add a note to Ike10's answer. Undocumented is generous - this is the worst "documentation" I've ever come across in 20+ years of writing code. It seems to me that you must also add the CEFCommandLine argument to your manifest.xml file before the primary JSX file will load/eval external files:

<Resources>
    <MainPath>./whatever.html</MainPath>
    <ScriptPath>./jsx/whatever.jsx</ScriptPath>
    <CEFCommandLine>
        <Parameter>--allow-file-access</Parameter>
        <Parameter>--allow-file-access-from-files</Parameter>
    </CEFCommandLine>
</Resources>
查看更多
仙女界的扛把子
3楼-- · 2020-07-18 07:48

We're now 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

查看更多
【Aperson】
4楼-- · 2020-07-18 08:02

Or you can simply use #include and #includepath preprocessor directives at the top of your script. You can find a detailed description in Adobe's "JavaScript Tools Guide".

For example, if you want to include scripts/helper.jsx in a .jsx file:

#include "scripts/helpers.jsx"
// the rest of your code below ...
查看更多
趁早两清
5楼-- · 2020-07-18 08:07

Just leaving this here for anyone like me who is looking for this. In Adobe Illustrator CC 2015, I was unable to get #include to work, but @include did. So for example:

External File: foo.jsx

function alertTheWordNo(){
  alert('NO');
}

The Script File: bar.jsx

//@include 'foo.jsx';
alertTheWordNo();

Disclaimer: I cannot find any documentation of this but have tested it with Adobe Illustrator CC 2015 and it works.

Hope this helps someone. If anyone has any questions just ask!

查看更多
登录 后发表回答