Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

フィルタの優先順位設定 Re: tar.pl 作成



臼田です

Tadamasa Teranishi wrote:

> 欲を言えば、複数のフィルタを優先順位をつけて指定したいので、
> 
>   ('application/excel', 'xxxx.pl', 'excel.pl' .... 'XXXX.pl'),
>  ('application/ichitaro5', 'taro56.pl'),
> 
> といった指定ができると良いのですが、Perl でどうすれば良いのやら。

Perlなので適当なフォーマットを決めればどうとでもできそうです。
ただ、複雑な指定書式は避けたいです。

$USE_FILTERS = "
  application/excel xxxx.pl	# 優先順位 高   
  application/excel excel.pl	# 優先順位 中
  application/excel XXXX.pl	# 優先順位 低
  application/ichitaro5 taro56.pl
  application/ichitaro6 taro.pl
";

としてmknmzrcで指定するようにし

* 上の行に書いたものを優先的に使用、
* status が yes であれば以降同じ mimetype のものは読み込まない。
* status が no の場合は2行目以降を順にためしていく。
ということではどうでしょう。

配列のハッシュを作って読み込んで、

%use_filters = (
 'aplication/excel' => ['xxxx.pl','excel.pl','XXXX.pl'],
 'application/ichitaro5' => ['taro.pl','taro56.pl'],
 'application/ichitaro6' => ['taro.pl','taro56.pl']
);

となるようにしてみたdiffを添付しています。

添付のdiffではtaro5とtaro6で順番を変えてみて
doccatがある環境でtaro5とtaro6で違うフィルタが指定できる
のを確認しています。
(doccatはもっていないのでダミーのファイルを置いただけですが)


> こうなると、人間がエディタで編集するのではなくて、設定ツール等
> を用意した方が良いでしょうね。
設定ツールもいつかは欲しいですが、無くてよいぐらいシンプルな
状態に保っておきたいです。

> と書いてふと思ったのですが、上記のようにフィルタの優先順位を指定
> できるのなら、フィルタを単純なものにして、ツールごとにフィルタを
> 用意してしまうという手もあるかもしれません。
> Word なら doccat 用と wvWare 用というように。
>  
ばらばらにしたほうがメンテナンスはしやすいでしょうね。
使っているフィルタ名を見れば動いているツールもほぼ特定できるように
なりますし。

> > > あとは ALLOW_FILE との関係もうまく整理できるとうれしいです。
> ...
> > conf.plのALLOW_FILEには最小限のもののみ記述して残りは
> > フィルタが自分の処理できるファイルの拡張子を返すルーチンで
> > mknmzサブルーチンに渡してALLOW_FILEに追加するのかなと
> > 思っています。
> 
> これいいですね。
> 
これも少し考えてみます。

> 
> HEAD があまりに stable と近いので、いつまで経っても目新しい新機能
> が付かないので、この際互換性を捨てて飛躍したいものです。
> # 飛躍になるか改悪になるかは出来次第だが。
HEADをSTABLEの実験場にしているうちは離れにくいですね。
STABLEへすぐ入れるのが気になる実験も必要に応じてブランチを作ることにして
HEADは全く違うものに改造してしまいましょう。
UTF-8化、mknmzをオブジェクト指向型へ、フィルタの呼び出し方、
設定ファイルのフォーマットの変更といった点をはじめていけば
STABLEとの違いが目に見えてでてくると思っています。

> Namazu 2.0 系に終止符を打って、新しい Namazu の機能として考える
> のが良いのではないかと思います。

2.0.14はリリースできる形にまではしていきたいですが、
2.1もなんとかしたいです。


Index: pl/conf.pl.in
===================================================================
RCS file: /storage/cvsroot/namazu/pl/conf.pl.in,v
retrieving revision 1.46
diff -u -r1.46 conf.pl.in
--- pl/conf.pl.in	27 Apr 2004 15:19:56 -0000	1.46
+++ pl/conf.pl.in	7 May 2004 16:49:09 -0000
@@ -51,6 +51,45 @@
 #
 $DENY_FILE = ".*\\.(gif|png|jpg|jpeg)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*";
 
+$USE_FILTERS = "
+  text/html html.pl     # don't remove this line.
+  application/excel excel.pl    # This is a comment.
+  application/ichitaro5 taro56.pl
+  application/ichitaro5 taro.pl
+  application/ichitaro6 taro.pl
+  application/ichitaro6 taro56.pl
+  application/ichitaro7 taro7_10.pl
+  application/macbinary macbinary.pl
+  application/msword msword.pl
+  application/pdf pdf.pl
+  application/postscript postscript.pl
+  application/powerpoint powerpoint.pl
+  application/rtf rtf.pl
+  application/vnd.sun.xml.calc ooo.pl
+  application/vnd.sun.xml.draw ooo.pl
+  application/vnd.sun.xml.impress ooo.pl
+  application/vnd.sun.xml.writer ooo.pl
+  application/x-apache-cache apachecache.pl
+  application/x-bzip2 bzip2.pl
+  application/x-compress compress.pl
+  application/x-deb deb.pl
+  application/x-dvi dvi.pl
+  application/x-gzip gzip.pl
+  application/x-js-taro taro7_10.pl
+  application/x-rpm rpm.pl
+  application/x-tex tex.pl
+  audio/mpeg mp3.pl
+  message/news mailnews.pl
+  message/rfc822 mailnews.pl
+  text/hnf hnf.pl
+  text/html html.pl
+  text/html; x-type=mhonarc mhonarc.pl
+  text/plain; x-type=rfc rfc.pl
+  text/x-hdml hdml.pl
+  text/x-roff man.pl
+  x-test/x-test testfilter.pl # for tests/mknmz-12
+";
+
 #
 # This pattern specifies PATHNAMEs which will NOT be targeted.
 # NOTE: Usually specified by --exclude=regex option.
