2011-08-29 94 views
3

我正在嘗試使用腳本橋統計Pages文檔中的單詞(文檔格式爲RTF)。 (我可以它使用NSApplescript但我寧可不要在我的代碼中的AppleScript感知膠帶做) 當我使用AppleScript(和NSAppleScript API)的我能做到這一點很簡單(成功)執行此任務:Scripting Bridge和com.apple.iWork.Pages - 可以工作嗎?

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 
} 

我覈實,我在主線程上運行這個東西(這相當於代碼的工作對文本編輯)。關於正在發生什麼/如何解決的任何想法?

感謝看了這麼遠....

回答

1

所以,問題是,我是要求一個名爲「something.rtf」的文件,我已經在網頁剛打開。但是當Pages打開「something.rtf」時,它將其命名爲「something」。然後,當您要求名爲「something.rtf」的文檔時,它不會返回nil,因爲該文檔不存在名稱。相反,它返回一個名爲「something.rtf」的PagesDocument,它沒有有效的內容:一個NIL文檔。我認爲當我提交給SO時,我太愚蠢了。

因爲我已經檢查其他應用程序,這似乎是正常的AppleScript的行爲,當你問一個文件的名字(找回含有NIL文件「有效物」)哦。

3

該代碼爲我工作。在F-腳本等效:

> 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]; 
+0

一些奇怪的事情正在發生 - 它只是失敗的橋代碼,它只對頁面(我知道)失敗。我可能不得不打包一個演示,並在另一臺Mac上嘗試它,看看我是否有某種「擁有」。我已經通過調試器和對象回來了,但它們在內部是空的(無論如何根據[NSObject描述])。至於文檔命名問題,在代碼的上下文中不會有問題。無論如何,儘管它可能是,但我不知道你提請我注意的任何工具,謝謝你。關閉調查... – zer0gravitas

+1

所以問題是我要求一個名爲「something.rtf」的文件。和頁面打開「something.rtf」,但*名稱*它「的東西」。然後當你要求名爲「something.rtf」的文檔時,它不會返回nil,因爲該文檔不存在該名稱。相反,它返回一個名爲「something.rtf」的PagesDocument,它沒有有效的內容:一個NIL文檔。我認爲當我提交給SO時,我太愚蠢了。我已經檢查過其他應用程序,這似乎是正常的applescript行爲,當你要求一個文件的名字(獲得一個零文件)哦。 – zer0gravitas

+0

是的,文檔的顯示名稱(可以有擴展名,甚至是本地化的名稱)和磁盤上的名稱之間存在區別。您可能希望按照路徑進行匹配。 –

相關問題