############################################################################## # The Faq-O-Matic is Copyright 1997 by Jon Howell, all rights reserved. # # # # This program is free software; you can redistribute it and/or # # modify it under the terms of the GNU General Public License # # as published by the Free Software Foundation; either version 2 # # of the License, or (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.# # # # Jon Howell can be contacted at: # # 6211 Sudikoff Lab, Dartmouth College # # Hanover, NH 03755-3510 # # jonh@cs.dartmouth.edu # # # # An electronic copy of the GPL is available at: # # http://www.gnu.org/copyleft/gpl.html # # # ############################################################################## use strict; ### ### ImageRef.pm ### ### Generates references to the images encoded in ImageData.pm ### (note this only makes sense for built-in images, not those sumbitted ### into the serve/bags/ directory.) ### package FAQ::OMatic::ImageRef; use FAQ::OMatic::Bags; my %img_type = (); # type of each image. constant; no mod_perl # cache problem my %img_prop = (); # properties of each image. constant; no mod_perl # cache problem sub getImage { my $name = shift; require FAQ::OMatic::ImageData; # put off loading this file unless someone # actually requests data (meaning we're running # img.pm). No reason any other invocation should # have to load all that image data up. my $data = $FAQ::OMatic::ImageData::img{$name}; return '' if (not defined $data); $data =~ s/\n//gs; # get rid of line terminators return pack("H".length($data), $data); } sub validImage { my $name = shift; return defined($img_type{$name}); } sub getType { my $name = shift; my $typek = $img_type{$name}; return '' if (not defined $typek); return "jpeg" if ($typek eq 'jpg'); return "gif" if ($typek eq 'gif'); return "beats-me"; } sub getBagForImage { my $name = shift; my $typek = $img_type{$name}; die "undefined name" if (not defined $name); die "undefined typek for img $name" if (not defined $typek); return "$name.$typek"; } sub getImageUrl { my $name = shift; my $params = shift; my $forceBagWrite = shift || ''; my $bagName = getBagForImage($name); my $bagUrl = FAQ::OMatic::makeBagRef($bagName, $params); my $bagPath = $FAQ::OMatic::Config::bagsDir.$bagName; if (-f $bagPath and not $forceBagWrite) { return $bagUrl; } if (not defined $FAQ::OMatic::Config::bagsDir) { # fail obviously if bagsDir not configured -- this # happens when upgrading versions return "x:"; } # attempt to cache this image file in $bagsDir if (not open(CACHEIMAGE, ">$bagPath")) { FAQ::OMatic::gripe('problem', "write to $bagPath failed: $!"); # TODO: write to cache failed. Notify admin? # in the meantime, supply user with dynamically-generated image file return FAQ::OMatic::makeAref('-command'=>'img', '-blastAll'=>1, '-changedParams'=>{'name'=>$name}, '-refType'=>'url'); } # bag is saved, now write a .desc file my $bagDesc = FAQ::OMatic::Bags::getBagDesc($bagName); $bagDesc->setProperty('SizeWidth', $img_prop{$name}{'SizeWidth'}); $bagDesc->setProperty('SizeHeight', $img_prop{$name}{'SizeHeight'}); $bagDesc->setProperty('SizeBytes', $img_prop{$name}{'SizeBytes'}); $bagDesc->setProperty('Alt', $img_prop{$name}{'Alt'}); FAQ::OMatic::Bags::saveBagDesc($bagDesc); print CACHEIMAGE getImage($name); close CACHEIMAGE; return $bagUrl; } sub getImageRef { my $name = shift; my $imgargs = shift; my $params = shift; return ' ' if (defined($FAQ::OMatic::Config::noImages)); my $url = getImageUrl($name, $params); return "[bad image $name]" if (not $url); # look up size information to append to img tag my $bagName = getBagForImage($name); my $sw = FAQ::OMatic::Bags::getBagProperty($bagName, 'SizeWidth', ''); my $swt = ($sw ne '') ? " width=$sw" : ''; my $sh = FAQ::OMatic::Bags::getBagProperty($bagName, 'SizeHeight', ''); my $sht = ($sh ne '') ? " height=$sh" : ''; my $alt = FAQ::OMatic::Bags::getBagProperty($bagName, 'Alt', $name); if (wantarray) { return ("$alt", $sw, $sh); } else { return "\"$alt"; } } sub getImageRefCA { my $name = shift; my $imgargs = shift; my $ca = shift; # Category or Answer my $params = shift; $name = ($ca ? 'cat' : 'ans').$name; return getImageRef($name, $imgargs, $params); } sub bagAllImages { # writes every image in ImageData to the bags dir my $imgname; foreach $imgname (sort keys %img_type) { FAQ::OMatic::maintenance::hprint( "
bagging ".getBagForImage($imgname)."\n"); FAQ::OMatic::maintenance::hflush(); getImageUrl($imgname, {}, 'forceBagWrite'); } } # these properties are manually-defined, so they're not in the # section of this file that gets automatically regenerated. $img_prop{'ans-also'}{'Alt'} = '(Xref)'; $img_prop{'ans'}{'Alt'} = '(Answer)'; $img_prop{'ans-small'}{'Alt'} = '(Answer)'; $img_prop{'baglink'}{'Alt'} = '(Download)'; $img_prop{'cat-also'}{'Alt'} = '(Xref)'; $img_prop{'cat-small'}{'Alt'} = '(Category)'; $img_prop{'cat'}{'Alt'} = '(Category)'; $img_prop{'help-small'}{'Alt'} = '(?)'; $img_prop{'help'}{'Alt'} = '(?)'; # to regenerate: #:.,$-2!(cd ../../../img; ../dev-bin/encodeBin.pl -desc *) $img_type{'ans-also'} = 'gif'; $img_prop{'ans-also'}{'SizeWidth'} = '21'; $img_prop{'ans-also'}{'SizeHeight'} = '14'; $img_prop{'ans-also'}{'SizeBytes'} = '128'; $img_type{'ans-del-part'} = 'gif'; $img_prop{'ans-del-part'}{'SizeWidth'} = '23'; $img_prop{'ans-del-part'}{'SizeHeight'} = '28'; $img_prop{'ans-del-part'}{'SizeBytes'} = '183'; $img_type{'ans-dup-ans'} = 'gif'; $img_prop{'ans-dup-ans'}{'SizeWidth'} = '24'; $img_prop{'ans-dup-ans'}{'SizeHeight'} = '23'; $img_prop{'ans-dup-ans'}{'SizeBytes'} = '182'; $img_type{'ans-dup-part'} = 'gif'; $img_prop{'ans-dup-part'}{'SizeWidth'} = '23'; $img_prop{'ans-dup-part'}{'SizeHeight'} = '32'; $img_prop{'ans-dup-part'}{'SizeBytes'} = '194'; $img_type{'ans-edit-part'} = 'gif'; $img_prop{'ans-edit-part'}{'SizeWidth'} = '32'; $img_prop{'ans-edit-part'}{'SizeHeight'} = '31'; $img_prop{'ans-edit-part'}{'SizeBytes'} = '285'; $img_type{'ans-ins-part'} = 'gif'; $img_prop{'ans-ins-part'}{'SizeWidth'} = '32'; $img_prop{'ans-ins-part'}{'SizeHeight'} = '32'; $img_prop{'ans-ins-part'}{'SizeBytes'} = '261'; $img_type{'ans-opts'} = 'gif'; $img_prop{'ans-opts'}{'SizeWidth'} = '23'; $img_prop{'ans-opts'}{'SizeHeight'} = '28'; $img_prop{'ans-opts'}{'SizeBytes'} = '131'; $img_type{'ans-reorder'} = 'gif'; $img_prop{'ans-reorder'}{'SizeWidth'} = '23'; $img_prop{'ans-reorder'}{'SizeHeight'} = '28'; $img_prop{'ans-reorder'}{'SizeBytes'} = '191'; $img_type{'ans-small'} = 'gif'; $img_prop{'ans-small'}{'SizeWidth'} = '18'; $img_prop{'ans-small'}{'SizeHeight'} = '14'; $img_prop{'ans-small'}{'SizeBytes'} = '100'; $img_type{'ans-title'} = 'gif'; $img_prop{'ans-title'}{'SizeWidth'} = '32'; $img_prop{'ans-title'}{'SizeHeight'} = '32'; $img_prop{'ans-title'}{'SizeBytes'} = '257'; $img_type{'ans-to-cat'} = 'gif'; $img_prop{'ans-to-cat'}{'SizeWidth'} = '29'; $img_prop{'ans-to-cat'}{'SizeHeight'} = '26'; $img_prop{'ans-to-cat'}{'SizeBytes'} = '223'; $img_type{'ans'} = 'gif'; $img_prop{'ans'}{'SizeWidth'} = '23'; $img_prop{'ans'}{'SizeHeight'} = '28'; $img_prop{'ans'}{'SizeBytes'} = '150'; $img_type{'baglink'} = 'gif'; $img_prop{'baglink'}{'SizeWidth'} = '21'; $img_prop{'baglink'}{'SizeHeight'} = '14'; $img_prop{'baglink'}{'SizeBytes'} = '103'; $img_type{'cat-also'} = 'gif'; $img_prop{'cat-also'}{'SizeWidth'} = '25'; $img_prop{'cat-also'}{'SizeHeight'} = '14'; $img_prop{'cat-also'}{'SizeBytes'} = '139'; $img_type{'cat-del-part'} = 'gif'; $img_prop{'cat-del-part'}{'SizeWidth'} = '32'; $img_prop{'cat-del-part'}{'SizeHeight'} = '27'; $img_prop{'cat-del-part'}{'SizeBytes'} = '208'; $img_type{'cat-dup-ans'} = 'gif'; $img_prop{'cat-dup-ans'}{'SizeWidth'} = '26'; $img_prop{'cat-dup-ans'}{'SizeHeight'} = '23'; $img_prop{'cat-dup-ans'}{'SizeBytes'} = '201'; $img_type{'cat-dup-part'} = 'gif'; $img_prop{'cat-dup-part'}{'SizeWidth'} = '32'; $img_prop{'cat-dup-part'}{'SizeHeight'} = '27'; $img_prop{'cat-dup-part'}{'SizeBytes'} = '201'; $img_type{'cat-edit-part'} = 'gif'; $img_prop{'cat-edit-part'}{'SizeWidth'} = '32'; $img_prop{'cat-edit-part'}{'SizeHeight'} = '31'; $img_prop{'cat-edit-part'}{'SizeBytes'} = '286'; $img_type{'cat-ins-part'} = 'gif'; $img_prop{'cat-ins-part'}{'SizeWidth'} = '32'; $img_prop{'cat-ins-part'}{'SizeHeight'} = '27'; $img_prop{'cat-ins-part'}{'SizeBytes'} = '250'; $img_type{'cat-new-ans'} = 'gif'; $img_prop{'cat-new-ans'}{'SizeWidth'} = '32'; $img_prop{'cat-new-ans'}{'SizeHeight'} = '32'; $img_prop{'cat-new-ans'}{'SizeBytes'} = '253'; $img_type{'cat-new-cat'} = 'gif'; $img_prop{'cat-new-cat'}{'SizeWidth'} = '32'; $img_prop{'cat-new-cat'}{'SizeHeight'} = '32'; $img_prop{'cat-new-cat'}{'SizeBytes'} = '245'; $img_type{'cat-opts'} = 'gif'; $img_prop{'cat-opts'}{'SizeWidth'} = '32'; $img_prop{'cat-opts'}{'SizeHeight'} = '27'; $img_prop{'cat-opts'}{'SizeBytes'} = '165'; $img_type{'cat-reorder'} = 'gif'; $img_prop{'cat-reorder'}{'SizeWidth'} = '32'; $img_prop{'cat-reorder'}{'SizeHeight'} = '27'; $img_prop{'cat-reorder'}{'SizeBytes'} = '207'; $img_type{'cat-small'} = 'gif'; $img_prop{'cat-small'}{'SizeWidth'} = '18'; $img_prop{'cat-small'}{'SizeHeight'} = '14'; $img_prop{'cat-small'}{'SizeBytes'} = '104'; $img_type{'cat-title'} = 'gif'; $img_prop{'cat-title'}{'SizeWidth'} = '32'; $img_prop{'cat-title'}{'SizeHeight'} = '32'; $img_prop{'cat-title'}{'SizeBytes'} = '232'; $img_type{'cat'} = 'gif'; $img_prop{'cat'}{'SizeWidth'} = '32'; $img_prop{'cat'}{'SizeHeight'} = '27'; $img_prop{'cat'}{'SizeBytes'} = '185'; $img_type{'checked-large'} = 'gif'; $img_prop{'checked-large'}{'SizeWidth'} = '20'; $img_prop{'checked-large'}{'SizeHeight'} = '24'; $img_prop{'checked-large'}{'SizeBytes'} = '139'; $img_type{'checked'} = 'gif'; $img_prop{'checked'}{'SizeWidth'} = '16'; $img_prop{'checked'}{'SizeHeight'} = '17'; $img_prop{'checked'}{'SizeBytes'} = '104'; $img_type{'help-small'} = 'gif'; $img_prop{'help-small'}{'SizeWidth'} = '16'; $img_prop{'help-small'}{'SizeHeight'} = '12'; $img_prop{'help-small'}{'SizeBytes'} = '108'; $img_type{'help'} = 'gif'; $img_prop{'help'}{'SizeWidth'} = '32'; $img_prop{'help'}{'SizeHeight'} = '24'; $img_prop{'help'}{'SizeBytes'} = '181'; $img_prop{'picker'}{'SizeWidth'} = '256'; $img_prop{'picker'}{'SizeHeight'} = '128'; $img_prop{'picker'}{'SizeBytes'} = '3189'; $img_type{'picker'} = 'jpg'; $img_type{'space-large'} = 'gif'; $img_prop{'space-large'}{'SizeWidth'} = '20'; $img_prop{'space-large'}{'SizeHeight'} = '25'; $img_prop{'space-large'}{'SizeBytes'} = '61'; $img_type{'space'} = 'gif'; $img_prop{'space'}{'SizeWidth'} = '16'; $img_prop{'space'}{'SizeHeight'} = '16'; $img_prop{'space'}{'SizeBytes'} = '55'; $img_type{'unchecked'} = 'gif'; $img_prop{'unchecked'}{'SizeWidth'} = '16'; $img_prop{'unchecked'}{'SizeHeight'} = '16'; $img_prop{'unchecked'}{'SizeBytes'} = '79'; $img_type{'cat-to-ans'} = 'gif'; $img_prop{'cat-to-ans'}{'SizeWidth'} = '29'; $img_prop{'cat-to-ans'}{'SizeHeight'} = '26'; $img_prop{'cat-to-ans'}{'SizeBytes'} = '213'; 1;