Flying Meat
JSTalk
Download JSTalk Free download, version 1.0b
Requires Mac OS X 10.5 or later, works great on 10.6.
this is a separator

JSTalk is a scripting language built on top of JavaScript, with a bridge to Apple's Cocoa libraries. You can use it to communicate with other applications just like AppleScript does, but without the AppleScript.

If you're a programmer, you're going to want to visit the git repository: http://github.com/ccgus/jstalk/tree/master.
If you just want to use JSTalk, you'll want to download the JSTalk Editor, and samples: JSTalkPreview.zip

How does JSTalk (the language) work?
JSTalk is built on top of Apple's JavaScriptCore, the same JavaScript engine that powers Safari. So when you write in JSTalk, you are really writing JavaScript.

JSTalk also includes a bridge which lets you access Apple's Cocoa frameworks from JavaScript. This means you have a ton wonderful classes and functions you can use in addition to the standard JavaScript library.

JSTalk also adds a preprocessor to make using the Cocoa frameworks friendlier. Since Cocoa is written in Objective-C, you get a different syntax than what you'd normally encounter in JavaScript for calling methods. For example, here's some typical Cocoa code for writing a string to a file:
NSString *someContent = @"Hello World!";
NSString *path = @"/tmp/foo.txt";
[[someContent dataUsingEncoding:NSUTF8StringEncoding] writeToFile:path atomically:YES];
And here is how it would normally look in a bridged scripting language:
var someContent = NSString.stringWithString_("Hello World!")
var path = "/tmp/foo.txt"
someContent.dataUsingEncoding_(NSUTF8StringEncoding).writeToFile_atomically_(path, true)
This is a valid script in JSTalk, but it doesn't look very nice. For instance, there are lots of underscores in the method names, and you don't get the nested message passing like you do in Objective-C. To fix this quandary, JSTalk adds a light preprocessor which will allow you to use Objective-C message syntax like so:
var someContent = @"Hello World!"
var path = @"/tmp/foo.txt"
[[someContent dataUsingEncoding:NSUTF8StringEncoding] writeToFile:path atomically:true]

Give me an example
Here's an AppleScript example, for adding a new rectangle object to a sketch document:
tell application "Sketch"
  tell document 1
    set o to make new box
    set width of o to 100
    set height of o to 100
    set stroke thickness of o to 10
  end tell
end tell
And here's how you do it with JSTalk, using a doctored version of Sketch (6 lines of code, + the JSTalk framework):
var sketch = [JSTalk application:"Sketch"];
var doc = [sketch orderedDocuments][0]
var rectangle = [doc makeNewBox];

[rectangle setWidth:100];
[rectangle setHeight:100];
[rectangle setXPosition:100];
[rectangle setYPosition:100];
If you aren't a fan of the optional bracket syntax, you can also write the script this way:
var sketch = JSTalk.application_("Sketch");
var doc = sketch.orderedDocuments()[0]
var rectangle = doc.makeNewBox();

rectangle.setWidth_(100);
rectangle.setHeight_(100);
rectangle.setXPosition_(100);
rectangle.setYPosition_(100);

But no apps out there currently support JSTalk!
Applications can also be scripted using Cocoa's Script Bridge class, SBApplication. Here's an example:
[[SBApplication application:"iChat"] setStatusMessage:"Happy (funball)"];
Although this is great to have, it's not the same as an application natively support JSTalk over DO. Anything more than simple tasks using SBApplication tends to be a little more than difficult.

JSTalk Plugins
Aka, loadable bundles which add functionality to JSTalk, via helper classes, wrappers, and categories.

JSTalk comes with some standard helper categories (which you can currently find in JSTalkExtras.m), but it will also look in your ~/Library/Application Support/JSTalk/Plug-ins/ folder, and load any .jstplugin bundles it sees. You can turn this off in your application if you don't like that idea, via [JSTalk setShouldLoadJSTPlugins:NO];

There are two examples with JSTalk, one that just adds a category cocoa's string class: - [NSString reversedString]. The other example is "FMDB.jstplugin", which loads the FMDB SQLite classes, for use in JSTalk. This allows you to use sqlite to create, insert, update, etc, sql tables from JSTalk.

But it doesn't do X:
Let us know by sending an email to gus@flyingmeat.com

Mailing list and bug reporting: - Developer mailing list: http://groups.google.com/group/jstalk-dev - Bug reporting: http://jstalk.lighthouseapp.com/projects/26692-jstalk/

Credits:
As said earlier, JSTalk is a blend of existing technologies, and has very little original code in it. Here's what it uses:
- JSTalk Icon, from Brad Ellis.
- JavaScriptCore, from Apple and the WebKit team.
- JSCocoa, from Patrick Geiller.
- TDParseKit, from Todd Ditchendorf.
- NoodleLineNumberView, from Paul Kim / Noodlesoft.
- TextExtras, from Mike Ferris.