IconCoreObj (CyberHandlerObject)

CoreObjは、AppleScriptに用意されている基本的な機能を組み合わせてより高度な機能を提供するルーチンを提供しするAppleScript開発用ライブラリです。開発するAppleScriptに親属性として組み込むことにより用います。
このライブラリはかつてCyberHandlerObjと呼ばれていましたが、以下の解説はCoreObjと名称を変更したver.4.3を基準に記述しています。
このソフトウエアは共有ライブラリであり,システム全体の動作に影響を与える可能性は低いと考えられますが,このソフトウエアを使用したことによるいかなる結果についても作者は責任を負いません。

CoreObjの利用

以下のようなスクリプトで親プロパティとして組み込むと,そのスクリプトの内部ではCoreObjのルーチンを透過的に利用することができます。
property parent : (load script file ":CoreObj")
--実行するスクリプトをこの後に記述する

必須イベント

 Appleによって定められた,アプリケーションが受け取るべき必須イベントです。CoreObjはアプリケーションではないので,対応する必要がありません。CoreObjを使用してアプリケーションを開発する際には必要に応じて実装して下さい。
run
一応定義されていますが、実際には何もしません。
open
特にサポートしません。
print
特にサポートしません。
quit
特にサポートしません。

スクリプトオブジェクト共有ライブラリ規格対応ルーチン

スクリプトオブジェクト共有ライブラリ規格で規定された必須ルーチンです。CoreObjは独自にこれらのルーチンを実装していますが、アプリケーションを開発する際には同名のルーチンを組み込み,そのアプリケーション独自のデータを返すようにして下さい。

returnName()
スクリプトの名称を文字列で返す。
returnVer()
バージョン番号を実数で返す。
returnInfo()
スクリプトについての簡単な紹介を文字列で返す。
returnCR()
著作権情報を文字列で返す。

スクリプトオブジェクト共有ライブラリ読み込みルーチン

スクリプト共有ライブラリ規格のページで提供されているライブラリである loadObj() Handler が持つloadObj()ルーチンと同等のルーチンです。CoreObjを property parentに指定したときはこのルーチンを明示することなく暗黙的に使用できるので便利です。このルーチンから,他の多くのスクリプト共有ライブラリの持つ機能にアクセスすることができます。

loadObj(ObjName)
アプリケーション本体と同じフォルダか,Shared Librariesフォルダまたは機能拡張フォルダの中の指定した名称のスクリプトオブジェクト共有ライブラリを読み込んで返す。読み込んだライブラリの機能はtellブロックなどを用いて利用することができる。
downloadObj(theURL)
インターネット上で指定したURLのDataCompObjバイナリ形式書類を読み込む。loadObj(thePath)のインターネット版。実際のスクリプトはDataCompObjに実装されているため,実行にはDataCompObjが必要。

Mac OS Xのためのルーチン

checkX()
Mac OS Xであればtrueが、Classic Mac OSであればfalseが返ります。
checkMach()
そのスクリプトを実行中のアプリケーションがMach-O Carbon形式のappletであればtrueが、CFM Carbon形式のappletであればfalseが返ります。Classic Mac OSで実行中もfalseが返ります。

ファイル操作に関するルーチン

writeText(thePath, msg, appending)
テキストファイルまたはバイナリデータを書き出す。パラメータは,thePath はファイルの場所,msg は保存するデータ文字列。appending がtrue なら以前のファイルの末尾に書き込み,false なら以前の内容を消去して上書き。CyberHandlerObj 4.0未満では Tanaka's osax 1.xとのコンフリクトを避けるため WTF(thePath, msg, appending) というルーチン名でした。
readText(thePath)
テキストファイル(ファイルのデータフォーク,バイナリデータ)を読み出す。CyberHandlerObj 4.0未満では Tanaka's osax 1.xとのコンフリクトを避けるため RTF(thePath) というルーチン名でした。
setFTCT(thePath, FileType, CreaterType)
指定したファイルのファイルタイプとクリエータタイプを変更する。CyberHandlerObj 3.7より利用可能。MacOS 7.6.1以前で実行するためには共有ライブラリDataCompObjも必要。

文字列を処理するルーチン

exStr(pre, post, msg)
msg中のpre文字列をpost文字列に置換する。AppleScriptが得意とするリストによる文字列の高速置換処理はよく知られていますが、データが大きくなるとクラッシュの原因となることがわかっています。このルーチンはこの問題を避けるため、やや低速ではありますがより安定した文字列置換ルーチンを提供します。
myFolder(thePath)
指定したファイルパスを含むフォルダのパスを返す。
myName(thePath)
指定したファイル名またはファイルパスの拡張子を除いたファイル名を返す。たとえば、「Macintosh HD:test.txt」に対して「test」と返す。

ユーザーインターフェースを簡単に記述するためのルーチン

