AppleScript Libraries(共有ライブラリ。以下ASLと略)にsdef(Scirpt辞書)をつけて、AppleScriptや他のOSA言語との間で共通して呼び出し可能なライブラリを書くシリーズの続きです。
単なるASLでは、AppleScript側からしか呼び出せません。そこで、sdefを書いて指定することで、より運用性を高められるのではないかと考え、実際に簡単な(素朴な内容の)ライブラリで実験してみました。
–> Download checkboxLib_v3.scptd(To ~/Library/Script Libraries)
コマンドが1つだけ。パラメータがいくつか。AppleScript側から呼び出す場合にはパラメータの省略ができるが、JXA側からは省略できないといった状態のライブラリで、普通に使っている分には問題を感じませんでした。
一方で、sdefについて調べはじめるといろいろ情報が集まってくるもので、ここ数日で急速にsdef記述のためのノウハウがたまってきました。sdefをいままでに一度も書いたことがないわけではありませんが、必要最低限の情報だけ集めて書いてオシマイという程度の「割り切った関係」というのでしょうか。それほど真剣に付き合ったことはなかったわけです。
一応、研究用にすべてのアプリケーションのsdefファイルは取り出して参照できるように収集していますが、カラスが光りものを集めて埋めておくのとほとんど差はありませんでした。HTMLに書き出したsdefについては、バージョン間の差異を検出するために有効活用していますが、sdefそのものを見せられてもあまり実用性がありませんでした。
sdefを書くことが要求仕様に出される案件がほとんどないので(1件だけあったかも)、Scripter側でも「別に普通にハンドラ呼べばいいだろ」というぐらいの認識であり、sdefを年がら年中書いているSctipterというのはほとんどいないように見えます(海外でも)。
予約語に「ゆらぎ」を許容する
いちいち予約語を正確にすべて覚えている人などいません。書いた本人ですら「こういう書き方でも認識すればいいのに」と考えがちです。そこで、入力時に別表記で入力しても、構文確認(コンパイル)時に正しい予約語に変換するSynonymを定義しておきましょう。
チェックボックスの形状を「standard」と「flat」の予約語で指定できるようにしてありますが、「standard」という予約語がすぐに思い出せないとスクリプトエディタ上で用語を確認する必要があります(そもそも、スクリプトを書くときに用語辞書を表示させないことなどないのですが)。
そこで、コマンドのパラメータ指定部分で、
<parameter name="checkbox type" type="checkbox types" code="COLC" description="checkbox type"/>
タイプに「checkbox types」を指定。この定数checkbox typesの定義部分に、同一視する単語を列挙しておきます。
<enumeration name="checkbox types" code="enu1"> <enumerator name="standard" code="cstd" description="Standard Checkbox"> <synonym name="checkbox"/> <synonym name="normal"/> <synonym name="as usual"/> </enumerator>
checkbox typeの指定パラメータ(定数)に、「checkbox」「normal」「as usual」などが書かれても、これらを「standard」と同一視して、構文確認時に「standard」に書き換えます。
▲実際にスクリプトエディタ上でSynonymが表示されている(Synと省略)
パラメータの省略許容指定(optional)
現在のバージョン(v2)のcheckboxLibでは、パラメータの省略をAppleScript側では行えます。JXAやその他のOSA言語では行えません。
パラメータを指定したくない、あるいは無指定時にはデフォルト値で処理してくれるのがベストです。逆に、省略を許容しないコマンドなんて悪夢です。
そこで、省略可能を指示する「optional」をsdefに書いてみました。
<command name="choose checkbox" code="LCCBCCKB" description="Display checkbox list with an alert dialog"> <parameter name="main message" type="text" code="CMMS" description="Main title of an alert dialog"/> <parameter name="sub message" type="text" optional="yes" code="CSMS" description="Sub title of an alert dialog"/> <parameter name="with columns" type="integer" optional="yes" code="CSCS" description="Column number of display checkbox"/> <parameter name="with titles" code="COLL" description="Titles of every checkbox"> <type type="text" list="yes"/> </parameter> <parameter name="checkbox type" type="checkbox types" optional="yes" code="COLC" description="checkbox type"/> <parameter name="return type" type="return types" optional="yes" code="COLR" description="return data type"/> </command>
これで、AppleScriptからでもJXAからでも(省略可能な)パラメータを省略できるようになりました。
コマンドのパラメータで「[」「]」で囲まれているのが省略可能なものです(左:AppleScript、右:JavaScript)
AppleScript名:check box sample 4_e |
— Created 2019-08-12 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.5" use scripting additions use checkLib : script "checkboxLib" set tList to {"Carrot", "Burdock", "Radish", "Apple", "Cabbage", "Lettuce", "Potato", "Garlic", "Komatsuna", "Bok choy", "Shiitake mushroom", "Hen of the Woods"} set cRes to choose checkbox main message "Select Vegetables" with titles tList |
JavaScript名:sample_jxa_5 |
// Created 2019-08-12 by Takaaki Naganoya // 2019 Piyomaru Software var app = Application.currentApplication() app.includeStandardAdditions = true var alib = Library("checkboxLib") var array = ["Carrot", "Burdock", "Radish", "Apple", "Cabbage", "Lettuce", "Potato", "Garlic", "komatsuna", "Bok choy", " Shiitake mushroom", "Hen of the Woods"] alib.chooseCheckbox( withTitles:array } ) |
checkboxで項目選択するありふれたScriptにsdefをつけてみる – AppleScriptの穴 says:
[…] こんなところでしょうか。パラメータのうち必須でないものの省略を許容するためには、sdefでoptionalの指定を行うことも必要です。 […]