作者: なむnomoto
日時: 2005/1/20(14:34)
 極悪さん
                  なむnomotoです
 jperl が動きました。
 Perl フォルダにインストールしてあったものを、
 Perl フォルダを改名して 極悪Perl にして置いて(^^;)
 新しいPerl フォルダに再インストールしましたらば、
 作動しました。
 
 んで、今のところは具合良いです。
 ちょっと変更したいのですが、巧く行きません。教えて下さい。
 TXK2app.pl なんですが、例えば、
 
V:續天全_史傳2
P:159a
B:性空傳
  雖遍空倫師恐事跡湮沒。撰寫本傳一卷。附録五卷
  而備此山。鑒不圖罹回祿既成烏有矣。爰越州村
P:159b
  上榊原史君。應衆之求。便命謄寫曾祖故拾遺嘗所
  令寫之本。以遠寄諸吾山矣。史君之功可謂大焉。余
  雖久患往追來而未遑繕寫焉。今也得逸于茅亭
  世故稍疎。因持誦之餘。寫其全帙竟充素志矣。後
  之攬者。亦襲余志。幸此記之不墜云爾。
    時 元祿三年歳在庚午四月十六日。
         龍象院前住持 實雄(俗年六十六戒臘五十三)誌。
 
 とあるTXKデータを、txk2app.plで、app型に変更します。
        while(<FILE>){
            chomp;          # 改行あれば削除
   #        s/[  \t]+//g;  # 空白あれば削除
  上記の空白は残すようにしました。
  そうすると、こうなります。
性空傳,續天全_史傳2,159a,16,0,  雖遍空倫師恐事跡湮沒。撰寫本傳一卷。,4
性空傳,續天全_史傳2,159a,17,4,附録五卷  而備此山。鑒不圖罹回祿既成烏有
矣。,4
性空傳,續天全_史傳2,159b,1,4,爰越州村  上榊原史君。應衆之求。,11
性空傳,續天全_史傳2,159b,2,11,便命謄寫曾祖故拾遺嘗所  令寫之本。以遠寄
諸吾山矣。史君之功可謂大焉。,1
性空傳,續天全_史傳2,159b,3,1,余  雖久患往追來而未遑繕寫焉。,7
性空傳,續天全_史傳2,159b,4,7,今也得逸于茅亭  世故稍疎。因持誦之餘。寫
其全帙竟充素志矣。,1
性空傳,續天全_史傳2,159b,5,1,後  之攬者。亦襲余志。幸此記之不墜云爾。,
0
性空傳,續天全_史傳2,159b,6,0,    時 元祿三年歳在庚午四月十六日。,0
性空傳,續天全_史傳2,159b,7,0,         龍象院前住持 實雄(俗年
六十六戒臘五十三)誌。,0

 不都合なことは、上記のように、行冒頭の2個の空白が、本文中に挿入されて
 しまいます。さらに、タグと本文の間ですが、
 史傳2,159b,1,4,爰越州村
   とあるのは、
 史傳2,159b,1,4:爰越州村
    か、
 史傳2,159b,1,4‖爰越州村
    か、または
 史傳2,159b,1,4, 爰越州村
         ↑
         半角スペース
    のように漢文本文の直前に何かの区切り記号を入れたいです。
    txk2app.pl のどこを変更しても、作動しなくなります。
    ・・・・厳重だわ(+_+)
    どうすれば、良いのですか教えて下さいまし。
      ちょっと長文ですが、 皆さんごめんなさい(-人-)
$$$----------txk2app.pl----------
#!/usr/local/bin/jperl

# usage: jperl txk2app.pl foo.txk
# .txk ファイルを .app ファイルに変換します。
# 必ず日本語対応の perl(jperl5) を使ってください。
# my $revision = '$Revision: 1.14 $';

use strict;
use Getopt::Std;
getopts('d:k:chmrvw');
use vars qw($opt_d $opt_k $opt_c $opt_h $opt_m $opt_r $opt_v $opt_w);
### -h:ヘルプ ###
if($opt_h){
    my $help = join("",<DATA>);
    $help =~ s/\$\S+/$&/eeg;
    print $help;
    exit 8;
}
### DOS 窓に色をつける ###
#use Term::ANSIColor qw(:constants);
sub BLUE{   return "\c[[1;34m"  }
sub RED{    return "\c[[1;31m"  }
sub RESET{  return "\c[[m"      }

### 出力フォーマット ###
my $format = "%s,%s,%s,%d,%s,%d\n";
if($opt_c){
    my($in,$out) = (BLUE,RESET);
    $format = "%s $in%s$out %-15s$in%2d$out %s$in%d$out\n";
}
### -m:文の終わりを検索するための正規表現 ###
my($patstr,$patend) = (".*","。|・");
$patstr = ".*?" if $opt_m;

### 漢字対応の length ###
sub namulength($){
    local $_ = shift;
    my $len = 0;
    ++$len  while chop;
    return $len;
}
### -r:なんかよくわんないけど、文字を削除 ###
my $namuchardel = sub($){ return shift };
if($opt_r){
    $namuchardel = sub($){
        local $_ = shift;
        s/[!-.:->{-~]+//g;
        s/[ -、,-.:-☆◎-z]+//g;
        return $_;
    }
}
### -k:文字列を強調 ###
my $emstr = sub($){ return shift };
if(defined $opt_k){
    $emstr = sub($){
        local $_ = shift;
        my($in,$out) = ("【","】");
        ($in,$out) = (RED,RESET)    if $opt_c;
        s/(?!\Q$in\E)(?:$opt_k)(?!\Q$out\E)/$in$&$out/go;
        return $_;
    }
}
### -v:冗長な表示をする ###
my $verbose = sub{};
$verbose = sub{ print @_ } if $opt_v;

### 最終行に $patend がないときにエラーを表示 ###
sub warnstrend($){
    my $str = shift;
    print STDERR "...最後の行 \"$str\" に ($patend) が必要です。\n"
        if length $str;
}
### -w:ワイルドカードを展開する、ファイルに出力する ###
my $wopen = sub{};
my $wclose = sub{};
if($opt_w){
    $wopen = sub($){
        my $infile = shift;
        my $outfile = $infile;
        $outfile =~ s/(\.[^.]*?)?$/.app/i;
        if($infile ne $outfile){
            print STDERR $infile,"\t-> ",$outfile,"\n";
            open(STDOUT,">$outfile") or die "$!,$outfile\n";
        }else{
            die "Invalid filename,$infile\n";
        }
    };
    $wclose = sub{ close STDOUT };

    eval q{
        use File::DosGlob 'glob';
        @ARGV = map /[*?]/ ? File::DosGlob::glob($_) : $_, @ARGV;
    };
}
### ここから主処理 ###
push(@ARGV,"-") if $#ARGV < 0;
my $infile;
foreach $infile (@ARGV){
    &${wopen}($infile);
    open(FILE,"$infile") or die "$!,$infile\n";
    my($book,$line,$volume,$page,$pbegin,$lbegin) = (("?") x 6);
    my(@buff);
    while(<FILE>){
        chomp;          # 改行あれば削除
#        s/[  \t]+//g;  # 空白あれば削除

        ### コメント ###
        if(m/^\'/){  $line = 0;  next;   }
        ### タグを処理 ###
        if(m/^([A-Z]):(.+)$/){
            my($tag,$adj) = ($1,$2);
            &${verbose}("* $tag:$adj\n");
            if($tag eq "V"){    $volume = $adj; $line = 0;  next;   }
            if($tag eq "B"){    $book = $adj;               next;   }
            if($tag eq "P"){    $page = $adj;   $line = 0;  next;   }
            if($tag eq "L"){    $line = $adj-1;             next;   }
            &${verbose}("\n*** Unkown tag, \"$tag\" at $.\n");
            next;
        }
        ### 本文に突入 ###
        ++$line;
        ### 空行 ###
        next if m/^$/;
        ### $buff が空ということは、新しい文が始まるということ ###
        ($pbegin,$lbegin) = ($page,$line) if $#buff < 1;
        ### 半角空白
#        $spec = " ";
        ### 文の終わりを検出したときの処理 ###
        while(s/^($patstr)($patend)//o){
            my $buff = join("",@buff);
            s/\w+/★/g;
            $_ = &{$namuchardel}($_);
            my $cprev += namulength($buff);
            $buff .= $1.$2;
            my $cnext = namulength($_);

            my $pageline = "$pbegin,$lbegin";
            if(0 < $#buff){
                $pageline .= "〜";
                $pageline .= "$page," if $pbegin ne $page;
                $pageline .= $line;
            }

            $buff = &${emstr}($buff);   # -k:強調表示
            printf(
                $format,        # (出力フォーマット)
                $opt_d.$book,   # フォルダと書名
                $volume,        # 巻名
                $pageline,      # ページと行
                $cprev,         # 前行から受けた文字数
#                $spec           # 本文前の半角空白
                $buff,          # 本文
                $cnext          # 次行に送る文字数
            );
            undef @buff;    # 文が終わったのでバッファはクリア
            ($pbegin,$lbegin) = ($page,$line);
        }
        push(@buff,$_); # 次の文の頭
    }
    &${wclose};
    warnstrend(join("",@buff));
}

__END__
Usage : jperl $0 [-d DIR] [-k KEY] [-chrvw] [FILES...]

.txk ファイルを .app ファイルに変換します。

--