Today I find that AppleScript allows us to import Foundation, with that we have lots of power, including NSString. See my script
1 2 3
use scripting additions use framework "Foundation" property NSString : a reference to current application's NSString
Here is how I can remove last path component from a string
1 2 3 4 5
on myRemoveLastPath(myPath) set myString to NSString's stringWithString:myPath set removedLastPathString to myString's stringByDeletingLastPathComponent removedLastPathString as text end myRemoveLastPath
You need to cast to NSString with NSString's stringWithString: and cast back to Apple Script string with as text. The 's is how you can invoke functions.
One more thing is that we can support parameters to function, like this script
1 2 3 4 5
on remove:remove_string fromString:source_string set s_String to NSString's stringWithString:source_string set r_String to NSString's stringWithString:remove_string return s_String's stringByReplacingOccurrencesOfString:r_String withString:"" end remove:fromString:
Extension must run inside sandbox. If you switch App Sandbox in your XcodeWayExtensions.entitlements to NO, it won’t load. So sandbox restricts me a lot in what kinds of things I want to do. And under Xcode 9, I can’t use NSWorkspace to open Finder.
So I think I could use Apple Script too, and it worked like a charm. The only restriction is code reuse, since I only know how to run an entire script. One way is to import other Apple scripts https://stackoverflow.com/questions/2606136/import-applescript-methods-in-another-applescript but I think I will write all the functions inside 1 script, and find out how to call specific function.
By function, I also mean handler, procedure. I come across this snippet Scriptinator that pretty much inspires me, thanks to open source.
So here is my script that contains lots of functions . And here is ScriptRunner that explains how to build NSAppleEventDescriptor. Note that you need to import Carbon