Sketch插件可以通过Mocha和CocoaScript实现,它允许您使用JavaScript编写的外部脚本使用Objective-C / Cocoa代码。该桥负责JavaScript和Cocoa之间的翻译,因此您可以专注于重要的部分(即使Sketch成为可怕的东西)。
来自CocoaScript的自述文件:
CocoaScript建立在Apple的JavaScriptCore之上,这是与Safari相同的JavaScript引擎。所以,当你在CocoaScript中编写代码时,你确实在编写JavaScript。 CocoaScript还包含一个桥梁,可让您通过JavaScript访问Apple的Cocoa框架。这意味着除了标准JavaScript库之外,您还可以使用许多精彩的类和函数。
您的插件脚本不会在浏览器中运行,但会在JavaScriptCore上下文中运行。因此它运行的JavaScript环境有点不常见。
setTimeout
,fetch
,console
等都是不可用。话虽这么说,如果你使用skpm
,它会自动填充工具有些事情你:console
,setTimeout
,setInterval
和fetch
。
您可以从CocoaScript访问所有Cocoa和Sketch API。
Objective-C属性的行为与在桥的JavaScript端应该一样。
Objective-C方法作为对象的不透明JavaScript代理的属性公开。
将选择器名称转换为JavaScript属性名称时采取以下步骤:
这样,一个选择器如executeOperation:withObject:error:
转换为函数名称executeOperation_withObject_error()
。
例如,如果你想打开一个File Picker面板,你可以使用NSOpenPanel类:
var openPanel = NSOpenPanel.openPanel()
openPanel.setCanChooseDirectories(false)
openPanel.setCanChooseFiles(true)
openPanel.setCanCreateDirectories(false)
openPanel.setDirectoryURL(NSURL.fileURLWithPath('~/Documents/'))
openPanel.setTitle('Choose a file')
openPanel.setPrompt('Choose')
openPanel.runModal()
如果您需要更多关于Cocoa的信息,请查看参考资料部分。
对于某些Obj-C选择器,您可能需要传递一个指针。这在JavaScript中不存在,所以有一种全局方法来创建一个:
var ptr = MOPointer.alloc().init()
var ptrToSomething = MOPointer.alloc().initWithValue(something)
如果您的脚本正在进行异步操作,我们需要告诉Sketch保留它并且不要垃圾收集它。
你可以通过访问COScript
:
COScript.currentCOScript().shouldKeepAround = true
脚本完成其工作后,不要忘记释放它:
COScript.currentCOScript().shouldKeepAround = false
有关这座桥如何运作的更多信息,请查看Mocha README,它确实是完整的(但需要一些Obj-C的概念)。
原文:https://developer.sketchapp.com/guides/cocoascript/