0

我正在开发 OSX,Xcode 8.2。目标-C。我使用脚本桥来处理 Adob​​e InDesign。我有一个很长的 AppleScript,我想用 Scripting-Bridge 将其转换为 Objective-C,以利用其后台任务的可能性。

为了更好地理解,让我向您展示之前 applescript 的部分:

tell application "Adobe InDesign CC 2017"
    tell active document
       -- grep setup done before
       find grep
    end tell
end tell

苹果脚本中的结果:

{
text from character 294 to character 298 of story id 1354 of document id 5 of application "Adobe InDesign CC 2017", 
text from character 140 to character 144 of story id 1377 of document id 5 of application "Adobe InDesign CC 2017"
}

如果我想在我执行的applescript中获取字符串(注意“as string”):

text from character 294 to character 298 of story id 1354 of document id 5 of 
    application "Adobe InDesign CC 2017" as string
--> "Test1"

在objective-c中翻译的方法:

// document is an instance of the SBApplication indesign
[document findGrepReverseOrder:NO];

结果显示:

(
"<AdobeInDesignCC2017TextCtxt @0x608020a442f0: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID  ', 'from':'obj '{ 'form':'ID  ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':294, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID  ', 'from':'obj '{ 'form':'ID  ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':298, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1354 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>",
"<AdobeInDesignCC2017TextCtxt @0x608020a44140: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID  ', 'from':'obj '{ 'form':'ID  ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':140, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID  ', 'from':'obj '{ 'form':'ID  ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':144, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1377 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>"
)

看起来每个 Adob​​eInDesignCC2017TextCtxt 对象都包含两个 appleeventdescriptor 来标记单词的位置和长度。我需要访问它们以提取信息。我检查了h。文件,但找不到像在 applescript 中一样使用“作为字符串”提取文本的方法。如何访问描述符?任何想法表示赞赏。

4

1 回答 1

1

我建议使用 AppleScript-ObjC 桥接器,它可以让您直接从 ObjC 调用 AppleScript 处理程序,就像调用 Cocoa 方法一样。Scripting Bridge 充斥着残缺和缺失的功能,并且很容易出现应用程序不兼容的问题,尤其是对于 Adob​​e 等基于 Carbon 的较旧应用程序。它在一定程度上起作用,然后你就完蛋了。(我知道有一个人尝试将他所有的 Adob​​e 脚本都转换为 SB,只是突然间停止了一个小更新。)

AppleScript 的唯一有效替代品是 py-appscript/SwiftAutomation(我使用 py3-appscript 进行高端插图自动化),但由于 Apple 搞砸了,我不再为那些提供公共支持,所以你只能靠自己了。AppleScript 是一种可怕的语言,但至少它得到了官方支持 [咳嗽],而且它的 Apple 事件桥是首屈一指的。这是从 ObjC 调用 AS 的快速方法。只要您在单个线程上调用 AppleScript 处理程序,程序的 ObjC 部分就可以利用线程、GCD 等。它真的很简单,几乎完全没有痛苦,并且允许每种语言做它最擅长的事情。

于 2017-04-04T10:13:14.690 回答