From a56e7b4b7a12b446702ab83217f070cd19680a1d Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Mon, 1 Jan 2007 11:56:41 +0000 Subject: [PATCH] preliminary code for building gallery RSS feed --- mkgallery.pl | 67 +++++++++++++++++++++++++++++++++++- mkgalrss.pl | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100755 mkgalrss.pl diff --git a/mkgallery.pl b/mkgallery.pl index 5c02e0b..493fd5a 100755 --- a/mkgallery.pl +++ b/mkgallery.pl @@ -29,7 +29,7 @@ package FsObj; use strict; use Carp; use POSIX qw/getcwd strftime/; -use CGI qw/:html *table *Tr *center *div/; +use CGI qw/:html *table *Tr *center *div *Link/; use Image::Info qw/image_info dim/; use Term::ReadLine; use Getopt::Long; @@ -40,14 +40,19 @@ binmode(STDOUT, ":utf8"); my $haveimagick = eval { require Image::Magick; }; { package Image::Magick; } # to make perl compiler happy +my $haverssxml = eval { require XML::RSS; }; +{ package XML::RSS; } # to make perl compiler happy + my @sizes = (160, 640); ###################################################################### my $incpath; +my $rssobj; my $debug = 0; my $asktitle = 0; my $noasktitle = 0; +my $rssfile = ""; charset("utf-8"); @@ -56,14 +61,24 @@ unless (GetOptions( 'incpath'=>\$incpath, 'asktitle'=>\$asktitle, 'noasktitle'=>\$noasktitle, + 'rssfile=s'=>\$rssfile, 'debug'=>\$debug)) { &help; } +if ($rssfile && ! $haverssxml) { + print STDERR "You need to get XML::RSS from CPAN to use --rssfile\n"; + exit 1; +} + my $term = new Term::ReadLine "Edit Title"; FsObj->new(getcwd)->iterate; +if ($rssobj) { + $rssobj->save($rssfile); +} + sub help { print STDERR <<__END__; @@ -75,6 +90,7 @@ usage: $0 [options] --asktitle: ask to edit album titles even if there are ".title" files --noasktitle: don't ask to enter album titles even where ".title" files are absent. Use partial directory names as titles. + --rssfile=...: build RSS feed for newly added "albums", give name of rss file __END__ exit 1; @@ -95,6 +111,7 @@ sub new { -base=>$name, -fullpath=>$fullpath, -inc=>'../'.$parent->{-inc}, + -rss=>'../'.$parent->{-rss}, }; } else { $class = $this; @@ -103,6 +120,7 @@ sub new { -root=>$root, -fullpath=>$root, -inc=>getinc($root), + -rss=>getrss($root), }; } bless $self, $class; @@ -135,6 +153,28 @@ sub getinc { } } +sub getrss { + my $fullpath=shift; # this is not a method + my $depth=20; # arbitrary max depth + + return "" unless $rssfile; + + my $rss=$rssfile; + while ( ! -f $fullpath."/".$rss ) { + $rss = "../".$rss; + last unless ($depth-- > 0); + } + if ($depth > 0) { + $rssobj = new XML::RSS (version=>2); + $rssobj->parsefile($rss); + return $rss; + } else { + print STDERR "There is no $rssfile in this or parent ". + "directories, you must create one with mkgalrss.pl\n"; + exit 1; + } +} + sub iterate { my $self = shift; my $fullpath .= $self->{-fullpath}; @@ -508,8 +548,16 @@ sub startindex { my $inc = $self->{-inc}; my $title = $self->{-title}; + my $rsslink=""; + if ($self->{-rss}) { + $rsslink=Link({-rel=>'alternate', + -type=>'application/rss+xml', + -title=>'RSS', + -href=>$self->{-rss}}); + } print $IND start_html(-title => $title, -encoding=>"utf-8", + -head=>$rsslink, -style=>{-src=>[$inc."gallery.css", $inc."lightbox.css"]}, -script=>[{-code=>"var incPrefix='$inc';"}, @@ -529,6 +577,21 @@ sub endindex { close($IND) if ($IND); undef $self->{-IND}; + print STDERR "title=",$self->{-title}, + ", numofsubs=",$self->{-numofsubs}, + ", numofimgs=",$self->{-numofimgs},"\n"; + if ($rssobj) { + my $rsstitle=sprintf "%s [%d images, %d subalbums]", + $self->{-title}, + $self->{-numofimgs}, + $self->{-numofsubs}; + my $rsslink=$rssobj->channel('link')."index.html"; + $rssobj->add_item( + title => $self->{-title}, + link => $rsslink, + description => $rsstitle, + ); + } } sub startsublist { @@ -544,6 +607,7 @@ sub sub_entry { my $name = $self->{-base}; my $title = $self->{-title}; + $self->{-parent}->{-numofsubs}++; print $IND Tr(td(a({-href=>$name.'/index.html'},$name)), td(a({-href=>$name.'/index.html'},$title))),"\n"; } @@ -577,6 +641,7 @@ sub img_entry { my $info = $self->{-info}; my ($w, $h) = dim($info); + $self->{-parent}->{-numofimgs}++; print $IND start_div({-class=>'ibox',-id=>$name, -OnClick=>"HideIbox('$name');"}),"\n", start_div({-class=>'iboxtitle'}), diff --git a/mkgalrss.pl b/mkgalrss.pl new file mode 100755 index 0000000..e2ee8a8 --- /dev/null +++ b/mkgalrss.pl @@ -0,0 +1,95 @@ +#!/usr/bin/perl + +# $Id: mkgallery.pl 38 2006-12-17 09:39:01Z crosser $ + +# Build initial (empty) RSS file for mkgallery.pl + +# Copyright (c) 2007 Eugene G. Crosser + +# This software is provided 'as-is', without any express or implied +# warranty. In no event will the authors be held liable for any damages +# arising from the use of this software. +# +# Permission is granted to anyone to use this software for any purpose, +# including commercial applications, and to alter it and redistribute it +# freely, subject to the following restrictions: +# +# 1. The origin of this software must not be misrepresented; you must not +# claim that you wrote the original software. If you use this software +# in a product, an acknowledgment in the product documentation would be +# appreciated but is not required. +# 2. Altered source versions must be plainly marked as such, and must not be +# misrepresented as being the original software. +# 3. This notice may not be removed or altered from any source distribution. + +use strict; +use Carp; +use Term::ReadLine; +use XML::RSS; +use Getopt::Long; +use Encode; +use encoding 'utf-8'; +binmode(STDOUT, ":utf8"); + +###################################################################### + +my $debug = 0; +my $rssfile = ""; + +unless (GetOptions( + 'help'=>\&help, + 'rssfile=s'=>\$rssfile, + 'debug'=>\$debug)) { + &help; +} + +sub help { + + print STDERR <<__END__; +usage: $0 [options] + --help: print help message and exit + --incpath: do not try to find .include diretory upstream, use + specified path (absolute or relavive). Use with causion. + --debug: print a lot of debugging info to stdout as you run + --asktitle: ask to edit album titles even if there are ".title" files + --noasktitle: don't ask to enter album titles even where ".title" + files are absent. Use partial directory names as titles. + --rssfile=...: build RSS feed for newly added "albums", give name of rss file +__END__ + + exit 1; +} + +unless ($rssfile) { + print STDERR "you must specify --rssfile\n"; + exit 1; +} + +my $term = new Term::ReadLine "Edit RSS Attribute"; + +my $rssobj = new XML::RSS (version=>'2.0'); +die "could not build new RSS object" unless ($rssobj); + +my $OUT = $term->OUT || \*STDOUT; +print $OUT "Enter attributes for this gallery RSS feed\n"; +my $title = $term->readline('Feed title >',''); +$term->addhistory($title) if ($title); +my $link = $term->readline('Gallery root URL >',''); +$term->addhistory($link) if ($link); +my $desc = $term->readline('Gallery description >',''); +$term->addhistory($desc) if ($desc); + +$rssobj->channel( + title=>$title, + link=>$link, + description=>$desc, + #language=>$language, + #rating=>$rating, + #copyright=>$copyright, + #pubDate=>$pubDate, + #lastBuildDate=>$lastBuild, + #docs=>$docs, + #managingEditor=>$editor, + #webMaster=>$webMaster + ); +$rssobj->save($rssfile); -- 2.39.2