【问题标题】:Scripting Bridge and com.apple.iWork.Pages -- can this work?Scripting Bridge 和 com.apple.iWork.Pages —— 可以吗?
【发布时间】:2011-08-29 18:34:02
【问题描述】:

我正在尝试使用脚本桥计算 Pages 文档(文档格式为 RTF)中的单词。 (我可以使用 NSApplescript 做到这一点,但我宁愿在我的代码中不包含所有支持 applescript 的胶带) 当我使用 applescript(和 NSAppleScript API)执行此任务时,我可以非常简单地(并且成功地)执行此操作:

on wordCount(appName,docName)
local mydoc
local wordcount
tell application appName
    set mydoc to document docName
    set wordcount to count of words of mydoc
    log "wordcount = " & wordcount
    return wordcount
end tell
end wordCount

但是,当我使用脚本桥尝试等效项时,我的所有对象似乎都具有空内容。我的代码如下:

+ (NSUInteger) wordCountForApp: (SBApplication*) sbApp docNamed: (NSString*) docName
{
    PagesApplication *pages = (PagesApplication*)sbApp; 
    PagesDocument *doc = [[pages documents] objectWithName:docName];
    PagesText *text = [doc bodyText];
    SBElementArray *words = [text words];
    NSUInteger wc = [words count];
    NSLog(@"Pages word count = %ul", (unsigned int) wc);
    return wc; // wc comes back as zero always ... grrrr
}   

我已经验证我在主线程上运行这些东西(并且等效代码适用于 TextEdit)。关于发生了什么/如何解决的任何想法?

感谢您阅读本文……

【问题讨论】:

    标签: objective-c cocoa applescript


    【解决方案1】:

    该代码对我有用。 F-Script 中的等价物:

    > pages := SBApplication applicationWithBundleIdentifier: 'com.apple.iWork.Pages'
    
    > (pages documents objectWithName: 'fun') bodyText words count
    303
    

    我建议您使用调试器逐步完成它,并确保每个对象都是您所期望的,即pages[pages documents] 等。

    如果您编写此代码供外部使用,理想情况下您不应按名称引用文档;用户可能打开了多个同名文档。

    另一个选项是objc-appscript,它提供了一个简洁的 ASTranslate 实用程序,可以将 AppleScript 转换为 Objective-C(或用于其他 appscript 绑定的 Ruby 或 Python)。例如,对于上述内容,您将有类似的内容:

    #import "PGGlue/PGGlue.h"
    PGApplication *pages = [PGApplication applicationWithName: @"Pages"];
    PGReference *ref = [[pages documents] byName: @"fun"];
    PGCountCommand *cmd = [[ref count] each: [PGConstant word]];
    id result = [cmd send];
    

    【讨论】:

    • 肯定会发生一些奇怪的事情——它只是失败的桥接代码,而且它只对 Pages 失败(据我所知)。我可能必须打包一个演示并在另一台 Mac 上尝试,看看我的是否以某种方式“被附身”。我已经通过调试器并且对象回来了,但它们在内部以某种方式为空(无论如何根据[NSObject描述])。至于文档命名问题,在此代码的上下文中不会有问题。无论如何,尽管如此,我不知道您引起我注意的任何一种工具,谢谢。去调查...
    • 所以问题是我要的是一个名为“something.rtf”的文档。 Pages 打开“something.rtf”,但命名它是“something”。然后,当您请求名为“something.rtf”的文档时,它不会返回 nil,因为该文档不存在该名称。相反,它返回一个名为“something.rtf”的 PagesDocument,它没有有效内容:一个 NIL 文档。当我提交给 SO 时,我想我只是太愚蠢了,无法识别。从那以后我检查了其他应用程序,当您按名称请求文档(以获取 nil 文档)时,这似乎是正常的 applescript 行为哦。
    • 是的,文档的显示名称(可以去除扩展名,甚至是本地化名称)和磁盘上的名称是有区别的。您可能希望改为按路径匹配。
    【解决方案2】:

    所以问题是我要的是我刚刚在 Pages 中打开的名为“something.rtf”的文档。但是当 Pages 打开“something.rtf”时,它会将其命名为“something”。然后,当您请求名为“something.rtf”的文档时,它不会返回 nil,因为该文档不存在该 name。相反,它返回一个名为“something.rtf”的 PagesDocument,它没有有效内容:一个 NIL 文档。当我提交给 SO 时,我想我只是太愚蠢了,无法识别。

    我已经检查了其他应用程序,当您按名称请求文档(以获取包含 NIL 文档的“有效对象”)时,这似乎是正常的 applescript 行为。哦,好吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      相关资源
      最近更新 更多