Namazu-win32-users-ja(旧)


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

一太郎oleフィルタの改訂といいますか



長らくご無沙汰しております。小嶋@青森です。
(長文注意)

忙しさにかまけて、しばらく手を付けずにおりました、一太郎利用のfilter
ですが、一部を手直ししまして、以前は「読み込めない」とエラーを吐いて
いた部分を、いくらか抑制できましたので、この新しい版をupします。

今回、一太郎のマクロバイザーで表記されている範囲を超えた返値
を参照しています(すなわち、公式にはエラーである部分を、強制的に
先に進めていることになります。)ので、ひょっとしたら、かなり意外な
ところで足をすくわれるかもしれません。それでも良いという方は、何とぞ
ご試用ください。

-----------------<jt.pl  ver1.5.1 >-------------------------

#
# -*- Perl -*-
# $Id: jt.pl,v 1.5.1 2002/12/05 21:05:35 D.K.C $
#
# Rubyのスクリプトは必要なくなりました。
# 一太郎ver4,5,6,7も対象に追加。
# タイトル、ファイル名の文字化け対策追加。
# ダイアログ表示による停止を回避。
# 何度も一太郎を起動・終了することを回避。
# 一太郎ver4文書はかならずしも読み込めない模様なので、エラーの時はごめんなさい
# 添削モードで保存されたファイルはインデックスできない問題に対処(1.3.6)
# ファイルオープン指示後のリザルトコードがundefの場合に対処及び
# 罫線内部が一部インデックスされない問題に対処(1.3.7)
# 一部ファイルに対し読み込めないと言ってインデックスを拒否する
# コーディングの見直し(というか、コロンブスの卵)(1.5.1)

package jt;
use strict;
use File::Copy;
use NKF;
use Win32::OLE;
use Win32::OLE::Enum;
use Win32::OLE::Const;

require 'util.pl';
require 'gfilter.pl';

# 一太郎を何度も起動・終了させないために
#
BEGIN {
my $jxw = Win32::OLE->new('JXW.Application');
$jxw->{WindowState} = 2;
$jxw->Application->TaroLibrary->NewDocument;
$jxw->{Visible} = 0;
}

END {
my $jxw = Win32::OLE->new('JXW.Application');
$jxw->Quit;
}
# ここまで


sub mediatype() {
    return (
     'application/ichitaro4',
     'application/ichitaro5',
     'application/ichitaro6',
     'application/ichitaro7',
     'application/x-js-taro'
    );
}

# olemsword.pl より引用 (新たなバージョンが出たら対応すること)

sub status() {
    open (SAVEERR,">&STDERR");
    open (STDERR,">nul");
    my $const;
    $const = Win32::OLE::Const->Load("TARO 12.0 Type Library");
    $const = Win32::OLE::Const->Load("TARO 11.0 Type Library")
     unless $const;
    open (STDERR,">&SAVEERR");
    return 'yes' if (defined $const);
    return 'no';
}

# ここまで

sub recursive() {
    return 0;
}

sub pre_codeconv() {
    return 0;
}

sub post_codeconv () {
    return 0;
}

sub add_magic ($) {
    my ($magic) = @_;

    $magic->addFileExts('(?i)\\.jsw', 'application/ichitaro4');
    $magic->addFileExts('(?i)\\.jaw', 'application/ichitaro5');
    $magic->addFileExts('(?i)\\.jbw', 'application/ichitaro6');
    $magic->addFileExts('(?i)\\.jfw', 'application/ichitaro7');

    # Ichitaro 8, 9, 10, 11
    $magic->addFileExts('\\.jt[dt]$', 'application/x-js-taro');

    return;
}

sub failtoload($) {
# report $result
     my $result = @_;
     print "Result code is ".$result."\n";
     my $jxw = Win32::OLE->new('JXW.Application');
     $jxw->Application->TaroLibrary->QuitDocumentWindow;
     die "Cannot Open File.";
}

sub filter ($$$$$) {
    my ($orig_cfile, $cont, $weighted_str, $headings, $fields)
      = @_;
     my ($tline,$aline,$dline,$sentence);
     my ($line,@DocProperty,$i,$j,$k,$key,$val,$title,$author,$date);
     my ($DocInfo,$jdoc,$unit,$jxw,$japply,$taroobj);
    my $cfile = defined $orig_cfile ? $$orig_cfile : '';
    $$cont = "";

     my $jfile = $cfile;
     $jfile =~ s/\//\\/g;

#ここから、ole使用の部分

     $jxw = Win32::OLE->new('JXW.Application') or die "Oops, cannot start Ichitaro.";
     $japply = $jxw->Application;
     $taroobj = $japply->TaroLibrary;
     my $result = $jxw->Documents->Open($jfile);
     &failtoload unless (defined $result);
     &failtoload unless ($result < 6); #参照専用ファイル等はコード3まで。あとは読み込み失敗と思っていましたが、どうやら。
     $taroobj->RevisionMode(0); #添削モード解除
     $DocInfo = Win32::OLE::Enum->new($taroobj->GetDocumentInformation);

     for ($i=1;$i<=17;$i++){
     $unit = Win32::OLE::Enum->new($DocInfo->Next);
          ($key,$val) = $unit->All();
          $DocProperty[$i][1] = $key;
          $DocProperty[$i][2] = $val;
     }

     $tline = $DocProperty[6][2];
     $tline = $DocProperty[1][2] unless $tline;
     $aline = $DocProperty[8][2];
     $aline = $DocProperty[3][2] unless $aline;
     $dline = $DocProperty[9][2];


     my $maxsheetnum = $taroobj->GetSheetCount;
     my $sheetcount=0;
     while($sheetcount < $maxsheetnum){
          $jdoc = $japply->TaroLibrary;
     $jdoc->ChangeCurrentSheet(eval(++$sheetcount));
          my $CurrentSheetItem = Win32::OLE::Enum->new($jdoc->GetCurrentSheetItem);
          my @SheetItem = $CurrentSheetItem->All();
          my $sheettype = $SheetItem[0];
          my $sheetname = $SheetItem[1];

          if ($sheettype == 10 ){
          } else {
               $jdoc->JumpStart;
               until($jdoc->OutOfDocument){
                    $jdoc->SelectRangeStart(30);
                    my $para = Win32::OLE::Enum->new($jdoc->GetString(2));
                    my @ary = $para->All();
                    foreach $line (@ary){
                    $sentence .= $line;
                    }
               }
          }

     }

     $taroobj->QuitDocumentWindow;


# ここまで,OLE関係部分

    $fields->{'title'} = nkf('-eSZ',$tline)
    if (defined $tline);

    $fields->{'author'} = nkf('-eSZ',$aline)
    if (defined $aline);

     $$cont .=  nkf('-eSZ',$sentence);

    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;