sVoice(String)
MacOS 8.5 osax,MacOS8 osax,PlainTalk say osax,Script Tools osaxのいずれかにより Speech Manager (Text-to-Speech) の音声合成機能を利用する。DecorMasterObject 3.2以降が必要。
dDialog(msg, theIcon)
display dialog msg with icon theIcon buttons {"OK"} default button 1
を毎回書くのが面倒だったので作ったルーチン。指定した文字列とアイコンでボタンがひとつだけのダイアログを表示する。15秒で自動的にタイムアウトする。CyberHandlerObj 3.83より利用可能。
errorObj(msg, eStr, eNum)
煩雑なエラー処理を自動的に行うスクリプト。try制御文と組み合わせて以下のように利用する。
try
    -- Script to be done
on error eStr number eNum
    errorObj("Error in reading file.", eStr, eNum)
end try
エラーが発生するとエラーメッセージとエラー番号が表示され,自動的にログを記録する。記録されるログファイルの場所および無人運転されるサーバ向けのダイアログの省略に関しては初期設定参照。

インターネット関連ルーチン

URLを開くためのヘルパーアプリケーションは,MacOS8以降ではインターネット設定に従う。それ以前のシステムでは独自のルーチンでブラウザが検索される。漢字Talk7.5以降のすべてのMacOSで実行できるスクリプトが作成できる。いくつかの表現形式があるが機能は全て同じ。

gotoURL(theURL)
指定されたURLを開く。CyberHandlerObj ver.2.0以降で利用可能。
OpenURL(theURL)
指定されたURLを開く。CyberHandlerObj ver.3.6以降で利用可能。
open url theURL
指定されたURLを開く。MacOS8〜8.1以降で記述可能。
open location theURL
指定されたURLを開く。MacOS 8.5以降で記述可能。
<<event GURLGURL>> theURL,<<event WWW!OURL>> theURL,<<event WWW?OURL>> theURL
CyberHandlerObj ver.3.73以降またはMacOS8以降で利用可能。主要なインターネット関連アプリケーションに共通なイベント。コンパイルするとMacOS8以降は open url、MacOS 8.5以降は open locationと表示される。System7以前もほとんどのインターネットアプリケーションには独自に実装されていた。CoreObjectは互換性の確保のためにこのハンドラに独自のスクリプトを実装している。
getBrowser()
WWWブラウザのアプリケーション名またはファイルパスを返す。ユーザーがNetscapeを使っていてもIEを使っていても対応できるように設計された,より柔軟なルーチン。OpenURLルーチンやdownloadObjルーチンもこれを利用する。任意のWebページを開くためには以下のように記述できる。CyberHandlerObj 3.8から利用可能。
tell application getBrowser() to ヌevent GURLGURLネ "http://www.apple.co.jp/"
getApp(CreaterType)
与えられたクリエータタイプのアプリケーション名を返す。そのアプリケーションが起動していない場合,アプリケーションのフルパスが返る。アプリケーションの名称に依存しないスクリプティングには不可欠(「〜はどこですか?」と問われなくなる)。例えば,Netscapeで任意のページを開くためには以下のように記述できる。インターネット関連以外にも様々な利用法がある。
tell application getApp("MOSS") to ヌevent GURLGURLネ "http://www.apple.co.jp/"

クリップボード関連のルーチン

MacOS 8.5以降は標準でクリップボード関連の命令が組み込まれていたが、それ以前からCoreObjectにはクリップボードに関する命令が組み込まれていた。CoreObjectの命令を使用すると、System7においてもMac OS Xにおいてもそれぞれ最適な動作を行い、スクリプトの高い互換性を確保することができる。
getClip()
クリップボードの中身を取得する。MacOS 8.5以降の標準機能追加のクリップボード関連の命令のかわりにこのルーチンを使用すると,MacOS 8.1以前でも動作するスクリプトアプリケーションを作成できる。MacOS 8.5以上またはJon's Commandインストール下ではそのままシステムの命令を呼び出すが、MacOS 8.1以前ではClipboard Objectの持つ同名のルーチンを呼び出す。
setClip(anyData)
指定されたデータをクリップボードに入れる。MacOS 8.5以上またはJon's Commandインストール下ではシステムの命令を利用するが、MacOS 8.1以前ではClipboard Objectの持つ同名のルーチンを呼び出す。

DataCompObj形式の読み書き

AppleScriptで変数に格納することができるいかなるデータでもバイナリデータに読み書きすることができる命令。

readDataFile(thePath)
DataCompObj形式で保存されたファイルのデータを標準モードで読み込む。MacBinary化されている場合など、標準的な動作では読み込めなかった場合、DataCompObjの同名のルーチンが呼ばれるようになっている。
writeDataFile(thePath, theData)
データを指定したファイルに保存する。実行にはDataCompObjがインストールされている必要がある。DataCompObjの読み込み動作をいちいち記述しなくてもこのハンドラを呼ぶだけでいい。
関連ページ
   スクリプトオブジェクト共有ライブラリ規格
   Data Component Object
   Text Encoding Object
   Clipboard Object
   DecorMasterObject

