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 をサポートしていません。
W3C の URIs, 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 でできる所ですが、少し手順が追加されます。
- # cd /usr/ports/japanese/w3m
- # make fetch extract patch
- # cd work/w3m-0.2.1
- # patch -p1 < ~/w3m-urn.diff
- # cp ~/urn.[ch] ./
- # cd ../..
- # make build && make install
単に、展開して FreeBSD 用の patch を当てた後で、URN サポート用 patch を当てて URN 対応用のコードをコピーし、カレントディレクトリを戻してから build、install だけです。
今後
…… ISBN とかは、何らかのデータベースに当たって、それが URL を返してくれたりしないと無理でしょう。とりあえず、オンラインで見つけられる物に関しては URL に置き換えていけるようにしていきます。
その前に、Mozilla への組み込みの方が必要かも。(^^;