Your prescription for increased productivity and profitability
In our previous blog post we started a script that would automate the creation of a web document using a document preset. As part of the automation the script allows the user to choose a stylesheet from which text (paragraph and character) styles, object styles and table styles are imported.
As part of this automation you may think of additional functionality you might want to add to the script as part of the document creation. In this post, we look at some options.
How color libraries should be handled is a matter of personal preference. Colors are most likely defined as part of an object style so they are loaded as part of the object style import. But should you want additional color sets, they can loaded as part of the automated document creation.
The following example script demonstrates loading colors from a file saved in the Styles folder for InDesign’s Presets folder. You will need a document open for testing.
set colorPrompt to "Choose file for colors" tell application "Adobe InDesign CC 2018" set docRef to active document set appPath to file path as string set stylePath to appPath & "Presets:Styles" set styleFiles to list folder colorPath without invisibles try set itemChoice to choose from list styleFiles with prompt colorPrompt if itemChoice is not false then set colorFile to item 1 of itemChoice else error "Requires choice of file to continue" end if set wasSuccess to my loadSwatches(docRef, stylePath, colorFile) on error errStr activate display alert "Error: " & errStr end try end tell colorPath
For the most part, InDesign documents should be organized using layers. Background objects are placed on a “Background” layer, images on an “Image” layer, and so on. It makes sense then to allow a document creation script to give the user the option for adding layers.
When you create a new layer, by default it is placed at the top of the layer list and becomes the active layer.
A script can refer to a layer by name, by its index in the layer list, or as the current active layer. This is demonstrated in the following:
set layerName to "myNewLayer" tell application "Adobe InDesign CC 2018" tell document 1 if not (exists layer layerName) then set myLayer to make layer with properties {name:layerName} else set myLayer to layer layerName end if set layerTest to name of active layer end tell end tell layerTest
The problem with this behavior (new layers placed at the top) is that when you add a layer it normally is for images, or a background which should be placed at the bottom. A script can move the layer being added to the bottom of the existing layers using an index value of -1 to access the bottom layer in the list.
(*assumes active document*) set layerName to "Background" tell application "Adobe InDesign CC 2018" tell document 1 if not (exists layer layerName) then set myLayer to make layer with properties {name:layerName} else set myLayer to layer layerName end if move myLayer to (after layer -1) set active layer to layer 1 end tell end tell
Notice here that the script also sets the active layer to the top layer (layer 1).
If creating a number of layers, you may decide to create them in the reverse order for which you want them in the layer list.
(*assumes active document*) set layerList to {"DieLine", "Background", "Images", "Animation", "Text"} tell application "Adobe InDesign CC 2018" set docRef to document 1 tell docRef repeat with i from 1 to length of layerList set layerName to item i of layerList if not (exists layer layerName) then set myLayer to make layer with properties {name:layerName} end if end repeat end tell end tell
Of course, this leaves the existing Layer 1 to be the bottom layer. To avoid this, the script could rename the top layer before adding the rest of the layer list items.
The following script creates a custom dialog from which the user can select the document preset for creating the document and indicate which layers will need to be added if any. It also introduces a repeat method for creating checkbox controls in a custom dialog.
set layerList to {"DieLine", "Background", "Images", "Animation", "Text"} set dlgName to "Document Setup" tell application "Adobe InDesign CC 2018" set presetNames to name of document presets where intent is web intent end tell try set userResponse to userDialog(dlgName, true, presetNames, layerList) set presetIndex to item 1 of userResponse set presetName to item presetIndex of presetNames set layerNames to item 2 of userResponse set docRef to docFromPreset(presetName) if layerNames is not {} then createLayers(docRef, layerNames) end if on error errStr activate display alert "Error: " & errStr end try (*Creates web document using named preset*) on docFromPreset(presetName) tell application "Adobe InDesign CC 2018" set presetRef to document preset presetName set docRef to make document with properties {document preset:presetRef} end tell return docRef end docFromPreset (*Creates layers with names as listed in layerList. The existing layer 1 is renamed using item 1 of the layerList as part of the process*) on createLayers(docRef, layerList) tell application "Adobe InDesign CC 2018" tell docRef if length of layerList > 1 then set name of layer 1 to item 1 of layerList set layerList to rest of layerList end if repeat with i from 1 to length of layerList set layerName to item i of layerList if not (exists layer layerName) then make layer with properties {name:layerName} end if end repeat end tell end tell end createLayers (*Custom dialog allows user to determine document preset for document and layers to be created*) on userDialog(dlgName, cancelIt, presetList, layerList) tell application "Adobe InDesign CC 2018" set origLevel to user interaction level of script preferences set user interaction level of script preferences to interact with all set dlgRef to make dialog with properties {name:dlgName, canCancel:cancelIt} set checkObjects to {}--object list for checkbox controls tell dlgRef tell (make dialog column) tell (make dialog row) make static text with properties {static label:"Choose Preset for document"} set filenameDrop to make dropdown with properties {string list:presetList, selected index:0, min width:144} end tell set enable1 to make enabling group with properties {static label:"Add Layers", checked state:false} tell enable1 tell (make dialog column) tell (make dialog row) repeat with i from 1 to length of layerList set end of checkObjects to make checkbox control with properties {static label:item i of layerList, checked state:false} end repeat end tell--row end tell--column end tell--enabling group end tell--dialog column end tell --dialog set userResponse to show dlgRef if userResponse = true then set checkList to {} set fileIndex to (selected index of filenameDrop) + 1 if checked state of enable1 = true then repeat with i from 1 to length of checkObjects if checked state of item i of checkObjects is true then set end of checkList to static label of item i of checkObjects end if end repeat end if end if destroy dlgRef set user interaction level of script preferences to origLevel --if cancelled, throw error; otherwise return values if userResponse = false then error "User cancelled" return {fileIndex, checkList} end tell --application end userDialog
…custom dialog created from the script
The amount of code necessary for creating a custom dialog may seen like a lot, but notice how the handler for creating the document from a named document preset (docFromPreset) is now significantly reduced in size.
…Layers created from above dialog />
The ability to import styles and colors from stylesheets was overlooked in this script for sake of brevity. You might want to tackle this as a challenge. For those who have trouble, be aware that this subject will be discussed in the next blog post when we add some simple animation to the document.
Scripts provided are for demonstration and educational purposes. No representation is made as to their accuracy or completeness. Readers are advised to use the code at their own risk.