X-Git-Url: http://www.average.org/gitweb/?p=mkgallery.git;a=blobdiff_plain;f=mkgallery.pl;h=1031da6949dfab9397931ccfc0adfa993dfa33b5;hp=f672b6c3895234f6665d6da8a8eda1abb566bfa2;hb=5527f9d9dd107c49860360979bcea661d83039e2;hpb=a4459ef8c416655779d060838622932d26cded1b diff --git a/mkgallery.pl b/mkgallery.pl index f672b6c..1031da6 100755 --- a/mkgallery.pl +++ b/mkgallery.pl @@ -29,6 +29,7 @@ package FsObj; use strict; use Carp; use POSIX qw/getcwd strftime/; +use HTTP::Date; use CGI qw/:html *table *Tr *td *center *div *Link/; use Image::Info qw/image_info dim/; use Term::ReadLine; @@ -44,6 +45,7 @@ my $haverssxml = eval { require XML::RSS; }; { package XML::RSS; } # to make perl compiler happy my @sizes = (160, 640, 1600); +my $incdir = ".gallery2"; ###################################################################### @@ -108,14 +110,13 @@ sub new { -depth=>$parent->{-depth}+1, -base=>$name, -fullpath=>$parent->{-fullpath}.'/'.$name, - -relpath=>$parent->{-relpath}.'/'.$name, + -relpath=>$parent->{-relpath}.$name.'/', -inc=>'../'.$parent->{-inc}, }; } else { $class = $this; my $root=shift; $self = { - -depth=>0, -root=>$root, -fullpath=>$root, }; @@ -137,68 +138,118 @@ sub initpaths { my $depth=20; # arbitrary max depth my $fullpath=$self->{-fullpath}; my $inc; - my $rss; my $relpath; if ($incpath) { - $inc = $incpath."/.gallery2"; + $inc = $incpath; + $inc .= '/' unless ($inc =~ m%/$%); } else { - $inc=".gallery2"; - while ( ! -d $fullpath."/".$inc ) { + $inc=""; + while ( ! -d $fullpath."/".$inc."/".$incdir ) { $inc = "../".$inc; last unless ($depth-- > 0); } } if ($depth > 0) { - $self->{-inc} = $inc.'/'; + $self->{-inc} = $inc; my $dp=0; my $pos; for ($pos=index($inc,'/');$pos>=0; $pos=index($inc,'/',$pos+1)) { $dp++; } - for ($pos=length($fullpath);$dp-->0 && $pos>0; - $pos=rindex($fullpath,'/',$pos-1)) {;} + $self->{-depth} = $dp; + for ($pos=length($fullpath);$dp>0 && $pos>0; + $pos=rindex($fullpath,'/',$pos-1)) { + $dp--; + } my $relpath = substr($fullpath,$pos); $relpath =~ s%^/%%; + $relpath .= '/' if ($relpath); $self->{-relpath} = $relpath; $self->{-toppath} = substr($fullpath,0,$pos); + #print "rel=$relpath, top=$self->{-toppath}, inc=$inc\n"; initrss($self); } else { $self->{-inc} = 'NO-.INCLUDE-IN-PATH/'; # won't work anyway $self->{-rss} = ''; $self->{-relpath} = ''; + $self->{-depth} = 0; } } sub initrss { my $self=shift; # this is not a method but we cheat my $fullpath=$self->{-fullpath}; - my $depth=20; + my $toppath=$self->{-toppath}; + my $inc=$self->{-inc}.$incdir.'/'; + my $conffile=$toppath.'/'.$incdir.'/rss.conf'; + my $CONF; + + if ($rssfile) { + if (open($CONF,">".$conffile)) { + print $CONF "file: ",$rssfile,"\n"; + close($CONF); + } else { + print STDERR "could not open $conffile: $!\n"; + } + } else { + if (open($CONF,$conffile)) { + my $ln=<$CONF>; + close($CONF); + chop $ln; + my ($k,$v)=split(':', $ln); + $k =~ s/^\s*//; + $k =~ s/\s*$//; + $v =~ s/^\s*//; + $v =~ s/\s*$//; + if ($k eq 'file') { + $rssfile=$v; + } + } + } - return; - return "" unless $rssfile; + return unless ($rssfile); - my $rss=$rssfile; - while ( ! -f $fullpath."/".$rss ) { - $rss = "../".$rss; - last unless ($depth-- > 0); - } - if ($depth > 0) { - $rssobj->{'file'} = $rss; - $rssobj->{'rss'} = new XML::RSS (version=>2); - $rssobj->{'rss'}->parsefile($rss); + $rssobj->{'file'} = $self->{-toppath}.'/'.$rssfile; + $rssobj->{'rss'} = new XML::RSS (version=>'2.0'); + if ( -f $rssobj->{'file'} ) { + $rssobj->{'rss'}->parsefile($rssobj->{'file'}); my $itemstodel = @{$rssobj->{'rss'}->{'items'}} - 15; while ($itemstodel-- > 0) { pop(@{$rssobj->{'rss'}->{'items'}}) } $rssobj->{'rss'}->save($rssobj->{'file'}); - return $rss; } else { - print STDERR "There is no $rssfile in this or parent ". - "directories, you must create one with mkgalrss.pl\n"; - exit 1; + my $link; + my $p1; + my $p2; + for ($p1=0,$p2=length($toppath); + substr($rssfile,$p1,3) eq '../' && $p2>0; + $p1+=3,$p2=rindex($toppath,'/',$p2-1)) {;} + $link=substr($toppath,$p2); + $link =~ s%^/%%; + $link .= '/' if ($link); + while (($p1=index($rssfile,'/',$p1+1)) >= 0) { + $link = '../'.$link; + } + + $rssobj->{'rss'}->channel( + title=>'Gallery', + link=>$link, + description=>'Gallery Feed', + #language=>$language, + #rating=>$rating, + #copyright=>$copyright, + #pubDate=>$pubDate, + #lastBuildDate=>$lastBuild, + #docs=>$docs, + #managingEditor=>$editor, + #webMaster=>$webMaster + ); + $rssobj->{'rss'}->save($rssobj->{'file'}); } + $self->{-rss} = $rssobj->{'rss'}; } sub iterate { @@ -466,7 +517,7 @@ sub makeaux { my $dn = $self->{-parent}->{-fullpath}; my $pref = $self->{-previmg}->{-base}; my $nref = $self->{-nextimg}->{-base}; - my $inc = $self->{-inc}; + my $inc = $self->{-inc}.$incdir.'/'; my $title = $self->{-info}->{'Comment'}; $title = $name unless ($title); @@ -586,14 +637,14 @@ sub startindex { binmode($IND, ":utf8"); $self->{-IND} = $IND; - my $inc = $self->{-inc}; + my $inc = $self->{-inc}.$incdir.'/'; my $title = $self->{-title}; my $rsslink=""; - if ($self->{-rss}) { + if ($rssobj) { $rsslink=Link({-rel=>'alternate', -type=>'application/rss+xml', -title=>'RSS', - -href=>$self->{-rss}}); + -href=>$self->{-inc}.$rssfile}); } print $IND start_html(-title => $title, -encoding=>"utf-8", @@ -617,7 +668,7 @@ sub startindex { -id => 'indexContainer'}), "\n"; my $EVL; - if (open($EVL,$inc.'header.pl')) { + if (open($EVL,$self->{-toppath}.'/'.$incdir.'/header.pl')) { my $prm; while (<$EVL>) { $prm .= $_; @@ -631,6 +682,9 @@ sub startindex { ); print $IND eval $prm,"\n"; } else { + print STDERR "could not open ", + $self->{-toppath}.'/'.$incdir.'/header.pl', + " ($!), reverting to default header"; print $IND a({-href=>"../index.html"},"UP"),"\n", h1({-class=>'title'},$title),"\n", } @@ -642,7 +696,7 @@ sub endindex { print $IND end_div; my $EVL; - if (open($EVL,$self->{-inc}.'footer.pl')) { + if (open($EVL,$self->{-toppath}.'/'.$incdir.'/footer.pl')) { my $prm; while (<$EVL>) { $prm .= $_; @@ -655,6 +709,10 @@ sub endindex { -breadcrumbs => "breadcrumbs unimplemented", ); print $IND eval $prm,"\n"; + } else { + print STDERR "could not open ", + $self->{-toppath}.'/'.$incdir.'/footer.pl', + " ($!), reverting to default empty footer"; } print $IND end_html,"\n"; @@ -665,11 +723,13 @@ sub endindex { $self->{-title}, $self->{-numofimgs}, $self->{-numofsubs}; - my $rsslink=$rssobj->{'rss'}->channel('link')."index.html"; + my $rsslink=$rssobj->{'rss'}->channel('link'). + $self->{-relpath}."index.html"; $rssobj->{'rss'}->add_item( title => $self->{-title}, link => $rsslink, description => $rsstitle, + pubDate => time2str(time), ); } }