Namazu-win32-users-ja(旧)


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

Re: 一太郎 11 用 filter を作ってみたのですが



小嶋@青森県です。

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 (ダイヤルイン)