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;