Namazu-win32-users-ja(旧)


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

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



小嶋です。

以前投稿した、一太郎11を使った一太郎文書用OLEフィルタですが、
さすがに、Perlのスクリプトからも、Rubyのスクリプトからも一太郎
を呼ぶのはばかばかしいと気づいたので、手直しをしました。

#Perlから一太郎を呼んでいるのは、全部をPerlで書こうと悪あがきを
#している副作用で、この部分の情報は、既にRubyのスクリプトで
#一太郎に読みとらせる形で実装済みです(前の投稿を見ていただければ
#判ると思いますが)

で、手直し後は、一太郎を呼び出す回数が半分になりますので、若干の
高速化が実現できました。それでも重いですが。

なお、現在、Namazuをインストールしているサーバにないフォントを
つかった文書に出くわすと、ダイアログを出して指示待ち状態になって
しまうという難点が判っていますが、対処方法が思いつきません。

どなたかヒントをいただければとも思いますが(でも、一太郎の仕様で
どうしようもないのかも知れません)。

----------------------------------------------------------------
jt.pl

#
# -*- Perl -*-
# $Id: jt.pl,v 1.1 2001/09/27 17:21:15 D.K.C $
# Euc convert with NKF
#

package jt;
use strict;
use File::Copy;
use NKF;
require 'util.pl';
require 'gfilter.pl';

my $taroconvpath  = undef;

sub mediatype() {
    return qw(
     application/x-js-taro
    );
}

sub status() {
    $taroconvpath = util::checkcmd('jt_v1_1');
    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.sjis');


    system("$taroconvpath -f $cfile > $tmpfile2");
    open (INPATH,"< $tmpfile2") || die "Can't open file :$!\n";
    open (OUTPATH,"> $tmpfile") || die "Can't open file :$!\n";

    my $tline = <INPATH>;
    my $aline = <INPATH>;
    my $dline = <INPATH>;


    $fields->{'title'} = codeconv::shiftjis_to_eucjp($tline)
    if (defined $tline);

    $fields->{'author'} = codeconv::shiftjis_to_eucjp($aline)
    if (defined $aline);

    while (my $sentence = <INPATH> ){
        print OUTPATH nkf('-eSZ',$sentence);
        }

    close(INPATH);
    close(OUTPATH);

    {
        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;

--------------------------------------------------------------------------
jt_v1_1.bat

@ruby c:\usr\scripts\ruby\jt_v1_1.rb %1 %2 %3 %4

--------------------------------------------------------------------------
jt_v1_1.rb

require "win32ole"
require "getopts"

$KCODE="SJIS"

def usage
   print "usage: ruby jt3.rb [-f] <Ichitaro Document files..>\n"
end

unless getopts("f")
  usage
  exit(1)
end

begin
     jxw = WIN32OLE.connect("JXW.Application")
rescue
     jxw = WIN32OLE.new("JXW.Application")
     jxw.WindowState = 2
end

if ARGV.size < 1
   usage
   exit(1)
end

ary=[]
sheetitem=[]
docinfo=[]
info=[]

for jtd in ARGV
   begin
      jdoc = jxw.Application.TaroLibrary
      jdoc.OpenDocument(File.expand_path(jtd))
      if $OPT_f == true
         i = 1
         for info in jdoc.GetDocumentInformation()
            val = ""
            for a in info
              val = a
            end
            docinfo[i] = val
            i += 1
         end
         jtdtitle = docinfo[6]
         jtdtitle = docinfo[1] if jtdtitle == ""
         jtdauthor = docinfo[8]
         jtdauthor = docinfo[3] if jtdauthor == ""
         jtddate = docinfo[9]

         print jtdtitle + "\n"
         print jtdauthor + "\n"
         print 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_f == false
                print "sheet:"+ sheetname + "は一太郎文書ではありません。\n"
             end
         else
             if $OPT_f == 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

-----------------------------------------------------------
ここ1週間ほど試用していますが、割合と安定しているようです。
以上、長文?失礼いたしました。

ken_kojima@aomori_prefecture