diff --git a/Makefile b/Makefile index 70ecfb0..4f88ce6 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ all: ./mkpicindex.sh > index.html.tmp && mv index.html.tmp index.html +static: + ./mkpicindex-static.sh 0 > index.html.tmp && mv index.html.tmp index.html clean: rm -rf index.html.tmp index.html style.css justify.js LICENSE diff --git a/mkpicindex-static.sh b/mkpicindex-static.sh index bfaef73..5569050 100755 --- a/mkpicindex-static.sh +++ b/mkpicindex-static.sh @@ -10,152 +10,200 @@ printf '%s' \ ' > LICENSE # CONFIGURE -GALLERY_TITLE="My Gallery" # browser title -GALLERY_WIDTH=1000 # how wide will the gallery be -GALLERY_ROW_HEIGHT=150 # how high will the justified rows be? -GALLERY_RANDOMIZE=false # enable random sorting (true,false) -BODY_STYLE="color:orange; background:black;" # -THUMBNAIL_QUALITY=83 # quality for thumbnails -THUMBNAIL_PATH="thm" # relative path to thumbnail folder -INCLUDE_HEADER="HEADER" # file with html to include before gallery -INCLUDE_FOOTER="FOOTER" # file with html to include after gallery +TITLE="My Gallery" # browser title +WIDTH=1000 # how wide will the gallery be +ROW_HEIGHT=150 # how high will the justified rows be? +THUMB_QUALITY=83 # quality for thumbnails +THUMB_PATH="thm" # relative path to thumbnail folder +THUMB_PADDING="6" # image padding +DEBUG=$1 # debug output + +# GLOBAL TMP VARIABLES +G_ROW_WIDTH=0 # combined pic width < WIDTH @ ROW_HEIGHT +G_ROW_FILES="" # pipe separated files < WIDTH +MORE=1 # trigger next loop ### ZE PROGAM STARTZ HERE ############################################## cleanup() { # DELETE BROKEN IMAGES printf '%s\n' "Removing incomplete thumbnails." >&2 - find $THUMBNAIL_PATH -name "*_tmp.*" -exec rm -v "{}" \; + find $THUMB_PATH -name "*_tmp.*" -exec rm -v "{}" \; exit 1 } trap cleanup 1 2 3 6 # CREATE THUMBNAIL DIRECTORY -mkdir -p $THUMBNAIL_PATH +mkdir -p "$THUMB_PATH" -# INCLUDE CUSTOM HEADER & FOOTER -FOOTER=$([ -f $INCLUDE_FOOTER ] && cat $INCLUDE_FOOTER | sed 's/^/ /g') -HEADER=$([ -f $INCLUDE_HEADER ] && cat $INCLUDE_HEADER | sed 's/^/ /g') +# OUTPUT HELPER +debug() { [ "$DEBUG" == "1" ] && printf '%s\n' "Debug: $1" >&2; } +console() { printf '%s\n' "$1" >&2; } -# PRINT HEADER -printf '%s%s%s%s%s\n' \ -" - - $GALLERY_TITLE - - - -$HEADER" - - -# take one image - # resize to $ROW_HEIGHT - # check if width exceeds $GALLERY_WIDTH - # if not: take next picture - # resize to $ROW_HEIGHT - # check if first picture width + second picture width exceeds $GALLERY_WIDTH - # if yes: - - - -# $1 - Width -# $2 - Height -# < - Ratio (f) -get_aspect_ratio() { - W=$1 # Width - H=$2 # Height - printf '%f' "$(printf "$FILE_WH" | awk -vTH=$TARGET_H '{ printf("%f", TH*($2/$1)) }')" +# CALCULATORS +get_width_by_height() { + # returns aspect ratio calculated width + local F=$1 # image file + local TH=$2 # target height + local WH="$(identify -format ' %w %h ' "$1" | awk '{ printf("%.3f %.3f",$1,$2) }')" + R="$(printf "$WH" | awk -vTH=$TH '{ printf("%.0f", TH*($1/$2)) }')" + printf '%.0f' "$(($R))" + debug "get_width_by_height: FILE=$F TARGET_HEIGHT=$TH FILE_WxH=$WH RET_WIDTH=$R" +} +get_height_by_width() { + # returns aspect ratio calculated height + local F=$1 # image file + local TW=$2 # target width + local WH="$(identify -format ' %w %h ' "$1" | awk '{ printf("%.3f %.3f",$1,$2) }')" + R="$(printf "$WH" | awk -vTW=$TW '{ printf("%.0f", TW*($2/$1)) }')" + printf '%.0f' "$R" + debug "get_height_by_width: FILE=$F TARGET_WIDTH=$TW FILE_WxH=$WH RET_HEIGHT=$R" } -# CALCULATE ASPECT RATIO WITH FOR TARGET ROW HEIGHT -# $1 - path to image -# $2 - target row height -# ret - calculated width for target height -get_width() { - local FILE="$1"; - local TARGET_H="$2"; - local FILE_WH="$(identify -format ' %w %h ' "$FILE" | awk '{ print $1" "$2 }')" - printf '%.0f' "$(printf "$FILE_WH" | awk -vTH=$TARGET_H '{ printf("%f", TH*($2/$1)) }')" +# CREATE THUMBNAIL +create_thumb() { + # $F - original + # $W - width + # $H - height + # $R - thumbnailpath + local F="$1" # original + local W="$2" # width + local H="$3" # height + local T="${F%%.*}-$H" + if ! [ -f "$THUMB_PATH/$T" ]; + then + case $(printf '%s' "${F##*.}" | tr '[:upper:]' '[:lower:]') in + gif) console "Creating Thumbnail: $THUMB_PATH/$T.gif" + convert -quality $THUMB_QUALITY -sharpen 2x2 \ + -coalesce -resize 6000x$H\> \ + -deconstruct "$F" \ + "$THUMB_PATH/${T}_tmp.gif" && \ + mv "$THUMB_PATH/${T}_tmp.gif" "$THUMB_PATH/$T.gif" + printf '%s' "$THUMB_PATH/$T.gif" ;; + *) convert -quality $THUMB_QUALITY -sharpen 2x2 \ + -resize 6000x$H\> "$F" \ + "$THUMB_PATH/${T}_tmp.jpeg" && \ + mv "$THUMB_PATH/${T}_tmp.jpeg" "$THUMB_PATH/$T.jpeg" + printf '%s' "$THUMB_PATH/$T.jpeg" ;; + esac + fi } -get_streched_height() { - printf "$GALLERY_HEIGHT $CURRENT_ROW_WIDTH $GALLERY_WIDTH" \ - | awk '{ printf("%f", ($2/$1)*$3) }' -} - -# ADD NEXT IMAGE AND DECIDE -# $1 - path to image -CURRENT_ROW_WIDTH=0 -CURRENT_ROW_FILES="" +# ADD IMAGE LOOP add_image() { - local FILE=$1 - local NEXT_W=$(get_width "$FILE" "$GALLERY_ROW_HEIGHT") - # when the next item with is too much for the current row.. - if [ $(( $CURRENT_ROW_WIDTH + $NEXT_W )) > $GALLERY_WIDTH ]; - # build gallery + local F=$1 # image file - # calculate aspect ratio of row_height and all items - # calculate target image height with gallery_width - get_streched_height; - # loop at images and resize to streched height - # resize items - # output souce + # How wide would the image be when we rescale it to $ROW_HEIGHT? + local NW=$(get_width_by_height "$F" "$ROW_HEIGHT") + debug "add_image: FILE=$F NW=${NW}x$ROW_HEIGHT" + + # We add images and their width to $G_ROW_WIDTH until $WIDTH will + # be exceeded. + if [ "$(( $G_ROW_WIDTH + $NW ))" -gt "$WIDTH" ]; then + + debug "add_image: max width reached with F=$F @ $G_ROW_WIDTH" + + # we're building a row now + printf "
\n"; + + # calculate how much we need to stretch images to fill the + # whole row. + RFH=$(printf "$G_ROW_WIDTH $WIDTH $ROW_HEIGHT" \ + | awk '{ printf("%.0f",$3*($2/$1)) }') + debug "RFH=$RFH" + + # loop through the images in this row and recalculate + # them with their new, real height. + local IFS='|'; for RF in $G_ROW_FILES; + do + local RFW=$(($(get_width_by_height "$RF" "$RFH") - 2*$THUMB_PADDING)) + debug "add_image: adding file: F=$RF with W=$RFW H=$RFH" + + local T=$(create_thumb "$RF" "$RFW" "$RFH") + debug "add_image: created thumbnail $T" + + # output HTML for image + console "Adding Image: $RF" + printf "
\n" + printf " \n" + printf " " + printf " \n" + printf "
\n" + done + + # we're done with this row now. + printf "
\n"; # set leftover file as for next iteration - CURRENT_ROW_WIDTH="$NEXT_W" - CURRENT_ROW_FILES="|$FILE" + G_ROW_WIDTH="$NW" + G_ROW_FILES="$F|" else # add more items... - CURRENT_ROW_WIDTH=$(( $CURRENT_ROW_WIDTH + $NEXT_W )) - CURRENT_ROW_FILES="$CURRENT_ROW_FILES|$FILE" + debug "add_image: width has not been reached, continue loop." + G_ROW_WIDTH=$(( $G_ROW_WIDTH + $NW )) + G_ROW_FILES="$F|$G_ROW_FILES" fi - - } +# HEADER +printf '%s\n' \ +' + + + My Gallery + + + +
+' - -for file in *.*; +### MAIN LOOP ########################################################## +for F in *.*; do - if [ -f "$file" ]; + if [ -f "$F" ]; then - case $(printf '%s' ${file##*.} | tr '[:upper:]' '[:lower:]') in - jpg|jpeg|png) - - - - *) printf '%s\n' "Ignoring: $file" >&2 ;; + case $(printf '%s' ${F##*.} | tr '[:upper:]' '[:lower:]') in + jpg|jpeg|png|gif) add_image "$F" ;; + *) console "Ignoring: $F" ;; esac fi done +### MAIN LOOP END ###################################################### + +# FOOTER +printf '%s\n' \ +'
+ +' -## RESCALE AND ADD IMAGE -## PARAM 1: original -## 2: thumbnail_basename -## 3: thumbnail_format (extension) -#add_image() { -# local FILE="$1" -# get_width "$1" 300 -# local THUMB="$THUMBNAIL_PATH/$2-$GALLERY_ROW_HEIGHT" -# local EXT="$3" -# printf '%s\n' "Adding image: $FILE" >&2 -# if ! [ -f "$THUMB.$EXT" ] && [ "$FILE" != "$THUMB.$EXT" ]; -# then convert -quality $THUMBNAIL_QUALITY -sharpen 2x2 \ -# -coalesce -resize 6000x$GALLERY_ROW_HEIGHT\> \ -# -deconstruct "$FILE" "${THUMB}_tmp.$EXT" && \ -# mv "${THUMB}_tmp.$EXT" "$THUMB.$EXT" -# fi -# local WH="$(identify -format ' %w %h ' "$THUMB.$EXT" \ -# | awk '{ print "width="$1" height="$2 }')" -# printf ' %s\n' "" -# printf ' %s\n' "" -# printf ' %s\n' '' -#} - ### MAIN LOOP ########################################################## #for file in *.*; @@ -173,10 +221,3 @@ done #done ### MAIN LOOP END ###################################################### - -# PRINT FOOTER -printf '%s%s\n' \ -" -$FOOTER - -"