Namazu-devel-ja(旧)


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

Re: Office系フィルタでwvSummary を利用してみては? (Re:macbinary.pl)



寺西です。

Tadamasa Teranishi wrote:
> 
> word7 形式のファイルを wvWare で処理すると、3つの漢字コード(?)が
> 混在する HTML ファイルが出力されます。
...
> wvWare の古いバージョンは無視するとして、だいたい 0.7 以上なら
> --charset をサポートしているはずなので、--charset=sjis で
> ShiftJIS 出力にして 2,3 の漢字コードを統一し、TITEL 文字を
> 削除するという処理を word7 形式に対して行えば、良いように思います。

日本語版 word7 形式の場合は、上記の処理を加えるようにしました。
日本語版 word7 形式を処理するには wvWare 0.7 以上が必須になります。
最後に HEAD 用の差分をしめします。
 
# wvSummary がパス上になくても動作はします。

> > excelやpowerpointをインデックスしなければいけない人はmswordの
> > インデックスも作る人でしょうからwvSummaryが使えるようになっている
> > 可能性は高いだろうと思います。

wvSummary で情報を取り出す部分にバグがあったので、修正しました。
主な修正内容は以下の通りです。
・Codepage を考慮しておらず、UTF-8 の場合、文字化けを起こして
 いました。(このため utf8_to_eucjp() を作成。やや強引ですが)
・html::html_filter() で、title が上書きされるバグを修正しました。
・author が上書きされるバグを修正しました。
・last author を author より優先するようにしました。

$ cvs diff msword.pl
Index: msword.pl
===================================================================
RCS file: /storage/cvsroot/namazu/filter/msword.pl,v
retrieving revision 1.37
diff -r1.37 msword.pl
36a37
> my $wvsummarypath = undef;
42a44,45
>     $wvsummarypath = util::checkcmd('wvSummary');
> 
96a100
>     my $docversion = "unknown";
106c110,114
<     # Check version of word document (greater than word8 or else).
---
>     # get summary info in all OLE documents.
>     getSummaryInfo($tmpfile, $cont, $weighted_str, $headings, $fields);
>     my $title = $fields->{'title'};
> 
>     # Check version of word document (greater than word7,8 or else).
108d115
< 	my $docversion = "unknown";
115,116c122,123
< 	    # Only word8 format is supported for Japanese.
< 	    $supported = 1 if ($docversion =~ /^word8$/);
---
> 	    # Only word7,8 format is supported for Japanese.
> 	    $supported = 1 if ($docversion =~ /^word[78]$/);
132a140,142
>             if (util::islang("ja") && $docversion =~ /^word7$/) {
>                 @wordconvopts = ("--targetdir=$tpath", "--charset=sjis");
>             }
133a144,148
>             if (util::islang("ja")) {
> 	        return _("Unsupported format: ") .  $docversion
>                     if ($docversion =~ /^word7$/);
>             }
> 
149c164,169
< 	my @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile2);
---
> 	my @cmd;
>         if ($docversion =~ /^word7$/) {
> 	    @cmd = ($utfconvpath, "-Isj", "-Oej", $tmpfile2);
> 	} else {
> 	    @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile2);
> 	}
164a185,188
>     # word7 : Title shoud be removed.
>     $$cont =~ s!<TITLE>.*?</TITLE>!!is
>         if (util::islang("ja") && $docversion =~ /^word7$/); 
> 
168a193
>     $fields->{'title'} = $title if (defined $title);
212a238,348
> 
>     return undef;
> }
> 
> sub getSummaryInfo ($$$$$) {
>     my ($cfile, $cont, $weighted_str, $headings, $fields)
> 	= @_;
> 
>     return undef unless (defined $wvsummarypath);
> 
>     my @cmd = ($wvsummarypath, $cfile);
>     my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
>     my $summary = util::readfile($fh_out);
>     my $orgsummary = $summary;
> 
>     my $size = util::filesize($fh_out);
>     $fh_out->close();
>     if ($size == 0) {
>         return undef;
>     }
>     if ($size > $conf::TEXT_SIZE_MAX) {
>         return 'Too large word file';
>     }
> 
>     # Codepage
>     #   932 : 0x000003a4 : Shift_JIS
>     # 10001 : 0xfffffde9 : x-mac-japanese
>     # 65001 : 0x00002711 : UTF-8
> 
>     my $codepage = "000003a4"; # Shift_JIS
>     my $title = undef;
>     my $subject = undef;
>     my $lastauthor = undef;
>     my $author = undef;
>     my $keywords = undef;
> 
>     if ($summary =~ /^Codepage is 0x([0-9a-f]*)/m) {
>         $codepage = sprintf("%8.8x", hex($1));
>     }
> 
>     if ($codepage eq "fffffde9") { 
>         utf8_to_eucjp(\$summary);
>     }
>     else {
>         codeconv::toeuc(\$summary);
>     }
> 
>     if ($summary =~ /^The title is (.*)$/m) {
>         my $orgtitle;
> 
>         $title = $1;
> 
>         # PowerPoint Only
> #        $orgsummary =~ /^The title is (.*)$/m;
> #        $orgtitle = $1;
> #        undef $title if $orgtitle eq # which has no slide title
> #            "\xbd\xd7\xb2\xc4\xde\x20\xc0\xb2\xc4\xd9\x82\xc8\x82\xb5";
>     }
>     if ($summary =~ /^The subject is (.*)$/m) {
>         $subject = $1;
>     }
>     if ($summary =~ /^The last author was (.*)$/m) {
>         $lastauthor = $1;
>     }
>     if ($summary =~ /^The author is (.*)$/m) {
>         $author = $1;
>     }
>     if ($summary =~ /^The keywords are (.*)$/m) {
>         $keywords = $1;
>     }
> 
>     my $weight = $conf::Weight{'html'}->{'title'};
>     if (defined $title) {
>         $$weighted_str .= "\x7f$weight\x7f$title\x7f/$weight\x7f\n";
>     }
>     if (defined $subject) {
>         $$weighted_str .= "\x7f$weight\x7f$subject\x7f/$weight\x7f\n";
>     }
> 
>     $fields->{'title'} = $title;
>     $fields->{'title'} = $subject unless (defined $title);
> 
>     $fields->{'author'} = $lastauthor;
>     $fields->{'author'} = $author unless (defined $lastauthor);
> 
>     if (defined $keywords) {
>         $weight = $conf::Weight{'metakey'};
>         $$weighted_str .= "\x7f$weight\x7f$keywords\x7f/$weight\x7f\n";
>     }
> 
>     return undef;
> }
> 
> sub utf8_to_eucjp($) {
>     my ($cont) = @_;
> 
>     return undef unless (defined $utfconvpath);
>     return undef unless (util::islang("ja"));
> 
>     my $tmpfile  = util::tmpnam('NMZ.tmp.utf8');
>     { 
> 	my $fh = util::efopen("> $tmpfile");
> 	print $fh $$cont;
>     }
> 
>     my @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile);
>     my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
>     $$cont = util::readfile($fh_out);
>     codeconv::normalize_eucjp($cont);
> 
>     unlink $tmpfile;
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E