[Namazu-users-ja 77] filter のカスタマイズについて ( 進捗&質問 )

まんぼう dr_sunfish @ yahoo.co.jp
2004年 10月 6日 (水) 08:17:59 JST


西浦です。


先日は、お世話になりました。
2週間以上掛かりましたが
おかげさまで、ある程度独自のフィルタのひな形ができましたので
報告させて頂きます。(できたとこまで、下記に添付します)

また、同時にいくつか不明点があり、質問させて頂きます。
なにぶんにも、namazuのみならず、perlも同時進行で勉強していますので、
初歩的なことを伺うと思いますが、よろしくお願いします。



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

<実施したこと>
・既存のフィルタ(bzip2.pl)を改造した。
 ・独自のメディアタイプの登録
 ・ファイル認識情報の追加(add_magic)
・タグ対応の既存フィルタ(html.pl)から部分的にコード抽出
 ・get_authorを移植

上記により、独自フォーマットの定義、著者をメタタグから抽出できたました。


<質問>
・既存のフィルタ(html.pl)を見るとnamazuから与えられる引数(field)の
 ポインタとして{Author}があるみたいです。
 独自のタグを定義(たとえば出典<authority > </authority >)したい場合、
 どこに定義すればよいのでしょうか?
・既存のフィルタのsub filter($$$$)にある、カッコ({ } )はなんでしょうか?
 通常、C言語等ではif文のようなコマンドと対応していると思うのですが、
 単独で存在します。
 これはnamazuではなく、perlの構文のような気がするのですが、
 まだ、私が読んだ範囲では該当する記載がありません。

以上、お手数をおかけしますが、よろしくお願いします。




# bzip2.plの改造:必要最低限のサブルーチンで構成されている。
# ファイル名を元にpackage内のサブルーチンを呼び出しているため、
# ファイル名と同じ綴りのpackage 名をつける必要がある。
package paper;

# perlでは、新規変数名を用いると自動的にメモリ上に変数が自動生成される。
# 変数自動生成機能の破棄宣言である。
# 使用する変数は必ず「my 〜」と宣言が必要となる。
use strict;

# ライブラリファイルの読み込み
require 'util.pl';

# 変数宣言。
# undef:未定義状態にする。
# zcatコマンドへのパスを示す変数
# my $zcatpath = undef;

# 処理するファイルのメディア・タイプを返す。: 必須
# 新フォーマットであれば、既存の mimetype を設定せずにmediatype()に記載する。
# minetype?????
sub mediatype() {
#   return ('application/x-bzip2');
     return ('text/paper');  # 新フォーマットの定義
}

# 正しく処理できるか?:必須
# 通常はyesを返す。
sub status() {
#  ライブラリutil.plのサブルーチンcheckcmd呼び出し
#  checkcmd:コマンドパスの確認:コマンドがなければ未定義(undef)を返す
#    $zcatpath = util::checkcmd('zcat');
#    変数(zcatpath)が定義されてなければ no さもなくば yes
#    return 'no' unless (defined $zcatpath);
     return 'yes';
}

# フィルタの再帰呼び出しの有無:必須
# 通常は0、再帰呼び出しが有る場合は1
sub recursive() {
     return 0;
}


# filter以前に漢字コード変換実施の有無:必須
# 
EUCコードに変換;フィルタリングするテキストがEUC以外では、インデックスを作成 
できない。
# 行う場合は1
sub pre_codeconv() {
     return 1;
}

# filter後に漢字コード変換実施のa有無:必須
# 行わない場合は0
sub post_codeconv () {
     return 0;
}

# ファイル内容認識情報の追加:必須
sub add_magic ($) {
     my ($magic) = @_; # @_ : 引数、アレイ変数
# magic entryを指定:('何バイト目? string キーワード メディアタイプ')
     $magic->addMagicEntry('0 string paper text/paper');

     return;
}

# フィルタ:必須
sub filter ($$$$$) {
# 引数を変数に代入
     my ($orig_cfile, $cont, $weighted_str, $headings, $fields) = @_;

# テンポラリファイル名作成
#   my $tmpfile = util::tmpnam('NMZ.paper');

#	コメント出力? どこへ?????
     util::vprint("Processing Paper file ...\n");

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


# 以下、html.pl から抜粋
#
#  埋め込み除去の部分でしか使用していない。
#    my $cfile = defined $orig_cfile ? $$orig_cfile : '';

#    util::vprint("Processing html file ...\n");

#	ブラウザがロボットであるかを判断
#    if ($var::Opt{'robotexclude'}) {
#	my $err = isexcluded($cont);
#	return $err if $err;
#    }

# HTML 
埋め込み型のサーバ/クライアントサイド言語のプログラムロジック記述部分を、
# 検索対象や要約作成対象から外す。
#    if ($cfile =~ /($EMBEDDED_FILE)$/o) {
#       embedded_filter($cont);
#    }

     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;
}


# html処理専用フィルタ
sub html_filter ($$$$) {
# 引数を変数に代入
     my ($contref, $weighted_str, $fields, $headings) = @_;

#   読み込み対象のファイルを変更(html > paper)
     paper::get_author($contref, $fields);

}

# 著者の抽出
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;
	}
     }
}


# 「require」によってライブラリを読み込んだ場合のおまじない。
1;

__________________________________
for your loved one
http://pr.mail.yahoo.co.jp/pinkribbon/




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