Can Adobe .jsx scripts include other script files?

前端 未结 4 1196
猫巷女王i
猫巷女王i 2021-01-06 10:46

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 inc

相关标签:
4条回答
  • 2021-01-06 11:09

    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

    0 讨论(0)
  • 2021-01-06 11:19

    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!

    0 讨论(0)
  • 2021-01-06 11:32

    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>
    
    0 讨论(0)
  • 2021-01-06 11:34

    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 ...
    
    0 讨论(0)
提交回复
热议问题