Archive for the 'OSAScriptView' 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 

2016/01/07 OSAScriptController+OSAScriptViewでAppleScriptを実行

Cocoaの機能を用いて、OSAScriptController+OSAScriptViewの組み合わせでAppleScriptのテキストを実行するAppleScriptです。

osascriptexe.png

AppleScriptの動的生成(テキストを組み立ててコンパイル(構文確認)してAppleScriptにして)+実行については、

 (1)AppleScriptのコマンドrun scriptで実行するもの
 (2)shellのosascriptコマンドで実行するもの
 (3)OSAScriptのinitWithSource: compileAndReturnError:メソッドで実行するもの

ぐらいが定番でしょうか。文法的に無茶なことを実現(recordの動的生成など)するために、昔から使われてきたブラックテクノロジー(セキュリティ的に穴になりそうな無茶な処理)です。

#  recordの動的生成については、OS X 10.10から通常のAppleScriptでもCocoaの機能が普通に呼び出せるようになったので、NSDictionaryを作成してrecord生成できます。正規表現なども普通に使えるようになったので、かつての「常識」が根底から変わってきています

で、なんでOSAScriptController+OSAScriptViewとかいう「自分流Script Editorを作る部品」を引っ張り出してきたかといえば、

 AppleScriptを直接PDF化したい(書式つきで)

ような場合に、OSAScriptViewからリッチテキストを取得して、RTF、HTML、PDFなどに変換するような処理ができると考えたからです。まっとうに考えれば、Script EditorをAppleScriptでコントロールして書き出すあたりになりますが、それだと並列処理できませんので。

並列処理実行できるように、このような部品を使ってみた次第です。

AppleScript名:OSAScriptViewでAppleScriptを実行
– 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”

set srcStr to current application’s NSMutableString’s stringWithString:“display dialog \”OSAScript TEST\”"

set osaCon to current application’s OSAScriptController’s alloc()’s init()
–>  (OSAScriptController) <OSAScriptController: 0×7ff7240ae190>

set osaView to current application’s OSAScriptView’s alloc()’s init()

osaCon’s setScriptView:osaView
osaView’s setString:srcStr
–osaCon’s compileScript:(missing value)
osaCon’s runScript:(missing value)

–set aRT to osaView’s

★Click Here to Open This Script