X-Git-Url: https://git.sommitrealweird.co.uk/bpgallery.git/blobdiff_plain/5207b33c23b0f42288bc6d1ff1b16960bdbf3d1f..c3a792f598a86e84f5e50186efaa671869aabd9a:/bpgallery.sh diff --git a/bpgallery.sh b/bpgallery.sh index e532c68..e3110fd 100755 --- a/bpgallery.sh +++ b/bpgallery.sh @@ -1,25 +1,25 @@ #!/usr/bin/env bash # bpgallery.sh - builds a simple 'gallery' from a collection of images -# Copyright (C) 2004 Brett Parker +# Copyright (C) 2004-2008 Brett Parker # -# 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 +# 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 +# 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 +# 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. set -f -VERSION="1.1.1+arch" +VERSION="1.1.4" function bpgallery_default_head() { cat <$caption_alt
$caption
+
$caption_alt
$caption
END } @@ -80,8 +80,9 @@ div.thumbnail { float: left; padding: 20px; border: 0px; - width: ${WIDTH}px; + width: ${MAXWIDTH}px; height: ${MAXHEIGHT}px; + text-align: center; } div.caption { @@ -176,6 +177,24 @@ function bpgallery_escape_url() { $ECHOCOMMAND $temp } +function bpgallery_cleanup_directory_name() { + temp=$1 + temp=${temp//\%/_} + temp=${temp//:/_} + temp=${temp//;/_} + temp=${temp// /_} + temp=${temp//$/_} + temp=${temp//&/_} + temp=${temp//+/_} + temp=${temp//,/_} + temp=${temp//\//_} + temp=${temp//=/_} + temp=${temp//\?/_} + temp=${temp//@/_} + temp=${temp//\"/_} + $ECHOCOMMAND $temp +} + declare -rf bpgallery_escape_url if [[ ! -z ${BPGALLERY_THEME} ]] ; then @@ -222,39 +241,150 @@ if [[ -z $TITLE ]]; then fi if [[ -z $CONVERTTOOL ]]; then - CONVERTTOOL=convert + hash convert + if [[ $? != 0 ]]; then + echo "Can't find convert, exiting" + exit 3 + fi + CONVERTTOOL=$(hash -t convert) +else + if [[ ! -x $CONVERTTOOL ]]; then + echo "Can't find convert at location $CONVERTTOOL, exiting" + exit 3 + fi fi if [[ -z $FINDCOMMAND ]]; then - FINDCOMMAND=find + hash find + if [[ $? != 0 ]]; then + echo "Can't find find, exiting" + exit 3 + fi + FINDCOMMAND=$(hash -t find) +else + if [[ ! -x $FINDCOMMAND ]]; then + echo "Can't find find at $FINDCOMMAND, exiting" + exit 3 + fi fi if [[ -z $XARGSCOMMAND ]]; then - XARGSCOMMAND=xargs + hash xargs + if [[ $? != 0 ]]; then + echo "Can't find xargs, exiting" + exit 3 + fi + XARGSCOMMAND=$(hash -t xargs) +else + if [[ ! -x $XARGSCOMMAND ]]; then + echo "Can't find xargs at $XARGSCOMMAND, exiting" + exit 3 + fi fi if [[ -z $ECHOCOMMAND ]]; then ECHOCOMMAND=echo +else + if [[ ! -x $ECHOCOMMAND ]]; then + echo "Can't find echo at $ECHOCOMMAND, exiting" + exit 3 + fi fi if [[ -z $SORTCOMMAND ]]; then - SORTCOMMAND=sort + hash sort + if [[ $? != 0 ]]; then + echo "Can't find sort, exiting" + exit 3 + fi + SORTCOMMAND=$(hash -t sort) +else + if [[ ! -x $SORTCOMMAND ]]; then + echo "Can't find sort, exiting" + exit 3 + fi fi if [[ -z $IDENTIFYCOMMAND ]]; then - IDENTIFYCOMMAND=identify + hash identify + if [[ $? != 0 ]]; then + echo "Can't find indentify, exiting" + exit 3 + fi + IDENTIFYCOMMAND=$(hash -t identify) +else + if [[ ! -x $IDENTIFYCOMMAND ]]; then + echo "Can't find identify at $IDENTIFYCOMMAND, exiting" + exit 3 + fi fi if [[ -z $HEADCOMMAND ]]; then - HEADCOMMAND=head + hash head + if [[ $? != 0 ]]; then + echo "Can't find head, exiting" + exit 3 + fi + HEADCOMMAND=$(hash -t head) +else + if [[ ! -x $HEADCOMMAND ]]; then + echo "Can't find head at $HEADCOMMAND, exiting" + exit 3 + fi fi if [[ -z $GREPCOMMAND ]]; then - GREPCOMMAND=grep + hash grep + if [[ $? != 0 ]]; then + echo "Can't find grep, exiting" + exit 3 + fi + GREPCOMMAND=$(hash -t grep) +else + if [[ ! -x $GREPCOMMAND ]]; then + echo "Can't find grep at $GREPCOMMAND, exiting" + exit 3 + fi fi if [[ -z $SEDCOMMAND ]]; then - SEDCOMMAND=sed + hash sed + if [[ $? != 0 ]]; then + echo "Can't find sed, exiting" + exit 3 + fi + SEDCOMMAND=$(hash -t sed) +else + if [[ ! -x $SEDCOMMAND ]]; then + echo "Can't find sed at $SEDCOMMAND, exiting" + exit 3 + fi +fi + +if [[ -z $WCCOMMAND ]]; then + hash wc + if [[ $? != 0 ]]; then + echo "Can't find wc, exiting" + exit 3 + fi + WCCOMMAND=$(hash -t wc) + WCCOMMAND="$WCCOMMAND -l" +else + if [[ ! -x $WCCOMMAND ]]; then + echo "Can't find wc at $WCCOMMAND, exiting" + exit 3 + fi + WCCOMMAND="$WCCOMMAND -l" +fi + +if [[ -z $MAXTHREADS ]]; then + # if there's more than 2G of memory, then do 4 threads, otherwise, just 1 + __total_memory=$(free -t -g | sed -ne '2 { s#Mem:[[:space:]]*\([0-9]*\)[[:space:]]*.*$#\1#; p; }') + if [[ $__total_memory -ge 2 ]]; then + MAXTHREADS=4 + else + MAXTHREADS=1 + fi fi if [[ -z $WIDTH ]]; then @@ -265,10 +395,6 @@ if [[ -z $IMAGEEXTENSIONS ]]; then IMAGEEXTENSIONS="jpeg jpg gif png"; fi -if [[ -z $WCCOMMAND ]]; then - WCCOMMAND="wc -l" -fi - if [[ -z $CAPTIONHEIGHT ]]; then CAPTIONHEIGHT=75 fi @@ -288,10 +414,13 @@ fi if [[ -z $PAGESDIRECTORY ]]; then PAGESDIRECTORY="" else - temp=${PAGESDIRECTORY:${#PAGESDIRECTORY}-1:1} - if [[ "x$temp" != "x/" ]] && [[ "x$temp" != "x\\" ]]; then - PAGESDIRECTORY=${PAGESDIRECTORY}/ - fi + removetrailingslashes=${PAGESDIRECTORY%/} + temp=$removetrailingslashes + while [[ $removetrailingslashes != $temp ]]; do + temp=$removetrailingslashes + removetrailingslashes=${temp%/} + done + PAGESDIRECTORY=$(bpgallery_escape_url "${PAGESDIRECTORY}") fi if [[ -z $MEDIUMWIDTH ]]; then @@ -302,6 +431,20 @@ if [[ -z $INDEXDOCUMENT ]]; then INDEXDOCUMENT=index.html fi +if [[ -z $MEDIUMDIRECTORY ]]; then + MEDIUMDIRECTORY=medium +else + # Strip out anything that might be broken + MEDIUMDIRECTORY=$(bpgallery_cleanup_directory_name "$MEDIUMDIRECTORY") +fi + +if [[ -z $ICONSDIRECTORY ]]; then + ICONSDIRECTORY=icons +else + # Strip out anything that might be broken + ICONSDIRECTORY=$(bpgallery_cleanup_directory_name "$ICONSDIRECTORY") +fi + if declare -F "bpgallery_${BPGALLERY_THEME}_page" > /dev/null ; then BPGALLERY_PAGE_FUNCTION="bpgallery_${BPGALLERY_THEME}_page" else @@ -366,9 +509,16 @@ set. WIDTH the width to make the icons + HEIGHT + the height to make the icons (sets up a bounding box with WIDTH) + MEDIUMWIDTH set the width of images in the medium size pages + MEDIUMHEIGHT + the height to make images in the medium size pages (sets up a + bounding box with MEDIUMWIDTH) + BPGALLERY_THEME set the theme to use (described below) @@ -398,11 +548,61 @@ Version: $VERSION END } +function check_dimensions() { + wantedwidth=$1 + wantedheight=$2 + dir=$3 + filename=$4 + if [ ! -e "$dir/$filename" ]; then + echo 0 + return + fi + iconwidth=$($IDENTIFYCOMMAND -format "%wx%h" "$dir/$filename") + iconheight=${iconwidth//*x} + iconwidth=${iconwidth//x*} + # are the dimensions correctish? + imagesizeright=1 + if [ ! -z $wantedheight ]; then + if [ $wantedwidth -ne $iconwidth ] && [ $wantedheight -ne $iconheight ]; then + imagesizeright=0 + else + # make sure that both of the dimensions are smaller than they + # should be + if [ $iconwidth -gt $wantedwidth ] || [ $iconheight -gt $wantedheight ]; then + imagesizeright=0 + fi + fi + else + if [ $wantedwidth -ne $iconwidth ]; then + imagesizeright=0 + fi + fi + echo $imagesizeright +} + function generate_resized_images() { $ECHOCOMMAND "Generating $2" + width=$1 + height=${width//*x} + if [ $width != $height ]; then + width=${width//x*} + else + height="" + fi currentimage=0 totalimages=$($FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | $WCCOMMAND); - imagestoupdate=$($FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | while read filename; do filename=${filename//\"/\\\"}; if [ ! -r "$2/$filename" ] || [ "$filename" -nt "$2/$filename" ] || [ $($IDENTIFYCOMMAND -format "%w" "$2/$filename") -ne $1 ]; then $ECHOCOMMAND $filename; fi; done | $WCCOMMAND) + imagestoupdate=$($FINDCOMMAND . $FINDIMAGESOPTIONS | + $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | + while read filename; do + filename=${filename//\"/\\\"} + imagesizeright=$(check_dimensions "$width" "$height" "$2" "$filename") + if [ ! -r "$2/$filename" ] || + [ "$filename" -nt "$2/$filename" ] || + [ $imagesizeright -ne 1 ]; then + $ECHOCOMMAND $filename + fi + done | + $WCCOMMAND) if [ $totalimages -eq 0 ]; then # might as well exit at this point - there are no pictures @@ -429,17 +629,41 @@ function generate_resized_images() { $ECHOCOMMAND "Generating $imagestoupdate of $totalimages $2" fi - $FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | while read filename; do tempfilename=${filename//\"/\\\"/}; if [ ! -r "$2/$tempfilename" ] || [ "$tempfilename" -nt "$2/$tempfilename" ] || [ $($IDENTIFYCOMMAND -format "%w" "$2/$filename") -ne $1 ]; then $ECHOCOMMAND -n $filename; $ECHOCOMMAND -n -e "\000"; fi; done | $XARGSCOMMAND -0 --verbose --max-procs=4 -I {} $CONVERTTOOL -resize $1 '{}' $2/'{}' 2>&1 | while read throwout; do $ECHOCOMMAND done: $currentimage/$imagestoupdate images; currentimage=$((currentimage+1)); done + $FINDCOMMAND . $FINDIMAGESOPTIONS | \ + $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | \ + while read filename; do + tempfilename=${filename//\"/\\\"/}; + imagesizeright=$(check_dimensions "$width" "$height" "$2" "$filename") + if [ ! -r "$2/$tempfilename" ] \ + || [ "$tempfilename" -nt "$2/$tempfilename" ] \ + || [ $imagesizeright -ne 1 ]; then + $ECHOCOMMAND -n $filename + $ECHOCOMMAND -n -e "\000" + fi + done | \ + $XARGSCOMMAND -0 --verbose --max-procs=$MAXTHREADS -I {} $CONVERTTOOL -resize $1 '{}' $2/'{}' 2>&1 | \ + while read throwout; do + $ECHOCOMMAND done: $currentimage/$imagestoupdate images + currentimage=$((currentimage+1)) + done $ECHOCOMMAND done: $imagestoupdate/$imagestoupdate images $ECHOCOMMAND "Completed generating $2 for $totalimages images" } function generate_thumbs() { - generate_resized_images $WIDTH icons + if [ ! -z $HEIGHT ]; then + generate_resized_images "${WIDTH}x${HEIGHT}" $ICONSDIRECTORY + else + generate_resized_images $WIDTH $ICONSDIRECTORY + fi } function generate_medium() { - generate_resized_images $MEDIUMWIDTH medium + if [ ! -z $MEDIUMHEIGHT ]; then + generate_resized_images "${MEDIUMWIDTH}x${MEDIUMHEIGHT}" $MEDIUMDIRECTORY + else + generate_resized_images $MEDIUMWIDTH $MEDIUMDIRECTORY + fi } function generate_pages() { @@ -536,7 +760,7 @@ function generate_pages() { } function generate_medium_pages() { - generate_pages __medium medium + generate_pages __${MEDIUMDIRECTORY} ${MEDIUMDIRECTORY} } function generate_general_page() { @@ -565,7 +789,7 @@ function generate_general_page() { caption="" fi - $BPGALLERY_PAGE_FUNCTION > "${PAGESDIRECTORY}$currentpage" + $BPGALLERY_PAGE_FUNCTION > "${UNIXPAGESDIRECTORY}$currentpage" } if [[ $OUTPUTHTML != 0 ]]; then @@ -627,8 +851,13 @@ if [[ "x$PAGESDIRECTORY" != "x" ]]; then $ECHOCOMMAND "Can't write to $PAGESDIRECTORY directory, exiting" exit 16 fi + UNIXPAGESDIRECTORY=$PAGESDIRECTORY/ + PAGESDIRECTORY=$(bpgallery_escape_url $PAGESDIRECTORY)/ BASEURL="../" +else + BASEURL="" + UNIXPAGESDIRECTORY="" fi if [ $GENERATEPAGESFORMEDIUMSIZE != 0 ]; then @@ -638,7 +867,7 @@ fi if [ $GENERATEPAGESFORFULLSIZE != 0 ]; then if [ $GENERATEPAGESFORMEDIUMSIZE != 0 ]; then - generate_pages __medium + generate_pages __${MEDIUMDIRECTORY} else generate_pages fi @@ -661,7 +890,7 @@ $ECHOCOMMAND "Adding Captions" extra="" if [ $GENERATEPAGESFORMEDIUMSIZE != 0 ]; then - extra=__medium + extra=__${MEDIUMDIRECTORY} fi $FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 -I {} $ECHOCOMMAND {} | $SORTCOMMAND -g | while read filename; do filename=${filename#./}; if [ -r captions.txt ]; then caption=$($GREPCOMMAND -E "^$filename " captions.txt); caption=${caption#* }; else caption=""; fi; if [ $GENERATEPAGESFORMEDIUMSIZE != 0 ]; then link=${PAGESDIRECTORY}$(bpgallery_escape_url "${filename}${extra}.html"); elif [ $GENERATEPAGESFORFULLSIZE != 0 ]; then link=${PAGESDIRECTORY}$(bpgallery_escape_url "${filename}.html"); else link=$(bpgallery_escape_url "$filename"); fi; filename=$(bpgallery_escape_url "$filename"); $BPGALLERY_THUMBSLINE_FUNCTION; done >> ${INDEXDOCUMENT} @@ -670,7 +899,7 @@ $BPGALLERY_TAIL_FUNCTION >> ${INDEXDOCUMENT} $ECHOCOMMAND "Finished generating the page" $ECHOCOMMAND "Generating stylesheet" -cd icons +cd $ICONSDIRECTORY MAXHEIGHT=$($FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 $IDENTIFYCOMMAND -format "%h\n" | $GREPCOMMAND -v "^$" | $SORTCOMMAND -g -r | $HEADCOMMAND -n 1) MAXWIDTH=$($FINDCOMMAND . $FINDIMAGESOPTIONS | $XARGSCOMMAND -0 $IDENTIFYCOMMAND -format "%w\n" | $GREPCOMMAND -v "^$" | $SORTCOMMAND -g -r | $HEADCOMMAND -n 1)