プラグイン/ヘルパーアプリケーションがなくても文書の内容を確認できる方法2006年04月19日 14時21分17秒

totext

検索結果に PDF や Word 等の文書がある場合、ブラウザにプラグインやヘルパーアプリケーションがインストールされていないと、これらの中身を確認することができません。

しかし、nmzcat を利用することで、プラグインやヘルパーアプリケーションがインストールされていない場合であっても、テキストファイルとして中身を確認するぐらいはできます。

以下のCGIプログラムを /cgi-bin/totext.cgi として用意します。

 #!/usr/bin/perl
 
 use CGI;
 use Config;
 
 $ENV{'LANG'} = 'ja_JP.eucJP';
 my $tmpdir = "/tmp";
 if ($Config{osname} =~ /^(MS)?Win/) {
     $ENV{'PATH'} = "C:\\usr\\local\\bin;" . $ENV{'PATH'};
     $tmpdir = "$ENV{'TMP'}";
 } else {
     $ENV{'PATH'} = "/usr/local/bin:" . $ENV{'PATH'};
 }
 
 my $query = new CGI;
 my $uri = $query->param('uri');
 my $path = $uri;
 
 # Replace
 $path =~ s!^http://www.foo.bar.jp/!/usr/local/namazu/index/!s;
 
 system("/usr/local/bin/nmzcat \"$path\" > \"$tmpdir/$$.txt\"");
 
 my $cont;
 open(IN, "/tmp/$$.txt");
 while(my $line = <IN>) {
     $cont .= $line;
 }
 close(IN);
 
 unlink("/tmp/$$.txt");
 
 $cont =~ s/&/&/g;
 $cont =~ s/<//g;
 $cont =~ s/>//g;
 
 my @line = split(/\n/, $cont);
 
 my $flag = 0;
 my $body;
 foreach my $p (@line) {
     if ($flag == 1) {
         $body .= $p . "<br>\n";
     } elsif ($p =~ /^mimetype\s*: (.*)$/) {
         $mimetype = $1;
     } elsif ($p =~ /^author\s*: (.*)$/) {
         $author = $1;
     } elsif ($p =~ /^title\s*: (.*)$/) {
         $title = $1;
     } elsif ($p =~ /^content\s*:/) {
         $flag = 1;
     }
 }
 
 print <<EOF;
 Content-type: text/html; charset=EUC-JP
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
         "http://www.w3.org/TR/html4/strict.dtd">
 <html>
 <head>
 <title>$title</title>
 </head>
 <body>
 <table>
 <tr><td>mimetype:</td><td>$mimetype</td></tr>
 <tr><td>author:</td><td>$author</td></tr>
 <tr><td>title:</td><td>$title</td></tr>
 </table>
 <hr>
 $body
 <br>
 <hr>
 </body>
 </html>
 EOF

そして、NMZ.result.normal.ja を以下のように書き換えます。

 <dt>${namazu::counter}. 
 <strong><a href="/cgi-bin/link.cgiuri=${uri}">
 ${title}</a></strong> (アクセス数: ${accessrank})</dt>
 <dd><strong>著者</strong>: <em>${author}</em></dd>
 <dd><strong>日付</strong>: <em>${date}</em></dd>
 <dd>${summary}</dd>
 <dd><a href="/cgi-bin/link.cgi?uri=${uri}">${uri}</a>
  (${size} bytes)
 [<a href="/cgi-bin/totext.cgi?uri=${uri}&dummy=dummy">
 テキスト</a>]
 <br><br></dd>

検索結果の[テキスト] のリンクを開くと、文書の中身をみることができます。

なお、このCGIはセキュリティ対策を行っていませんので、このまま使用するのは危険です。ご注意ください。

UTF-8 に対応した分かち書きツール2006年04月19日 22時25分22秒

開発版の kakasi では UTF-8 の入出力が可能です。
しかし、内部で EUC-JP に変換して処理後、UTF-8 に再変換して出力するだけですので、EUC-JP に含まれない文字の処理はできません。
kakasi では3バイト文字に対応していませんので、JISX0212補助漢字(またはJISX0213 JIS第3/4水準漢字)には対応していません。

このため、Namazu の UTF-8 化に伴い、UTF-8 の分かち書きが可能なツールが欲しいものです。
Namazu の開発版には簡易分かち書き機能がありますので、これを発展させるか、あるいは kakasi の分かち書き機能を切り出して UTF-8 化を行うというのも良いかもしれません。

なお、ChaSen, MeCab は、辞書を UTF-8 で用意すれば UTF-8 で処理が可能ではあります。