Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 一太郎(5〜10)用のフィルタ
臼田です
doccat不要、一太郎やWordのOLE呼び出し不要というfilterが
数年前に欲しかったのを思い出しつつ作業をしています。
そもそもニーズがどれほどあるのかわからないことと、
動けばよいという姿勢で書いているソースでもありお恥ずかしいの
ですが、使用できるレベルになったらNamazuProjectに寄贈したいと
思っております。
その際には、なにか手続きが要りますでしょうか。
少々修正をしてみましたので、再度送付しておきます。
・ファイルの作成者名らしきデータ領域を見つけたのでAuthorを
出力できるようにしてみました。
・ターゲットとなるファイルを変数に読み込んでfilter呼び出し時
に渡されていることに気づいたためファイルの読み込みを減らし
ました。
添付している一太郎7〜10のフィルタには
UTF-16をEUCに変換するプログラムとして下記のサイトのunicode.pl
を使わせて頂いているため、こちらも必要になります。
http://www.onicos.com/staff/iz/release/
UTF-16からEUCに変換する他の良い方法をご存知のかたお教えください。
臼田幸生
---------------------------------------------------------------
taro7_10.pl
package taro7_10;
use strict;
use File::Copy;
require 'util.pl';
require 'gfilter.pl';
require 'unicode.pl';
sub mediatype() {
return ('application/x-js-taro');
}
sub status() {
my $unicodepath = util::checklib('unicode.pl');
return 'yes' if defined $unicodepath;
return 'no';
}
sub recursive() {
return 0;
}
sub pre_codeconv() {
return 0;
}
sub post_codeconv () {
return 0;
}
sub add_magic ($) {
my ($magic) = @_;
$magic->addFileExts('(?i)\\.jtd', 'application/x-js-taro');
$magic->addFileExts('(?i)\\.jfw', 'application/x-js-taro');
return;
}
sub filter ($$$$$) {
my ($orig_cfile, $cont, $weighted_str, $headings, $fields)
= @_;
my $cfile = defined $orig_cfile ? $$orig_cfile : '';
my $tmpfile = util::tmpnam('NMZ.taro');
my $tmpfile2 = util::tmpnam('NMZ.taro2');
open(OUT, "> $tmpfile2");
binmode(OUT);
my @data = unpack("C*", $$cont);
my $i = 0;
while ( $i <= $#data) {
if (pack("C", $data[$i]) eq "T") {
my $matchdata = "";
my $j = $i;
while ( $j <= ($i + 7)) {
$matchdata .= pack("C", $data[$j]);
$j++;
}
if ( $matchdata eq "TextV.01"){
my $textsizep = pack("C4", $data[$i+8], $data[$i+9],
$data[$i+10], $data[$i+11]);
my $textsize = unpack("N", $textsizep);
my $k = 1;
while ( $k <= ($textsize * 2)) {
print OUT pack("C", $data[$i + 11 + $k]);
$k++;
}
print OUT pack("n", 10);
$i = $j + $k;
}
}elsif (pack("C", $data[$i]) eq "\x04") {
my $matchdata = "";
my $j = $i;
while ( $j <= ($i + 9)) {
$matchdata .= pack("C", $data[$j]);
$j++;
}
if ( $matchdata eq pack("H20", "040000315c4f10620580")){
my $textsize = $data[$i+80] - 2;
my $k = 1;
my $authorname;
while ( $k <= ($textsize)) {
$authorname .= pack("C", $data[$i + 95 + $k]);
$k++;
}
my @unicodeList = unpack("v*", $authorname);
$authorname = &unicode::u2e(@unicodeList);
$authorname =~ s/\x00//g;
$fields->{'author'} = $authorname;
}
}
$i++;
}
close(OUT);
my $buf;
my ($dev, $ino, $mode, $nlink, $uid, $gid,
$rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks)
= stat("$tmpfile2");
open(IN, "$tmpfile2");
binmode(IN);
read(IN, $buf, $size);
close(IN);
my @unicodeList = unpack("n*", $buf);
my $eucString = &unicode::u2e(@unicodeList);
open(OUT, "> $tmpfile");
binmode(OUT);
$i =0;
while ( $i < length($eucString)) {
my $code1 = unpack("C",substr($eucString, $i, 1));
my $code2 = unpack("C",substr($eucString, $i+1, 1));
my $code = "";
if (($code1 == hex("00")) and ($code2 >= hex("20"))
and ($code2 <= hex("7f"))) {
$code = pack("C", $code2);
$i++;
}
if (($code1 == hex("00")) and ($code2 == hex("0a"))) {
$code = pack("C", $code2);
$i++;
}
if (($code1 >= hex("a1")) and ($code1 <= hex("a8"))
and ($code2 > hex("a0")) and ($code2 < hex("ff"))) {
$code = pack("CC", $code1, $code2);
$i++;
}
if (($code1 >= hex("b0")) and ($code1 <= hex("f4"))
and ($code2 > hex("a0")) and ($code2 < hex("ff"))) {
$code = pack("CC", $code1, $code2);
$i++;
}
$i++;
print OUT $code;
}
close(OUT);
{
my $fh = util::efopen("< $tmpfile");
$$cont = util::readfile($fh);
}
unlink($tmpfile);
unlink($tmpfile2);
gfilter::line_adjust_filter($cont);
gfilter::line_adjust_filter($weighted_str);
gfilter::white_space_adjust_filter($cont);
$fields->{'title'} = gfilter::filename_to_title($cfile, $weighted_str)
unless $fields->{'title'};
gfilter::show_filter_debug_info($cont, $weighted_str,
$fields, $headings);
return undef;
}
1;