あはは。るびま5号の増井さんのインタビューはやはりもどかしいらしい。
私はこの記事を読んで「これはオレに対する挑戦だな」と思ってましたよ。「よーしパパ想像力フル稼働しちゃうぞー」って感じ。でも結局「なんだかすごそう」くらいまでしか想像できませんでしたがorz
なんかとても楽しそうでよかったですよ。詳しいものは「どうせ発表してる内容なんだから」、どっか適当な Web に置いてさえあればそこへリンク張るだけで済んだのになと、少し残念に思いますがね。インタビューそのものではない、その中のソフトの動作を Web で分かりやすい形に起こすという作業は、なんかるびまの仕事とはちょっと違う気がするし。
http://pukiwiki.sourceforge.jp/?PukiWiki%2FNamazu
に上げたのですが、一応こっちにも貼っておきます。pukiwiki.pl をいじって、pukifile.pl として作成しました。合わせて mime type も text/pukifile にしときました。PukiWiki フォーマットのパースはとりあえず Namazu のデフォルトの重み付けの設定で有効になっているタグだけ見てます。それ以外は HTML にすらなりません。
[2005-11-11 追記]案の定というか pukiwiki.org の混乱後、添付ファイルがなくなってました。こっちにも貼っておいてよかった。あと、EUC のファイルしか考えてないので、PukiWiki を utf-8 で運用している場合は 検索結果の画面でページ名が化ける可能性があります。mknmz のプロセス自身を LANG=ja_JP.UTF-8 の環境で動かせばひょっとしてうまくいかねーかなとか思ったりもするんですが、自分では utf-8 での運用は一切していないのでよく分かりません。
スクリプトでの対応としては要するに pack のところをいじるってことになるはずです。$file と、そのファイルの中身のコードが一致するようにごにょってやれば ok のはず。
package pukifile;
use strict;
require 'html.pl';
sub mediatype() { return ('text/pukifile'); }
sub status() { return 'yes'; }
sub recursive() { return 0; }
sub pre_codeconv() { return 1; }
sub post_codeconv () { return 0; }
sub add_magic ($) { return; }
sub filter ($$$$$) {
my ($orig_cfile, $cont, $weighted_str, $headings, $fields) = @_;
my $cfile = defined $orig_cfile ? $$orig_cfile : '';
util::vprint("Processing pukiwiki file ...\n");
my ($path,$file,$ext) = $cfile =~ m#^(.*/)(.*)(\.txt)$#;
$file = pack("H*",$file);
$file =~ s/[\[\]]//g;
my( $title ) = $file;
$file =~ s/(\W)/'%'.unpack("H2",$1)/eg;
$fields->{'uri'} = "$path$file";
$$cont = "<h1>".$title."</h1>\n" . $$cont;
puki_filter( $cont );
html::html_filter( $cont, $weighted_str, $fields, $headings );
gfilter::line_adjust_filter($cont);
gfilter::line_adjust_filter($weighted_str);
gfilter::white_space_adjust_filter($cont);
$fields->{'title'} = $title;
return undef;
}
sub puki_filter(*) {
my( $cont ) = @_;
# 改行で配列に分割(gfilter のツールでは white space が落ちるからダメ)
$$cont =~ s/\r\n?/\n/g;
my( @body ) = split( /\n/, $$cont );
# PukiWiki フォーマットのつもりで簡易パース
my( $line );
foreach $line ( @body ) {
chomp( $line );
my( $level ) = 0;
# Heading
if ( $line =~ s/^(\*+)// ) {
$level = length( $1 ) + 1;
}
# comment
if ( $line =~ s/^\/\/// ) {
$line = "<!-- " . $line . " -->";
}
# anchor と emphasis
# aname プラグインはとりあえず無視
# uri として正しいかどうかもチェックしない
if ( $line !~ /^\s+/ ) {
$line =~ s/\[\[(.*)(?:\:|>)(.*)\]\]/<a href="$2">$1<\/a>/g;
$line =~ s/(''')(.*)(''')/<em>$2<\/em>/g;
$line =~ s/('')(.*)('')/<strong>$2<\/strong>/g;
}
if ( $level > 1 ) {
$line = '<h'.$level.'>'.$line.'</h'.$level.'>';
}
}
# <body> タグが現れるまで無視されるので <body></body> でサンド
$$cont = join( '', @body );
$$cont = "<body>\n" . $$cont;
$$cont = $$cont . "\n</body>\n";
}
1;