#!/usr/bin/perl
# This script is published under Perl License
# (c)2001 JL4CVB Yuzo
# User Configuration ----------------------------------------------------
$Directory = './PALM/PROGRAMS/Docs'; #このスクリプトから見た相対Directory
$TextFiles = ['*.htm', '*.html', '*.HTM', '*.txt', '*.TXT'];
$BackUp = 0;
$Secret = 1;
# This script will not write "before $DeleteHeaderTill" and
# "after $DeleteFooterFrom" to PDB file.
# (PDBに変換する際、$DeleteHeaderTill以前と
# $DeleteFooterFrom以降は書き出さない)
#$DeleteHeaderTill = '
]*>';
#$DeleteFooterFrom = '';
#------------------------------------------------------------------------
$RecMaxSize = 4096;
$RecMinSize = 3072;
{
$0 =~ m/^(.*[\/\\])[^\/\\]*$/;
my $scriptDir = $1;
$scriptDir =~ s!/[^/]*$!! if(($scriptDir ne '') and (! -d $scriptDir));
chdir("$scriptDir$Directory");
my $tfiles = &globFiles($TextFiles);
foreach $tfName (keys %$tfiles){
# my $tftime = $tfiles->{$tfName};
my $text2Write = [];
# [78,94] means pdb-header(78) and pdb-header + doc-headerDOC (78+16)
# (pdbヘッダ(78)と pdbヘッダ+DOCヘッダ(78+16))
my $recOffset = [78,94];
($text2Write,$recOffset) =
&decideOffset($tfName, $text2Write, $recOffset);
# &decideOffset_old($tfName, $text2Write, $recOffset);
my $recNum = scalar(@$recOffset) - 1;
for(my $i=0; $i < $recNum; $i++){
$recOffset->[$i] += ($recNum * 8) ;
}
# $recOffset->[-1] is "length of document itself"
$recOffset->[-1] -= 94;
&writePDB($text2Write,$recOffset,$recNum,$tfName);
}
}
sub decideOffset($\@\@){
my ($file,$result,$recOffset) = @_;
my $text = [];
my $recSize = 0;
my ($line2Start,$lineNum) = (0,1);
open(TXT,"$file");
while(){
s/[\r\n]+$/\n/;
push(@$text,$_);
}
close(TXT);
if ($DeleteHeaderTill ne ''){
for(@$text){
$line2Start = $lineNum if (/$DeleteHeaderTill\n?(.*)/i);
$lineNum ++;
}
}
$lineNum = 0;
while(@$text){
my $line = shift(@$text);
$lineNum++;
last if (($DeleteFooterFrom ne '')and($line =~ /^$DeleteFooterFrom/i));
next if ($lineNum < $line2Start);
if($lineNum == $line2Start){
$line =~ s/$DeleteHeaderTill\n?(.*)/$line = $1 if ($1 ne '')/e;
}
push(@$result,$line);
($recOffset,$recSize) =
&addRecOffset($recOffset,$recSize,length($line));
}
push(@$recOffset, $recOffset->[-1] + $recSize) if ($recSize > 0);
return ($result,$recOffset);
}
sub decideOffset_old($\@\@){
my ($file,$result,$recOffset) = @_;
my $recSize = 0;
my $flagGet = ($DeleteHeaderTill eq '')? 1 : 0;
# Read from top of file if ($DeleteHeaderTill eq '')
open(TXT,"$file");
while(){
s/[\r\n]+$/\n/;
last if (($DeleteFooterFrom ne '') and (/^$DeleteFooterFrom/i));
if ($flagGet == 1){
push(@$result,$_);
($recOffset,$recSize) =
&addRecOffset($recOffset,$recSize,length($_));
}elsif(/$DeleteHeaderTill\n?(.*)/i){
if ($1 ne ''){
push(@$result,$1);
($recOffset,$recSize) =
&addRecOffset($recOffset,$recSize,length($1));
}
$flagGet = 1;
}
}
push(@$recOffset, $recOffset->[-1] + $recSize) if ($recSize > 0);
close(TXT);
return ($result,$recOffset);
}
sub addRecOffset(\@$$){
my ($recOffset,$recSize,$lineSize) = @_;
die "Line is too long" if ($lineSize > $RecMaxSize);
if (($recSize + $lineSize) >= $RecMaxSize){
push(@$recOffset, $recOffset->[-1] + $recSize);
$recSize = $lineSize;
}elsif (($recSize + $lineSize) > $RecMinSize){
push(@$recOffset, $recOffset->[-1] + $recSize + $lineSize);
$recSize = 0;
}else{
$recSize += $lineSize;
}
return ($recOffset,$recSize);
}
sub writePDB(\@\@$$){
my ($text,$recOffset,$numRec,$tfName) = @_;
my $pfName = $tfName;
$pfName =~ s/\..*$/.pdb/;
$pfName =~ s/old\-\d+$//;
my $time = time;
if((-f $pfName) and ($BackUp > 0)){
$pfName =~ /^(.*)\.(.*)$/;
my ($fn1, $fn2, $i) = ($1, $2, 0);
while(-f "$fn1\-old$i\.$fn2"){ $i++; };
rename("$pfName", "$fn1\-old$i\.$fn2");
}
print "$tfName -> $pfName\n";
open (PDBW,">$pfName");
binmode PDBW;
#pdb-header (78bytes)
# $file->[1] : pdb name (32bytes), padded by \x00
# 8 : backup bit
# 114377902 : create/modified date. by txt2pdbdoc.c
# TEXt, REAd : type, creatorID. 'REAd' means 'for DOCreader'
# http://www.palmos.com/dev/tech/palmos/creatorid/
# $numRec : numbers of Record (document-header included).
print PDBW pack("a32nx2N2x16a4a4x8n",
($tfName,8,114377902,114377902,"TEXt","REAd",$numRec));
# record header (8bytes each)
for(my $i=0;$i < $numRec; $i++){
# RecOffset->[$i] : where the record starts (4bytes)
# 16945, $i+32768 = \x40 \x6F \x80 $i
# : some Flag (1byte) and recID (3bytes)
print PDBW pack("Nnn",($recOffset->[$i],16495,$i + 32768));
print "size:$recOffset->[$i]\n";
}
# doc header(16bytes)
# 1 : 1=plain, 2=compressed (2bytes)
# $recOffset->[-1] : length of non-compressed DOCUMENT (not PDB data) (4)
# $numRec -1 : numbers of records in DOCUMENT (not PDB data) (2bytes)
# 4096 : max size of each record (2bytes)
print PDBW pack ("nx2Nnnx4",(1,$recOffset->[-1],($numRec - 1),4096));
for(@$text){
print PDBW "$_";
}
close(PDBW);
}
sub globFiles(\@){
my $glob = shift;
my ($fileList,$g,$f,@l, @fst);
use Config;
foreach $g (@$glob){
if ($Config{'archname'} =~ /WCE/i){ # Perl for WinCE
system("ls -1 $g");
rename("/ls-stdout.txt","glob.tmp");
open(GLOB,"glob.tmp");
@l = ;
close(GLOB);
unlink('glob.tmp');
}else{
@l = glob($g);
}
foreach $f (@l){
$f = lc($f) if ($Config{'archname'} =~ /MSWin32/);
next if (($f =~ m/(_cnv|\~)$/i) or ($fileList->{$f} > 0));
@fst = lstat($f);
$fileList->{$f} = $fst[9];
}
}
return $fileList;
}