Archive for the 'OSAScript' Category

2016/01/07 OSAScriptViewでAppleScriptをソース取得&コンパイルして書式付きでPDF出力

Cocoaの機能を用いて、指定のAppleScriptのソースを取得して、再度OSAScriptView上でコンパイル(構文確認)を行い、構文色分けを反映させたスタイルつきのPDFとして出力するAppleScriptです。

わかりにくいですが、AppleScriptの書類をPDF出力するAppleScriptです(正確に書けば書くほどわからなくなるのはなぜだろう)。デスクトップフォルダ上に元Scriptのファイル名でPDF出力します。

script1.png
▲出力対象のAppleScript書類

scriptpdf.png
▲上記書類をPDF出力したもの

PDF出力部分は、指定URLの内容を1枚モノのPDFに書き出すAppleScriptを書いた際に利用した記述そのままです。ページネーションは一切していないため、こういう用途ではページネーション指定をしてPDF出力したほうがよいかもしれません。

AppleScriptのパスだけ与えれば、あとはGUIアプリの機能は利用していないため、大量データの並列処理に適した構造になっています。

「なんでこんなもの作ったの?」と聞かれましたが、結局「これじゃない何か」を作ろうとして、その途中経過ができたものなので、本Scriptは本当に作りたいものの副産物です。

AppleScript名:OSAScriptViewでAppleScriptをソース取得&コンパイルして書式付きでPDF出力
– Created 2016-01-07 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “OSAKit”
use framework “AppKit”
use framework “Quartz”

set targX to 1024 –PDF Width
set targY to 2048 –PDF Height

–Select & Read AppleScript Source (Only Editable AppleScripts are available)
set aScriptAlias to (choose file with prompt “Choose AppleScript to convert to PDF” of type {“com.apple.applescript.script-bundle”, “com.apple.applescript.script”})

set srcStr to getASsourceFor(aScriptAlias) of me
if srcStr = missing value or srcStr = “” then
  –Error
  
display dialog “Error in reading script source….” buttons {“OK”} default button 1 with icon 1
  
return
end if

–Making PDF Out Path from source script file name
set outName to getFileNameFromAlias(aScriptAlias) of me
set outFol to POSIX path of (path to desktop)
set outPath to outFol & outName
set pathString to current application’s NSString’s stringWithString:outPath
set newPath to pathString’s stringByDeletingPathExtension()
set pdfOutPath to newPath’s stringByAppendingPathExtension:“pdf”

–Compile AppleScript
set osaCon to current application’s OSAScriptController’s alloc()’s init()
set osaView to current application’s OSAScriptView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, targX, targY))
osaCon’s setScriptView:osaView
osaView’s setString:srcStr
osaCon’s compileScript:(missing value) –Compile(構文確認)

–Make Print into PDF
set aPrintInfo to current application’s NSPrintInfo’s sharedPrintInfo()
set newPrintOp to current application’s NSPrintOperation’s PDFOperationWithView:(osaView) insideRect:(current application’s NSMakeRect(0, 0, targX, targY)) toPath:pdfOutPath printInfo:aPrintInfo

set runPrint to newPrintOp’s runOperation()
return (runPrint as boolean)

–指定AppleScriptファイルのソースコードを取得する(実行専用Scriptからは取得できない)
– Original Created 2014-02-23 Shane Stanley
on getASsourceFor(anAlias as {alias, string})
  set anHFSpath to anAlias as string
  
set aURL to current application’s |NSURL|’s fileURLWithPath:(POSIX path of anHFSpath)
  
set theScript to current application’s OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value)
  
return theScript’s source() as text
end getASsourceFor

–指定のAliasからファイル名を取得する
on getFileNameFromAlias(anAlias)
  set aPath to POSIX path of anAlias
  
set pathString to current application’s NSString’s stringWithString:aPath
  
set newPath to pathString’s lastPathComponent()
  
return newPath as string
end getFileNameFromAlias

★Click Here to Open This Script 

2014/12/16 指定AppleScriptをしらべたり実行したりする

Cocoaの機能を用いて、AppleScript(の書類やテキスト)を実行したり調べたりするAppleScriptです。

