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