XHTML (applicatin/xhtml+xml) にアクセスできるようにする

w3m は XHTML の場合も HTML として解釈し、それなりにレンダリングすることができます。わからないならわからないなりに、適当に解釈してくれますので (ぉ application/xhtml+xml の文書を返されても、まぁ、普通にレンダリングしてくれた方が嬉しいように思います。

しかし、w3m は application/xhtml+xml の MIME タイプを知りませんので、アクセスするとローカルホスト上の保存先を聞かれてしまいます。

ということで、わかってくれるようにざっくり書いてみました。

なお、真っ当な WWW サーバの場合には、HTTP 要求ヘッダの Accept フィールドを見ますので、オプション設定の Accept: に text/html の前後辺りに application/xhtml+xml を追加してください。そうしないとアクセスできないリソースだとして 406 を出されたりします。

なお、諸般の事情 (謎) により、前項の User-Agent フィールド用の項目 patch も含まれています。

また、w3m 0.4.1 + m17n 版ですが、素の w3m 0.4.1 にも当たるようになっています。

以前、0.3.2.2 用に作成した patch では、applicatoin/xhtml+xml なリソースが Content-Encoding: gzip など、圧縮されている場合にはダウンロードになってしまっていましたが、今回の patch では、それを修正してあります。

利用するには w3m-0.4.1-version-xhtml.patch を w3m-m17n のディレクトリで w3m-m17n のソースに適用し、build し直してください。

FreeBSD ports を利用する場合は、w3m-0.4.1-version-xhtml.tar.gz を www/w3m/files の下に展開してから、任意の w3m ファミリを入れ直してください。例えば、japanese/w3m-img で make M17N=yes install、などです。

User-Agent 名を弄る

w3m は、標準では HTTP 要求ヘッダに User-Agent: w3m/0.3.2.2 などしか出さず、w3m を利用しているユーザがどの様なプラットフォームを利用しているかということがわかりません。

これはこれで安全側に倒れている、という見方もできますが、やはりこれはちょっと寂しい、と思う人もいます。私とか。;)

w3m はオプション設定で User-Agent で何を出力するかを決められますが、これはこれで、バージョンを上げたときなどには追従されません。CVS 版を追い掛けたり、~/.w3m などをそのままコピーしたときに寂しいことになったりします。

となれば、自動的に出て欲しい、と思うのが人情ですので、出るようにしてみました。基本は従来通りですが、一部マクロを追加することで実装してみました。

置き換えられるマクロ文字列は以下の通りです。

%v

w3m のバージョンを出力する。

%V

プラットフォーム名とバージョン、アーキテクチャ名を出力する。

従って指定なしの場合 (w3m 標準) と同じ状態の指定は %v だけを記述した状態となります。

%v (%V) と記述すると、一般的な UA が出力する形式になります。例えば、現在この文書を記述している時点で手元の w3m-m17n で出力されるのは w3m/0.3.2.2+cvs-1.645-m17n-20021222 (FreeBSD 5.0-CURRENT i386) となります。

利用するには w3m-version.patch を w3m のディレクトリで w3m のソースに適用し、build し直してください。

URN サポート化 w3m

坂本 浩則さんの手により、local-CGI を利用したバージョンが利用できますので、私も Perl で書く方が楽なので :-) こちらのコンテンツは更新しません。

Perl による URN リダイレクタを作りますので、そちらをご覧ください。

a 要素の href 属性などには、URI を指定することができます。URI は URL と URN を指し、現状の WWW ブラウザは通常、URL のみをサポートしています。テキストベースの WWW ブラウザとして、非常に広く使われている w3m も例外に漏れず、URN をサポートしていません。

W3CURIs, URLs, and URNs: Clarifications and Recommendations 1.0 が出たので、URI について書いたときに、URN を大量に埋め込んだら、リンクを辿れなくて悲しい思いをした為、とりあえず URN の中から urn:ietf:rfc:* のみサポートさせるコードを書いてみました。

アンカー配置

解析されたアンカーは、anchor.c 内の putAnchor() 内で内部のアンカー用リストに保存される様なので、ここで URL へのポインタをコピーするところで、URN だった場合には URL へコンバートする convertURN() を呼び出すことにしました。

URN から URL への変換

URN の NID を見て、NID を格納している配列と比較し、名前空間毎のサブルーチンへ分岐させます。

名前空間毎のサブルーチンは、現状 IETF 用のみが用意されています。urn.c として独立させてあるので、名前空間が増えても他のコードを触る必要はありません。また、外部からは convertURN() のみが見えていれば良いので、これだけが extern されています。

convertURN_ietf() 内では、urn:ietf: より下の部分から NSS を取得し、NSS 毎の処理へ分岐します。現状は rfc-nss のみを見ています。

ここまでで変換できなかった URN についてはそのまま返します。URL に置き換えられないため、恐らくは参照できません。

FreeBSD の場合

FreeBSD の ports システムを利用してインストールしている場合、通常 make && make install でできる所ですが、少し手順が追加されます。

  1. # cd /usr/ports/japanese/w3m
  2. # make fetch extract patch
  3. # cd work/w3m-0.2.1
  4. # patch -p1 < ~/w3m-urn.diff
  5. # cp ~/urn.[ch] ./
  6. # cd ../..
  7. # make build && make install

単に、展開して FreeBSD 用の patch を当てた後で、URN サポート用 patch を当てて URN 対応用のコードをコピーし、カレントディレクトリを戻してから build、install だけです。

今後

…… ISBN とかは、何らかのデータベースに当たって、それが URL を返してくれたりしないと無理でしょう。とりあえず、オンラインで見つけられる物に関しては URL に置き換えていけるようにしていきます。

その前に、Mozilla への組み込みの方が必要かも。(^^;