Namazu-win32-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 一太郎 11 用 filter を作ってみたのですが
- From: ken_kojima@xxxxxxxxxxxxxxxxxx
- Date: Tue, 25 Sep 2001 10:11:45 +0900
- X-ml-name: namazu-win32-users-ja
- X-mail-count: 01019
小嶋@青森県です。
knokさんからご示唆をいただきました。ありがとうございます。
> filter 単独ならそれほど大きな量ではないでしょうから、この ML に投稿
>するのもありだと思います。ML アーカイブにも残りますし。
とのことですので、お言葉に甘えて、今回の投稿に乗せます(興味のある方は
文末をご覧下さい)。
---------------------------------------------------------------------
ここに納められた、jt.pl jt2.rb jt.batは、Namazu for Win32のindex作成に
あたり、一太郎11を利用して、マルチシート化した一太郎文書ファイルを
読み込ませるfilterです。
作成にあたっては、Namazu for Win32の2.0.6で動作をテストしています。
なお、perlのほかに、rubyおよびwin32oleが必要となるはずです。作者は、
ActiveRuby1.6.4.7で動作をテストしています。
また、このfilterを使った場合、誰もLoginしていない状態ではうまくindexが
作成されません。一太郎の呼び込みに失敗しているものと推測しています。
利用する場合は、jt.plは、(Namazuがインストールされたディレクトリを
<namazu>として)、<namazu>\share\namazu\filter\win32に、jt.batはどこか
適切な、pathの通ったディレクトリに、jt2.rbは、jt.batの中の記述でフルパスを
書くならば、どこでもいいと思いますので、どこか適当なディレクトリにおいて
下さい。
jt.plについては、Namazu 2.0.6に添付されていたtaro.plを
jt2.rbについては、Arton氏の「Rubyを256倍使うための本」にあるdocgrep.rbを
それぞれ参考にしています。
------------------------------------------------------------------------
jt.pl
#
# -*- Perl -*-
# $Id: jt.pl,v 1.0 2001/09/14 17:25:15 D.K.C $
#
package jt;
use strict;
use File::Copy;
require 'util.pl';
require 'gfilter.pl';
my $taroconvpath = undef;
sub mediatype() {
return qw(
application/x-js-taro
);
}
sub status() {
$taroconvpath = util::checkcmd('jt');
return 'yes' if defined $taroconvpath;
return 'no';
}
sub recursive() {
return 0;
}
sub pre_codeconv() {
return 0;
}
sub post_codeconv () {
return 0;
}
sub add_magic ($) {
my ($magic) = @_;
# Ichitaro 8, 9, 10, 11
$magic->addFileExts('\\.jt[dt]$', '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.jtd');
my $tmpfile3 = util::tmpnam('NMZ.sjis');
copy("$cfile","$tmpfile2");
system("$taroconvpath -s $tmpfile2 > $tmpfile3");
open (INPATH,"< $tmpfile3") || die "Can't open file :$!\n";
open (OUTPATH,"> $tmpfile") || die "Can't open file :$!\n";
while (my $sentence = <INPATH> ){
print OUTPATH codeconv::shiftjis_to_eucjp($sentence);
}
close(INPATH);
close(OUTPATH);
{
my $fh = util::efopen("< $tmpfile");
$$cont = util::readfile($fh);
}
getProperties($cfile,$fields);
unlink($tmpfile);
unlink($tmpfile2);
unlink($tmpfile3);
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;
}
sub getProperties($$) {
my ($cfile,$fields) = @_;
#Using jxw_ver11 to get Title,Author,date
use Win32::OLE;
my $jxw = Win32::OLE->new('JXW.Application');
$jxw->{WindowState} = 2;
my $i = 1;
my @DocProperty = ();
my $jdoc = $jxw->Application->TaroLibrary ;
$jdoc->OpenDocument($cfile);
my $DocInfo = Win32::OLE::Enum->new($jdoc->GetDocumentInformation());
for ($i=1;$i<=17;$i++){
my $unit = Win32::OLE::Enum->new($DocInfo->Next);
my ($key,$val) = $unit->All();
$DocProperty[$i][1] = $key;
$DocProperty[$i][2] = $val;
}
my $title = "";
$title = $DocProperty[6][2];
$title = $DocProperty[1][2] unless ($title == "");
$fields->{'title'} = codeconv::shiftjis_to_eucjp($title)
if (defined $title);
my $author = "";
$author = $DocProperty[8][2];
$author = $DocProperty[3][2] unless ($author == "");
$fields->{'author'} = codeconv::shiftjis_to_eucjp($author)
if (defined $author);
$jdoc->QuitDocumentWindow;
$jxw->Quit;
return undef;
}
1;
-----------------------------------------------------------------------
jt2.rb
require "win32ole"
require "getopts"
$KCODE="SJIS"
def usage
print "usage: ruby jt.rb [-s] <Ichitaro Document files..>\n"
end
unless getopts("s")
usage
exit(1)
end
jxw = WIN32OLE.new("JXW.Application")
jxw.WindowState = 2
if ARGV.size < 1
usage
exit(1)
end
ary=[]
sheetitem=[]
docinfo=[]
info=[]
for jtd in ARGV
begin
if $OPT_s == false
print "file: " + jtd + "\n"
end
jdoc = jxw.Application.TaroLibrary
jdoc.OpenDocument(File.expand_path(jtd))
if $OPT_s == false
i = 1
for info in jdoc.GetDocumentInformation()
val = ""
for a in info
val = a
end
docinfo[i] = val
i += 1
end
jtdtitle = docinfo[6]
jtdauthor = docinfo[8]
jtddate = docinfo[9]
print "title: " + jtdtitle + "\n"
print "author: " + jtdauthor + "\n"
print "Last Modified: " + jtddate + "\n"
end
maxsheetnum=jdoc.GetSheetCount
sheetcount=1
until sheetcount > maxsheetnum
jdoc.ChangeCurrentSheet(sheetcount)
i = 0
for item in jdoc.GetCurrentSheetItem
sheetitem[i] = item
i += 1
end
sheettype = sheetitem[0]
sheetname = sheetitem[1]
if sheettype == 10 then
if $OPT_s == false
print "sheet:"+ sheetname + "は一太郎文書ではありません。\n"
end
else
if $OPT_s == false
print "sheet:" + sheetname + "\n"
end
jdoc.JumpStart
until jdoc.OutOfDocument
jdoc.SelectRangeStart(3)
ary=jdoc.GetString
i=0
for a in ary
print a
end
print "\n"
jdoc.NextParagraph(1)
end
end
sheetcount += 1
end
jdoc.QuitDocumentWindow
jxw.Quit
end
end
------------------------------------------------------------------------
jt.bat(これは、皆さんの環境に合わせて適当に書き直してください)
@ruby jt2.rb %1 %2 %3 %4
------------------------------------------------------------------------
以上です。
長文?にて、失礼しました。
ken_kojima@xxxxxxxxxxxxxxxxxx
小嶋 健@青森県商工観光労働部資源エネルギー課
エネルギー担当
Tel 017-734-9735 (ダイヤルイン)