Skip to content

ExtendScript in InDesign Scripting DOM

fabiantheblind edited this page Nov 19, 2015 · 4 revisions

###ExtendScript

JavaScript, or EcmaScript, is what brought us in web browsers such things as scrolling by pressing a button, warnings and similar things. ExtendScript is a "dialect" of JavaScript, which was developed by Adobe. This means InDesign understands JavaScript and ExtendScript, but a browser can't do anything with ExtendScript commands.

"The ID Scripting DOOOOOOOOOOOOOOOOM"
wuahahahahahahahah! (Lightning aaaaannnnnddd Thunder)

Now lets have a quick look on how to use all the js in InDesign

    /**
     *  ExtendScript has its extended kind of calling objects
     *  in the InDesign scripting doom
     *  like for example item(), lastItem(), everyItem()
     *  if you try to use them on an javascript array
     *  you will get an error
     */
    
    var names = ["Paul", "Peter", "Mary", "Jamens", "Hans", "Smeagol", "Estragon"];
    
    try{
        alert(names.middleItem());
        }catch(e){
        alert("The object " + names.constructor.name +" cant do that:\n"+e );
        };
    
    // lets build some stuff to play with
    // some pages with some text on them 
    var ph = 50;
    var pw = 50;
    var count = 0; // for the loop
    while (count < names.length){
    var doc = app.documents.add({
            documentPreferences:{
                pageHeight:ph,
                pageWidth:pw
                }
            });
        // you can give labels to nearly everything
        doc.label = names[count];
        
    var tf  = doc.pages.item(0).textFrames.add({
            geometricBounds:[ ph/2,0,ph,pw],
            contents:names[count]
        });
        
        tf.paragraphs.everyItem().justification = Justification.CENTER_ALIGN;
    count++;
    }
    
    
    /**
     *  Now another thing.
     *  The lastItem() is not the last item created
     *  The last item is the last item in the collection of
     *  things you are calling
     */
    var list = new Array();
    list.push("Last item in collection : " + app.documents.lastItem().label);
    list.push("Active Item : " + app.activeDocument.label);
    list.push("'app.documents.item(0)' : " + app.documents.item(0).label);
    
    alert("Names\n" + list.join("\n"));
    
    /**
     *  Now close some of them
     */
    var name = app.documents.lastItem().label;
    app.documents.lastItem().close(SaveOptions.NO);
    alert("closed last item named " + name);
    
    var name = app.documents.middleItem().label;
    app.documents.middleItem().close(SaveOptions.NO);
    alert("closed last item named " + name);
    
    // use the following piece of code with care:
    // Like Uncle Ben saz: "With great power comes great responsibility!"
    //~ app.documents.everyItem().close(SaveOptions.NO);    
    /*
    As in javascript in the ID DOM everything is an object  
    you can for example add a doc with a text frame on the first page with  
    */

    var aString = "Hello World!\rHello Dude. How are you?\rFine and you?";
    var doc = app.documents.add();
    var pg = doc.pages[0];
    var d_pref = doc.documentPreferences;
    var pw = d_pref.pageWidth;
    var ph = d_pref.pageHeight;


    var x1 = 13;
    var y1 = 13;
    var x2 = pw - x1;
    var y2 = ph - y1;
    var gb = [y1, x1, y2, x2];

    var tf = pg.textFrames.add();
    tf.geometricBounds = gb;
    tf.contents = aString;
    for(var i = 0; i < tf.paragraphs.length; i++){
        var par = tf.paragraphs[i];
        alert(par + "-->" + par.contents);

        for(var j = 0; j < par.words.length; j++){
            alert(par.words[j].contents);
            }
    }

You can think of the ID DOM as a flow chart. You can access the application and its options the documents. the active document. All pages from a document and all text frames on a page. or all words in a line from a paragraph that is part of a story. This chart shows just a part of the interconnection. It is not automatically generated. Just written up from my head.

the dom

Clone this wiki locally