ログの記録について

いくつかの機能はログを記録するためのlogイベントを発行します。コンテナアプリケーションが初期設定データを返すためのルーチンreturnPref()(後述)を実装してrecLogパラメータにログファイルのファイルパスを返すようにすると,CoreObjのさまざまなログを記録することができます。また,コンテナアプリケーション自身もlogイベントを容易に利用することができるようになります。なお,recLogルーチンはログを日付とともに記録します。参考までにCoreObjのログ関連のルーチンの中身を示します。

on recLog(msg) --3.0
    log ((current date) as string) & return & msg
end recLog
on log msg --3.0
    try
        writeText(recLog of returnPref(), msg & return, true)
    on error
    end try
end log

ユーザー登録関連ルーチン

当サイトのソフトウエアが利用するルーチン。通常のアプリケーションには関係ありません。

returnAR()
ユーザー登録の内容であるアクセス権を返す。CyberHandlerObj ver.3.86からはリスト形式でデータが返されるようになった。
returnUN()
ユーザー名を返す。MacOS8未満の場合は AS Runner Objectが必要。

openイベント関連ルーチン

CoreObjを親としてドロップレットを簡単に作成するためのルーチン。CyberHandlerObj 3.7で追加。
openFinderList(FinderList)
openイベントで受け取った内容を渡すと,openFolderとopenFileに振り分けてくれる。openイベントそのものでないのは,CyberHandlerObjを親属性に指定したときに無条件にドロップレットになってしまうのを避けるため。
openFolder(FolderPath)
フォルダの内容をリスト化して,openFinderListに再帰的に返す。いわゆるfolder diving。
openFile(thePath)
CyberHandlerObj内部では空。CyberHandlerObjを親属性に指定し,適当な内容のイベントで上書きして利用する。

これらを以下のように組み合わせて利用すると,複数のフォルダやファイルの処理を同時に行うドロップレットが比較的簡単に作成できる。また,openFolderやopenFileを独自に定義することでファイルやフォルダに対する動作を変更できる。例えば,openFolderハンドラをコンテナアプリケーションに定義するとフォルダ内のファイルは無視するようにできる。
property parent : load script file "CyberHandlerObj"
on open FinderList --get dropped files
    openFinderList(FinderList) --send to parent
end open
on openFile(thePath) --for each file
    try --sample to send data into clipboard
        if file type of (info for thePath) is "TEXT" then
            set targetData to RTF(thePath)
            setClip(targetData)
        end if
    on error eStr number eNum
        errorObj("Error in reading file.", eStr, eNum) --sample to proccess error
    end try
end openFile
各スクリプトアプリケーションは親属性となっているスクリプトオブジェクトCoreObjが持つルーチンを継承しします。その一部分をスクリプトの目的に応じて書き換えることで簡単にフォルダのドラッグ&ドロップ対応のスクリプトを作成することができます。複数のファイルの同時ドロップや,ファイルとフォルダが混在したドロップにも対応します。

ハンドラCyberHandlerObj作成するスクリプト完成するスクリプト
open(なし)openFinderListへ渡すopenFinderListへ渡す
openFinderListFileとFolderに分類(なし)FileとFolderに分類
openFile何もしないファイルへの処理を記述ファイルへの処理
openFolderフォルダ内容のリストをopenFinderListへ返す(なし)フォルダ内容のリストをopenFinderListへ返す

CoreObjから親スクリプトに問い合わせる内容

CoreObjはコンテナアプリケーションに対してreturnPref()イベントで様々な設定を問い合わせます。これにより,コンテナアプリケーションはCoreObjの動作内容を制御することができます。親スクリプトは以下の項目についてレコード形式でデータを返してください。データが返らない場合,CoreObjは省略時設定で動作します。
on returnPref()
    return {recLog:"Error Log", dDialog:true, dDesktop:false}
end returnPref

recLog
ログファイルを記録するファイルパス。ファイルパスのかわりにファイル名を返すと,親アプリケーションと同じフォルダ内にその名称のログファイルを作成します。falseを返すとログファイルは記録されません。
dDialog
ダイアログを表示するかどうかの設定。trueならダイアログを表示するが,falseならダイアログを表示しない。AppleTalkネットワーク経由でのインタラプトを防いだり,無人で動作するサーバの動作を妨げないようにするための項目。
dDesktop
falseならerrorObjルーチンなどにおけるDecorMasterObjectによる拡張インターフェースがスキップされ,各種の処理が軽くなる。
sVoice
sVoice(String)ルーチンによるSpeech Managerの利用。falseならSpeech Managerがスキップされ,各種の処理が軽くなる。

関連ページ
   スクリプトオブジェクト共有ライブラリ規格
   ネットワークインストーラ
   ライセンス登録に関して
   エラー番号一覧


Copyright(C) SUZUKI Kazufumi, All rights reserved.