Index: scripts/mknmz.in
===================================================================
RCS file: /storage/cvsroot/namazu/scripts/mknmz.in,v
retrieving revision 1.138
diff -u -r1.138 mknmz.in
--- scripts/mknmz.in	1 May 2004 23:12:51 -0000	1.138
+++ scripts/mknmz.in	7 May 2004 16:49:10 -0000
@@ -423,34 +423,50 @@
 
 sub load_filters (@) {
     my @filters = @_;
-   
-    for my $filter (@filters) {
-	$filter =~ m!([-\w]+)\.pl$!;
-	my $module = $1;
-	require "$module.pl" || die "unable to require \"$module.pl\"\n";;
-	my (@mtypes, $status, $recursive, $pre_codeconv, $post_codeconv);
-
-	eval "\@mtypes =    ${module}::mediatype();";
-	die $@ if $@;  # eval error
-	eval "\$status =    ${module}::status();";
-	die $@ if $@;
-	eval "\$recursive = ${module}::recursive();";
-	die $@ if $@;
-	eval "\$pre_codeconv  = ${module}::pre_codeconv();";
-	die $@ if $@;
-	eval "\$post_codeconv  = ${module}::post_codeconv();";
-	die $@ if $@;
-	eval "${module}::add_magic(\$Magic);";
-	die $@ if $@;
+  
+    my %use_filters;
+    while ($conf::USE_FILTERS =~ /^\s+(\S+(;\s)*\S*)\s+(\S+)\s*(#.*)*$/gm){
+	$use_filters{$1}[$#{$use_filters{$1}} + 1] = "$FILTERDIR/$3";
+    };
 
-	for my $mt (@mtypes) {
-        next if (defined $var::Supported{$mt} && 
-                 $var::Supported{$mt} eq 'yes' && $status eq 'no');
-	    $var::Supported{$mt} = $status;
-	    $var::REQUIRE_ACTIONS{$mt} = $module;
-	    $var::RECURSIVE_ACTIONS{$mt} = $recursive;
-	    $var::REQUIRE_PRE_CODECONV{$mt} = $pre_codeconv;
-	    $var::REQUIRE_POST_CODECONV{$mt} = $post_codeconv;
+    my $mediatype;
+    foreach $mediatype (keys %use_filters){
+        my $filter;
+        foreach $filter (@{$use_filters{$mediatype}}){
+
+	    my $exists = grep {/$filter/} @filters;
+	    next if ($exists == 0);
+	    
+            $filter =~ m!([-\w]+)\.pl$!;
+            my $module = $1;
+            next if (defined $var::Supported{$mediatype} &&
+                     $var::Supported{$mediatype} eq 'yes');
+            require "$module.pl" || die "unable to require \"$module.pl\"\n";;
+            my (@mtypes, $status, $recursive, $pre_codeconv, $post_codeconv);
+
+            eval "\@mtypes =    ${module}::mediatype();";
+            die $@ if $@;  # eval error
+            eval "\$status =    ${module}::status();";
+            die $@ if $@;
+            eval "\$recursive = ${module}::recursive();";
+            die $@ if $@;
+            eval "\$pre_codeconv  = ${module}::pre_codeconv();";
+            die $@ if $@;
+            eval "\$post_codeconv  = ${module}::post_codeconv();";
+            die $@ if $@;
+            eval "${module}::add_magic(\$Magic);";
+            die $@ if $@;
+
+	    $exists = grep {/$mediatype/} @mtypes;
+	    next if ($exists == 0);
+
+	    next if (defined $var::Supported{$mediatype} &&
+		    $var::Supported{$mediatype} eq 'yes' && $status eq 'no');
+	    $var::Supported{$mediatype} = $status;
+	    $var::REQUIRE_ACTIONS{$mediatype} = $module;
+	    $var::RECURSIVE_ACTIONS{$mediatype} = $recursive;
+	    $var::REQUIRE_PRE_CODECONV{$mediatype} = $pre_codeconv;
+	    $var::REQUIRE_POST_CODECONV{$mediatype} = $post_codeconv;
 	}
     }
 }
@@ -2660,6 +2676,7 @@
      $var::RECURSIVE_ACTIONS, $conf::META_TAGS, $var::USE_NKF_MODULE,
      $conf::ADDRESS, $var::MAILING_ADDRESS,
      $conf::FILE_SIZE_MAX,
+     $conf::USE_FILTERS,
      $var::SupportedScheme, $var::RECURSIVE_SCHEME,
      $var::SupportedArchive, $var::RECURSIVE_ARCHIVE,
      );

臼田幸生