Guile アプレット仕様

Cygnus Support, February 28, 1996
(Gordon Irlam, gordoni@cygnus.com)

この文書では、SurfIt! デモ ブラウザ用の Guile アプレット作成のための仕 様を説明する。

HTML のアプレット拡張

Guile の Scheme アプレットは、mime タイプ application/guile で示される。これは、ファイル拡張子 .scm に対するデフォルトのタイプである。

アプレットは HTML 文書の中でインライン実行できる。

<a href="applet.scm" rel=embed>
fallback_html
</a>
アプレット applet.scm がロードされ、ページに挿入され、最 初にこのタグを含む文書がロードされた時点で実行される。 Guile アプレットをサポートしないブラウザでは、 fallback_html が表示される。

ハイパーリンクをたどることでもアプレットを起動できる。

<a href="applet.scm"
fallback_html
</a>
ハイパーリンクが選択されると、アプレット applet.scm がロー ドされて実行される。アプレットから明示的に要求する場合に限り、元の文書 がクリアされる。 Guile アプレットをサポートしないブラウザでは、 fallback_html が表示される。

アプレットの要件

アプレットは、よく形成された構文を持つ Guile Scheme プログラムであることが要求される。 アプレットが起動されると、対応する Guile プログラムが取得され、ロードされ、そして 実行される。

アプレットは必ずアプレット ライブラリを含む必要がある。

(require 'applet)
アプレット ライブラリを Guile アプリケーションに組み込むこと。 これはその他のすべてのアプレットコマンドの前提条件として必要である。

アプレットは必ず、ブラウザがそのアプレットの実行を終了する時にブラウザ によって呼び出されるルーチンを定義する必要がある。

(define-applet-terminate routine)
routine は、アプレットの実行終了が要求された時にブラウザ が起動するルーチンの名前である。アプレットが表示された状態である場合、 このルーチンはそのアプレットを表示している Tk キャンバスを削除(destroy)して から終了する必要がある。

アプレットは、(ページ上に表示されることで外部的に、またはScheme 環境 中で内部的に)アクセス可能である限り存在し続きる。

Applet API

すべてのアプレットは同じ一つのトップレベル環境に存在する。これにより、 複数のアプレットで状態を共有でき、またその状態はアプレット起動中を通じ て永続性を持つ。

アプレットは通常の Guile Scheme プログラムおよび gtcl/gtk Guile 拡張の すべての機能を使用できる。gtk の機能を使って、Guile アプレットは親文書 の中で自分自身を対話的に表示することができる。

注意: Guile は名前空間の制御を提供しており、またアプレットが実行可能な 安全(secure)な環境を提供するためにはこれが必要だが、Guile のデモ ブラ ウザである SurfIt! についてはこれは実装されていない。Guile のデモ ブラ ウザである SurfIt! の主目的は研究用プロトタイプであって、製品レベルの web ブラウザではない。

browser-window-name
(browser-window args)
browser-window-name はブラウザ ウィンドウである Tk ウィン ドウ名を含む文字列である。 browser-window は、ウィンドウ コマンドの送信先のTcl プロシージャ(proc)に対応する。
applet-window-name
(applet-window args)
applet-window-name はアプレットのコンテナとして使用できる フレームのTk ウィンドウ名を含む文字列である。 applet-window ウィンドウ コマンドの送信先のTcl プロシージャ (proc)に対応する。アプレットを表示可能にする場合、このフレームをブラウ ザウィンドウに挿入しなければならない。
applet-embedindex
applet-embedindex はアプレットのアンカーのブラウザ ウィン ドウ中のオフセットを含む文字列である。通常これを用いるのは、ブラウザ ウィンドウ中の元の HTML と同じ位置にアプレットを挿入する場合である。
(browser-window 'window 'create applet-embedindex
:window applet-window-name)
.
(applet-newpage)
このルーチンは、ブラウザ ウィンドウの現在の内容をクリアする。
(applet-parsehtml html)
このルーチンは、 html で指定される HTML を解析し、その結 果をブラウザ ウィンドウの末尾に表示する。
(applet-loadurl url)
このルーチンは、URL url で指定され、HTTP の GET リクエストで 取得されるオブジェクトの内容の、アプレット ウィンドウ中へのロードと レンダリングを開始する。 このルーチンは (applet-loaddata url applet-parsehtml) と 同じである。
(applet-loaddata url callback)
このルーチンは、HTTP の GET リクエストを用いて URL url で 指定されるオブジェクトの内容のロードを開始し、ただちに戻りを行う。 後にオブジェクトがすべてロードされた時点で、要求されたオブジェクトの データを含む文字列result を伴って (callback result) が非同期的に呼び出される。
(applet-posturl url datavar postdata)
このルーチンは、HTTP の POST リクエストを用いて postdata を URL url にポストした結果のアプレット ウィンドウ中への ロードとレンダリングを開始する。datavar は、途中経過を 蓄積しておくための Tcl のグローバル変数の名前として使用する文字列である。 postdata は、((name1, value1), (name2, value2), ...) なる形式の連想リストでなければならない。この連想リストは、 フィールド名を表すエンコードされていない文字列から、 そのフィールド名に対応するデータの値を表すエンコードされていない文字列 へのマッピングである。このルーチンは、 (applet-postdata url datavar postdata applet-parsehtml) と 同じである。
(applet-postdata url datavar callback postdata)
このルーチンは、HTTP の POST リクエストを用いて postdata の URL url へのポストを開始し、ただちに戻りを行う。 後に、結果の戻り値が完全にロードされた時点で、結果のデータを含む文字列 result を伴って (callback result) が非同期的 に呼び出される。datavar は、途中経過を蓄積しておくための Tcl のグローバル変数の名前として使用する文字列である。 postdata は、((name1, value1), (name2, value2), ...) なる形式の連想リストでなければならない。この連想リストは、 フィールド名を表すエンコードされていない文字列から、そのフィールド名に 対応するデータの値を表すエンコードされていない文字列へのマッピングである。

アプレットの動作

アプレットは CPU を占有してはならない。そうではなくて、Tk イベント ハ ンドラが処理を継続でき、またユーザがブラウザとのやりとりを継続できるよ うに、コールバックやイベントループのポーリングといったスタイルを用いて 作成しなければならない。

ブラウザの動作

アプレット中で発生する catch されない実行時エラーは、そのアプレットを 終了させるが、ブラウザは機能しつづける。