w3m の local CGI 機能

w3m の local CGI

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 の応用

local CGI の利用法としては、まずCGIのテストや練習に使うことが考えられます。フォームを作らなくとも上記の方法で、QUERY_STRINGをCGIプログラムに渡すことができます。また、自分のパソコンでまだ、Apacheを設定していない人でも、CGIを実験してみることができます。

もうひとつの使い方は、アプリケーションのインターフェースとして使うということです。w3mのいろいろな機能を自分のアプリケーションに取り入れることができます。次のスクリプトはその1例です。Vine Linux のJF、JMANの文書からキーワードで検索することができます。namazuを利用します。

まず、次の2つのファイルを用意します。QUERY_STRINGのデコードにはcgi-lib.pl version 1.14を利用しますので。ダウンロードしておく必要があります。

Vine LinuxのJFとJMANを検索するためのフォーム

ファイル名:~/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>

Vine LinuxのJFとJMANを検索するためのCGIスクリプト

ファイル名;~/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