Example AppleScript and CocoaScript Scripts
Below you'll find examples on controlling Acorn from AppleScript and JavaScript.
How to Send JavaScript to Acorn
To tell Acorn to run JavaScript files you've got a couple of different options.
Automator
The first is via Automator, with the "Do JavaScript" action. Acorn will parse the JavaScript and then call your main()
function, so it should be in the format as follows:
| function main() {
acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
}
|
Acorn executable
You can call the Acorn executable directly using the full path to it. For instance, if Acorn lives in your /Applications
folder, you can call it like so:
| /Applications/Acorn.app/Contents/MacOS/Acorn -js /path/to/MySampleOpenFile.js
|
Acorn will use the -js
argument for the JavaScript file (-javascript
is also acceptable, as is -jsa
if you want Acorn to activate when opening the file);
Terminal
Next is with /usr/bin/osascript
via the Terminal app and passing along JavaScript code via AppleScript:
| /usr/bin/osascript -e \
'tell app "Acorn" to do JavaScript "acorn.open(\"/Volumes/srv/Users/gus/Pictures/MyImage.acorn\");"'
|
Or you can also pass in an absolute path to a JavaScript file:
| /usr/bin/osascript -e \
'tell app "Acorn" to do JavaScript "/path/to/MySampleOpenFile.js"'
|
For bonus points, you can create a simple shell script, which we've got at the bottom of this page.
Acorn's JavaScript Console
Acorn includes a JavaScript console you can open up from the Command Bar. Output to console.log()
shows up here and you can also type in random JavaScript commands into it:
Open an image
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
end tell
|
JavaScript:
| acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
|
Open and save an image as another type
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn" to save as PNG in "srv:Users:gus:Pictures:MyImage.png"
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.dataOfType("public.png").writeToFile("/tmp/MyImage.png")
|
Making a new image
JavaScript:
| var doc = acorn.makeDocumentWithSize(NSMakeSize(200, 100));
|
Resize the canvas
AppleScript:
| tell application "Acorn"
tell document 1
resize canvas width 1000 height 1000 anchor position middle left
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.setCanvasSize_usingAnchor(NSMakeSize(1000, 1000), "top left");
|
Crop an image
AppleScript:
| tell application "Acorn"
**open** "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
-- crop to a rectangle, located at 100,100
-- and with a width and height of 400
**crop** rect {100, 100, 400, 400}
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.cropToRect(NSMakeRect(100, 100, 400, 400));
|
Resize an image, and then undo
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
resize image width 200
activate
undo
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.scaleImageToWidth(200);
acorn.activate();
doc.undo();
|
Change the resolution of an image
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
resize image resolution 144
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.setDpi(NSMakeSize(144, 144));
|
Find the name of the first layer
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
name of layer 1
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var name = doc.layers()[0].layerName();
|
Find the width and height of the image
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
set w to width of document 1
set h to height of document 1
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var size = doc.canvasSize()
print("The size is: " + size.width + " x " + size.height);
|
Duplicating a document, resize it, and save it as a PNG
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
duplicate document 1 with properties {name:"New Document"}
tell document "New Document"
resize image width 200
save as PNG in "tmp:foo.png"
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var newDoc = doc.duplicate()
newDoc.scaleImageToWidth(200)
newDoc.dataOfType("public.png").writeToFile("/tmp/foo.png")
|
Get all the names of the top level layers
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
set layerNames to ""
repeat with l in layers in document 1
set layerNames to (layerNames & name of l & ", ")
end repeat
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
for (i = 0; i < doc.layers().count(); i++) {
var layer = doc.layers()[i];
print(layer.layerName());
}
|
Trim a document
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
trim document 1
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.trim();
|
Set the blend modes for a layer
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
set l to {pass through, color blend, color burn, color dodge, darken, destination atop, destination out, destination over, destination in, exclusion, hard light, hue, lighten, luminosity, multiply, normal, overlay, plus darker, plus lighter, saturation, screen, soft light, source atop, source in, source out, xor}
repeat with loopVar in l
set blend mode of layer 4 to loopVar
delay 1
end repeat
end tell
end tell
|
JavaScript:
| var doc = acorn.orderedDocuments()[0];
var layer = doc.layers()[1];
var blendModes = ["clear", "color blend", "color burn", "color dodge", "copy", "darken", "destination atop", "destination out", "destination over", "difference", "exclusion", "hard light", "hue", "lighten", "luminosity", "multiply", "normal", "overlay", "pass through", "plus darker", "plus lighter", "saturation", "screen", "soft light", "source atop", "source in", "source out", "xor"];
for (var idx in blendModes) {
print(blendModes[idx]);
layer.setBlendMode(blendModes[idx]);
}
|
Duplicating a layer
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
duplicate layer 1
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var layer = doc.layers()[0];
var newLayer = layer.duplicate();
// then do something with it.
newLayer.callFilterNamed("CIColorInvert");
|
Web Export
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
trim -- cut down on any extra whitespace
web export in "tmp:foo.png" as PNG
web export in "tmp:foo.jpeg" as JPEG quality 25
web export in "tmp:foo.jp2" as JPEG 2000 quality 25
web export in "tmp:foo.gif" as GIF
undo -- undo our trim. Or we could just close the doc
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.trim() // cut down on any extra whitespace
doc.webExportWithOptions({'uti': 'public.png', 'file': '/tmp/foo.png'});
doc.webExportWithOptions({'uti': 'public.jpeg', 'quality': 25, 'file': '/tmp/foo.jpeg'});
doc.webExportWithOptions({'uti': 'public.jpeg-2000', 'quality': 25, 'progressive': true, 'file': '/tmp/foo.jp2'});
doc.webExportWithOptions({'uti': 'com.compuserve.gif', 'file': '/tmp/foo.gif'});
doc.undo(); // undo our trim. Or we could just close the doc
|
Copy Merged
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document "MyImage.acorn"
copy merged
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.copyMerged()
|
How to tell if a document is already open or not
AppleScript:
| tell application "Acorn"
if exists document 1 then
-- do whatever
end if
end tell
|
JavaScript:
| var docs = acorn.orderedDocuments();
if (docs.length() > 0) {
// do whatever
}
|
Filling a layer
| -- choose a color
set aColor to choose color
tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1
-- fill the current layer with our selected color
fill with color aColor
delay 1
undo
-- let's do it again, but by adding a 50% alpha to the color list, so it'll be transparent
set aColor to aColor & (65535 * 0.5)
fill with color aColor
end tell
end tell
|
Flipping the canvas
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1
flip canvas direction horizontal
-- we could also say "vertical" here.
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.flipCanvasWithDirection("vertical");
|
Having fun with selections
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1
select all
delay 1
deselect
select rect {100, 100, 400, 400}
invert selection
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.selectAll();
doc.deselect();
doc.selectFrame(NSMakeRect(100, 100, 400, 400));
doc.invertSelection();
|
Merge visible layers
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1
merge visible layers
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.mergeVisibleLayers()
|
Setting a preference
In this example, we show how to set the registration name and number for our copy of Acorn.
AppleScript:
| tell application "Acorn"
set preference key "registrationName" value "August Mueller"
set preference key "registrationNumber" value "FMAC20-XXXXXXXXX"
quit
end tell
|
JavaScript:
| acorn.setPreference_forKey("1", "drawMarchingAntsSelection");
|
Calling a filter
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1 to do filter name "CIColorInvert"
tell document 1 to do filter name "New Image With Curved Drop Shadow"
end tell
|
JavaScript:
| var doc = acorn.orderedDocuments()[0];
var layer = doc.layers()[0];
doc.callFilterNamed("CIColorInvert");
doc.callFilterNamed("New Image With Curved Drop Shadow");
|
Selecting a layer
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var layer = doc.layers()[0];
doc.setSelectedLayer(layer);
|
Calling Auto Levels
AppleScript:
| tell application "Acorn"
tell document 1
auto levels
end tell
end tell
|
Target a specific layer with AppleScript:
| tell application "Acorn"
tell document 1
tell layer 2
auto **levels**
end tell
end tell
end tell
|
JavaScript:
| var doc = acorn.orderedDocuments()[0];
doc.autoLevels();
// or target a specific layer:
doc.undo();
var layer = doc.layers()[1];
layer.autoLevels()
|
Making an Oval Selection
AppleScript:
| tell application "Acorn"
open "srv:Users:gus:Pictures:MyImage.acorn"
tell document 1
deselect
select oval rect {100, 100, 400, 600}
--close without saving
end tell
end tell
|
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
doc.deselect();
doc.selectOval(NSMakeRect(100, 100, 400, 400));
|
Add an image as a layer
JavaScript:
| var doc = acorn.open("/Volumes/srv/Users/gus/Pictures/MyImage.acorn");
var layer = doc.layers()[0];
doc.setSelectedLayer(layer);
// 0 puts it at the bottom. 1 or higher would put it on top..
var newLayer = doc.baseGroup().insertLayerWithImagePath_atIndex("/Volumes/srv/Users/gus/Pictures/AnotherImage.png", 3)
|
Note For App Store Users.
If you've purchased Acorn from the Mac App Store, certain AppleScripts, Automator Actions, and JavaScript scripts may not work for you because of sandboxing restrictions required by Apple. The direct version of Acorn does not have these issues.
Sample Shell Script to Send JavaScript to Acorn
| #!/bin/bash
get_abs_filename() {
# $1 : relative filename
echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}
for var in "$@"
do
myabsfile=$(get_abs_filename "$var")
echo tell application \"Acorn\" to do JavaScript \"$myabsfile\" | osascript
done
|