日本語として間違った文に見えますが、正しい内容です。

(1)TEST1:ASOCのプログラムをテキストで組み立てて実行
普通のAppleScriptを実行できることは容易に想像できるのですが、OS X 10.10から利用可能になったを機能を使いまくったScriptを渡して実行できるか試してみました。海外でもサンプルコードをチラホラ見かけるのですが、お行儀のよい最低限の内容だったりしていただけません(限界まで切り込んでない感が、、、)。

問題なく実行できるものの、display dialogを実行させたら無視されたりと、制約はあるようです(コマンドラインからosascriptコマンドで実行しているかのよーだ)。choose fileは無視されません。

(2)TEST2:指定ASがコンパイルずみかどうか調べる
コンパイル(中間言語翻訳)ずみかどうかを調べます。

(3)TEST3:指定ASのソースを取得
指定のAppleScriptのソースコードを取得します。実行専用で保存されている場合には取得できません。

AppleScript名:指定AppleScriptの各種属性を取得
– Created 2014-12-16 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “OSAKit”

–TEST1: ASOCのプログラムをテキストで組み立てて実行
set asText to
use AppleScript version \”2.4\”
use framework \”Foundation\”
use framework \”ASObjCExtras\”
use framework \”QuartzCore\”
use scripting additions

property PDFDocument : class \”PDFDocument\”

set aHFSPath to (choose file of type {\”com.adobe.pdf\”} with prompt \”ページ数をかぞえるPDFを指定してください\”) as string
set aURL to (current application’s SMSFord’s URLFrom:aHFSPath)

set aPDFdoc to PDFDocument’s alloc()’s initWithURL:aURL
set aRes to aPDFdoc’s pageCount()
say (aRes as string)


set aRes to compileAndExecuteASstring(asText)

–TEST2: 指定AppleScriptがコンパイルずみ(中間コードへの翻訳の意)かどうかをしらべる
set a to (choose file of type {“com.apple.applescript.script”})
set asRes to chkAScompiled(a)
–> true or false

–TEST3: 指定AppleScriptのソースを取得
set asSource to getASsourceFor(a)
–> AppleScriptのソースがテキストで返る

–指定のAppleScriptファイルがコンパイル(構文確認+中間言語化)ずみかどうかを取得する
on chkAScompiled(anAlias as {alias, string})
  set anHFSpath to anAlias as string
  
set aURL to (current application’s SMSFord’s URLFrom:anHFSpath)
  
set asO to current application’s OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value)
  
try
    set compF to asO’s isCompiled() as boolean
  on error
    return false
  end try
  
  
return compF
end chkAScompiled

–指定AppleScriptファイルのソースコードを取得する(実行専用Scriptからは取得できない)
– Original Created 2014-02-23 Shane Stanley
on getASsourceFor(anAlias as {alias, string})
  set anHFSpath to anAlias as string
  
set aURL to current application’s SMSFord’s URLFrom:anHFSpath
  
set theScript to current application’s OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value)
  
return theScript’s source() as text
end getASsourceFor

–与えられた文字列をAppleScriptとして評価してエラーになるかどうかを返す(falseでエラー)
on compileASstring(asSourceStr as string)
  set aNSString to current application’s NSString’s stringWithString:asSourceStr
  
set asObj to current application’s OSAScript’s alloc()’s initWithSource:aNSString
  
set asRes to asObj’s compileAndReturnError:(missing value)
  
return asRes as boolean
end compileASstring

–与えられた文字列をAppleScriptとして評価して正しければ実行
on compileAndExecuteASstring(asSourceStr as string)
  set aNSString to current application’s NSString’s stringWithString:asSourceStr
  
set asObj to current application’s OSAScript’s alloc()’s initWithSource:aNSString
  
set asRes to asObj’s compileAndReturnError:(missing value)
  
if asRes = false then return false –エラーの場合falseを返す
  
  
set aErrorRec to current application’s NSMutableDictionary
  
asObj’s executeAndReturnError:aErrorRec
  
return aErrorRec’s ASify() as record –Resultだけちょっといただけない
end compileAndExecuteASstring

★Click Here to Open This Script