zip 拡張機能
フィルタで利用する zip ファイル処理をまとめて、pl/ に追い出すためにプログラムを書き換えてみました。
zip ファイル処理は必要なツール、 モジュールがインストールされている場合にのみ使用可能な機能なので、 拡張機能という位置付けで考えています。
zip 拡張機能では、従来の unzip コマンドの代わりに Archive::Zip が利用できます。 また、Archive::Zip に加えて IO::String が利用できる環境ではテンポラリファイルを作成しないことで、 これらの処理がより高速に行えるようになります。
pl/extzip.pl は、filter/ooo.pl, filter/koffice.pl, filter/xpl.pl 等から利用することができます。
残念ながら、filter/zip.pl はこれらに比べて処理が複雑になるうえ、 他のフィルタと共通部分が少ないので、利用対象からは外しています。
[利用方法]
require 'ext.pl'; require 'extzip.pl'; sub status() { if (ext::issupport('EXT_ZIP') eq 'yes') { return 'yes'; } return 'no'; }
フィルタの status() で EXT_ZIP 拡張機能が利用可能かどうかをチェックします。 チェックは最初に呼び出した時のみ行われるため、 複数のフィルタから呼び出されても1回のみチェックが行われます。 チェック時に、利用可能なツール、モジュールより判断し、 以後呼び出される zip 処理サブルーチンをセットします。
zip ファイル内の特定のファイルの中身を取り出すには次のように呼びだします。 (この例ではファイルがテキスト形式の場合)
my $err = $extzip::zip_read->($contref, $metafile, \$xml); return $err if (defined $err); codeconv::normalize_nl(\$xml);
また、zip ファイル内のファイルをパタンーンマッチングで取り出すには、 次のように呼び出します。
my $err = $extzip::zip_membersMatching->($zipref, $pattern, $embeddingsref);
このモジュールにより、各フィルタの処理が共通化でき、 フィルタ間の差を吸収できます。 また、共通化部分を pl/ に追い出すことでフィルタが簡素化できます。
なお、フィルタの UTF-8 処理についても同様に拡張機能として、 今後フィルタから追い出すことを考えています。
pl/ext.pl, pl/extzip.pl をコミットしました。 (HEAD, development-2-1, stable-2-0)
フィルタで require を行うのではなく、mknmz.in 等から require する ように変更しました。 これに伴い namazu.spec.in を書き換えています。
pltests/env.pl.in には pl/extzip.pl で対応している IO::String 等のバージョン表示を追加しました。
これを使うフィルタの方はまだコミットできていませんが、 下準備として 一部フィルタの書き換えを行っています。
セコメントをする