#!/usr/bin/perl
use strict;
use Getopt::Std;
use LocalVars;
use IO::Handle;
use Data::Dumper;
use BBSFileHeader;
use DB_File;
sub main
{
my($fh);
die usage() unless( getopts('caofn:') );
die usage() if( !@ARGV );
builddb($_) foreach( @ARGV );
}
sub usage
{
return ("$0 [-cfao] [-n NUMBER] [board ...]\n".
"\t-c\t\tbuild configure\n".
"\t-a\t\trebuild all files\n".
"\t-o\t\tonly build content(not building link)\n".
"\t-f\t\tforce build\n".
"\t-n NUMBER\tonly build \#NUMBER article\n");
}
sub builddb($)
{
my($board) = @_;
my(%bh, %ch);
print "building $board\n";
return if( !getdir("$BBSHOME/man/boards/".substr($board,0,1)."/$board",
\%bh, \%ch) );
buildconfigure($board, \%ch)
if( $Getopt::Std::opt_c || $Getopt::Std::opt_a );
builddata($board, \%bh,
$Getopt::Std::opt_a,
$Getopt::Std::opt_o,
$Getopt::Std::opt_n,
$Getopt::Std::opt_f,);
}
sub buildconfigure($$)
{
my($board, $rch) = @_;
my($outdir, $fn, $flag, %config, %attr);
$outdir = "$BLOGROOT/$board";
`/bin/rm -rf $outdir; /bin/mkdir -p $outdir`;
tie(%config, 'DB_File', "$outdir/config.db",
O_CREAT | O_RDWR, 0666, $DB_HASH);
tie(%attr, 'DB_File', "$outdir/attr.db",
O_CREAT | O_RDWR, 0666, $DB_HASH);
for ( 0..($rch->{num} - 1) ){
print "\texporting ".$rch->{"$_.title"}."\n";
if( $rch->{"$_.title"} =~ /^config$/i ){
foreach( split("\n", $rch->{"$_.content"}) ){
$config{$1} = $2 if( !/^\#/ && /(.*?):\s*(.*)/ );
}
}
else{
my(@ls, $t, $c);
$c = $rch->{"$_.content"};
$c =~ s/^\#.*?\n//g;
@ls = split("\n", $c);
open FH, ">$outdir/". $rch->{"$_.title"};
if( $rch->{"$_.title"} =~ /\.html$/ ){
while( $t = shift @ls ){
last if( $t !~ /^\*/ );
$attr{($rch->{"$_.title"}. ".$1")} = $2
if( $t =~ /^\*\s+(\w+): (.*)/ );
}
unshift @ls, $t;
}
print FH "$_\n"
foreach( @ls );
}
}
print Dumper(\%config);
print Dumper(\%attr);
}
sub builddata($$$$$$)
{
my($board, $rbh, $rebuild, $contentonly, $number, $force) = @_;
my(%dat, $dbfn, $y, $m, $d, $t, $currid);
$dbfn = "$BLOGROOT/$board.db";
unlink $dbfn if( $rebuild );
tie %dat, 'DB_File', $dbfn, O_CREAT | O_RDWR, 0666, $DB_HASH;
foreach( $number ? $number : (1..($rbh->{num} - 1)) ){
if( !(($y, $m, $d, $t) =
$rbh->{"$_.title"} =~ /(\d+)\.(\d+).(\d+),(.*)/) ){
print "\terror parsing $_: ".$rbh->{"$_.title"}."\n";
}
else{
$currid = sprintf('%04d%02d%02d', $y, $m, $d);
if( $dat{$currid} && !$force ){
print "\t$currid is already in db\n";
next;
}
print "\tbuilding $currid content\n";
$dat{ sprintf('%04d%02d', $y, $m) } = 1;
$dat{"$currid.title"} = $t;
$dat{"$currid.author"} = $rbh->{"$_.owner"};
# $dat{"$currid.content"} = $rbh->{"$_.content"};
# ugly code for making short
my @c = split("\n",
$dat{"$currid.content"} = $rbh->{"$_.content"});
$dat{"$currid.short"} = ("$c[0]\n$c[1]\n$c[2]\n".
$c[3] ? '....' : '');
if( !$contentonly ){
print "\tbuilding $currid linking... ";
if( $dat{$currid} ){
print "already linked";
}
elsif( !$dat{head} ){ # first article
$dat{head} = $currid;
$dat{last} = $currid;
}
elsif( $currid < $dat{head} ){ # before head ?
$dat{"$currid.next"} = $dat{head};
$dat{"$dat{head}.prev"} = $currid;
$dat{head} = $currid;
}
elsif( $currid > $dat{last} ){ # after last ?
$dat{"$currid.prev"} = $dat{last};
$dat{"$dat{last}.next"} = $currid;
$dat{last} = $currid;
}
else{ # inside ? @_@;;;
print "not implement yet";
}
$dat{$currid} = 1;
print "\n";
}
}
}
print Dumper(\%dat);
untie %dat;
}
sub getdir($$$$$)
{
my($bdir, $rh_bh, $rh_ch) = @_;
my(%h);
tie %h, 'BBSFileHeader', "$bdir/";
if( $h{"-1.title"} !~ /blog/i || !$h{"-1.isdir"} ){
print "blogdir not found\n";
return;
}
tie %{$rh_bh}, 'BBSFileHeader', "$bdir/". $h{'-1.filename'}.'/';
if( $rh_bh->{'0.title'} !~ /configure/i ||
!$rh_bh->{'0.isdir'} ){
print "configure not found\n";
return;
}
tie %{$rh_ch}, 'BBSFileHeader', $rh_bh->{dir}. '/'. $rh_bh->{'0.filename'};
return 1;
}
main();
1;