[Namazu-users-ja 78] Re: filter のカスタマイズについて進捗&質問

Tadamasa Teranishi yw3t-trns @ asahi-net.or.jp
2004年 10月 6日 (水) 12:20:47 JST


寺西です。

まんぼう wrote:
> 
> <目的>
> ・Text対応で、独自のタグを処理するフィルタを作成する。

Text対応って何でしょう。

> <実施したこと>
> ・既存のフィルタ(bzip2.pl)を改造した。

よりによって何故 bzip2.pl ?
 
> <質問>
> ・既存のフィルタ(html.pl)を見るとnamazuから与えられる引数(field)の
>  ポインタとして{Author}があるみたいです。
>  独自のタグを定義(たとえば出典<authority > </authority >)したい場合、
>  どこに定義すればよいのでしょうか?

フィルタでは、$fields->{'authority'} に正規化したEUC-JPコードで値を
設定して、mknmzrc の $SEARCH_FIELD に authority を追加すれば
NMZ.field.authority が作成されるようになります。
そうすると、NMZ.result.normal.ja で ${authority} が使えるように
なります。

> ・既存のフィルタのsub filter($$$$)にある、カッコ({ } )はなんでしょうか?
>  通常、C言語等ではif文のようなコマンドと対応していると思うのですが、
>  単独で存在します。
>  これはnamazuではなく、perlの構文のような気がするのですが、
>  まだ、私が読んだ範囲では該当する記載がありません。

単なるスコープです。perl だけでなく、C言語でも使えます。
スコープ内で宣言した変数は、そのスコープ内しか有効でないので、
変数の有効範囲を限定する目的などで使用します。
 
気になるようなら、if (1) {} だとでも思えば良いでしょう。

> # フィルタ:必須
> sub filter ($$$$$) {
> # 引数を変数に代入
>      my ($orig_cfile, $cont, $weighted_str, $headings, $fields) = @_;
> 
> # テンポラリファイル名作成
> #   my $tmpfile = util::tmpnam('NMZ.paper');
> 
> #       コメント出力? どこへ?????
>      util::vprint("Processing Paper file ...\n");

mknmz を --verbose オプション付きで動かすと、出力されます。

> # このカッコはなに?
> #    {
> #
> 外部コマンドを実行し、その結果をテンポラリファイルへ出力する様にファイルオー
> プン
> #       my $fh = util::efopen("|$bzip2path -d > $tmpfile");
> #       print $fh $$cont;
> #    }
> # なぜ2度OPEN文がある?

bzip2 を呼び出して変換するのに open します。次に
bzip2 で変換された結果がファイルに落ちるので、そのファイルの
中身を読み込むため、2度目の open を行います。

# bzip2.pl を改造したのが混乱の元では?

>      html_filter($cont, $weighted_str, $fields, $headings);
> 
> # いろんなフィルタにあるけど、なにしているか分からない。
> #    gfilter::line_adjust_filter($cont);
> #    gfilter::line_adjust_filter($weighted_str);
> #    gfilter::white_space_adjust_filter($cont);
> #    gfilter::show_filter_debug_info($cont, $weighted_str,$fields, $headings);
> 
>      return undef;
> }

わからないなら、おまじないだとでも思って、これら gfilter の行は
すべて有効にしましょう。

> # 著者の抽出
> sub get_author ($$) {
>      my ($contref, $fields) = @_;
> 
>         if ($$contref =~
> m!<META\sNAME=([\"\'])AUTHOR\1\s[^>]*?CONTENT=\1(.*?)\1\s*>!i) { #"
>             $fields->{'author'} = $2;
>      } elsif ($$contref =~ m!.*<ADDRESS[^>]*>([^<]*?)</ADDRESS>!i) {
>         my $tmp = $1;
> 
>         if ($tmp =~ /\b([\w\.\-]+\@[\w\.\-]+(?:\.[\w\.\-]+)+)\b/) {
>             $fields->{'author'} = $1;
>         }
>      }
> }

<meta name="author" content="xxxx"> か、
<adress>xxxx</adress> を fields->{'author'} に設定しますが、
それはやりたいことなのでしょうか?
後者だけでよいのでは?
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




Namazu-users-ja メーリングリストの案内