w3m には local CGI 機能があります。何と、httpサーバーなしで、CGIを実行してしまうというものです。例えば次のようなshellスクリプトを echo.sh という名前で作ります。
#!/bin/sh echo "Content-Type: text/plain" echo "" echo "QUERY_STRING=$QUERY_STRING"
CGIスクリプトは/cgi-bin/におく必要があります。/cgi-bin/ とは、URLが file:///cgi-bin/ となるディレクトリーです。~/cgi-bin/ と言うディレクトリーを作って、/bin-cgi/として使うためには、w3m のオプションメニューで ~/cgi-bin/ を、/cgi-bin/として登録する必要があります。具体的には w3m . として w3m を起動した状態で o キーをおしてオプションメニューを表示させ、「ディレクトリー設定」セクションの「/cgi-binであらわされるディレクトリー」に /home/username/cgi-bin を登録します。
$ cd ~/
$ mkdir cgi-bin
$ w3m .
この後、オプションメニューの「ディレクトリー設定」の 「/cgi-bin で表されるディレクトリー」に /usr/username(自分のユーザー名)/cgi-bin を登録します。
このような準備をしたら echo.sh を~/cgi-bin/にコピーします。
$ cp echo.sh ~/cgi-bin/
そうしておいて、w3mを使って
w3m 'file:///cgi-bin/echo.sh?hoge=1'とすると、QUERY_STRING=hoge=1 と表示されます。この機能を使うときはw3mのページから最新バージョン w3m-0.1.9.tar.gzをダウンロードしてコンパイルして使う必要があります。
local CGI の利用法としては、まずCGIのテストや練習に使うことが考えられます。フォームを作らなくとも上記の方法で、QUERY_STRINGをCGIプログラムに渡すことができます。また、自分のパソコンでまだ、Apacheを設定していない人でも、CGIを実験してみることができます。
もうひとつの使い方は、アプリケーションのインターフェースとして使うということです。w3mのいろいろな機能を自分のアプリケーションに取り入れることができます。次のスクリプトはその1例です。Vine Linux のJF、JMANの文書からキーワードで検索することができます。namazuを利用します。
まず、次の2つのファイルを用意します。QUERY_STRINGのデコードにはcgi-lib.pl version 1.14を利用しますので。ダウンロードしておく必要があります。
ファイル名:~/cgi-bin/nmz.html
<html> <head><title>w3m namazu</title></head> <body> <center><h1>namazu 検索ページ</h1></center> <p align="center"><form action="file:///cgi-bin/nmz.cgi" method=get> キーワード: <input type=text name=kword size=24><br><br> 先頭: <input type=text name=start value=0 size=3> 件数: <input type=text name=number value=10 size=3><br><br> <input type=submit><br> </form></p> </body> </html>
ファイル名;~/cgi-bin/nmz.cgi
#!/usr/bin/perl require "cgi-lib.pl"; &ReadParse; $keyword=$in{"kword"}; $w=$in{"start"}; $n=$in{"number"}; print &PrintHeader; print `namazu -w $w -n $n -h $keyword /usr/share/namazu/index/JF /usr/share/namazu/index/JMAN`; # nmz.cgi
上のスクリプトの print `namazu -h .../JMAN` の ` はバッククォートですから注意してください。
cgi-lib.pl、nmz.html、nmz.cgiは同じディレクトリー ~/cgi-bin/ に入れておきます。使用法はコマンドラインから w3m ~/cgi-bin/nmz.html と入力します。
$ w3m ~/cgi-bin/nmz.html
すると次のようなフォームの画面が現れます。
namazu 検索ページ キーワード: [ ] 先頭: [0 ] 件数: [10 ] [SUBMIT]
キーワード、先頭、件数のそれぞれのフィールドにカーソルを移動し、Enterキーを押すと、コンソールの最下行でデータの入力ができます。もちろん日本語も使えます。入力が終ったらEnterキーを押すと、入力したデータがそれぞれのフィールドに表示されます。最後に、[Submit]と書いてあるところにカーソルを移動してEnterキーを押すと検索結果が表示されます。
w3mを利用すると、このような短いスクリプトで色々なことができてしまいます。
w3mを自分のプログラムに利用するときのテクニックは、CGIのテクニックそのものです。これも cgi-lib.pl を利用すると非常に簡単です。CGIのプログラムで、サブルーチン &ReadParse を最初に呼び出すと、フォームのデータが %in ハッシュに格納されます。フィールドのデータは $変数名=$in{フィールド名} という式で簡単に取り出せます。出力は、標準出力にHTML形式のデータをはきだすだけです。
w3m の local CGI には、この他にも CGI スクリプトで w3m をコントロールすることができる機能もあります。この機能を使うと、w3mを利用したアプリケーションを作ることができます。詳しくは、w3m-0.1.4.tar.gzに含まれる doc-jp/MANUAL.html を参照してください。このホームページでもサンプルを紹介する予定です。
注: この記事を書いた当時は CGI.pm を敬遠していました。Perlの オブジェクト指向プログラムを使ってあるからです。しかし、このホームページのおまけで書いているように オブジェクト指向プログラムを Perl で使うのはそう難しいことではないようです。また、CGI.pm は Perl のコアと一緒に標準でインストールされているのですぐに使えます。上の nmz.cgi を CGI.pm を使って書くと次のようになります。
#!/usr/bin/perl use CGI; $query = CGI::new(); $keyword = $query->param("kword"); $w = $query->param("start"); $n = $query->param("number"); print $query->header(); print `namazu -w $w -n $n -h $keyword /usr/share/namazu/index/JF /usr/share/namazu/index/JMAN`; # nmz.cgi