From 5782df72931e8f2f1b66003432ee2b4e2c8a7e71 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Tue, 7 Sep 2021 01:29:37 +0300 Subject: [PATCH] added make-images.sh Signed-off-by: Alex A. Naanou --- photobook.cls | 73 ++++--- scripts/make-images.sh | 430 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 474 insertions(+), 29 deletions(-) create mode 100644 scripts/make-images.sh diff --git a/photobook.cls b/photobook.cls index 579f8a8..80d917a 100644 --- a/photobook.cls +++ b/photobook.cls @@ -636,10 +636,12 @@ %---------------------------------------------------------------------- %%%% Initialization %% -%%% \DescribeMacro{\InitPages} +%% \DescribeMacro{\InitPages} % -%%% Initialize page dimensions. -%%% +%% Initialize page dimensions. +%% +%% This is not intended for direct use. +%% % XXX do we need to document this?? % ...is there a usecase for calling this manually? \newcommand\InitPages{ @@ -2326,15 +2328,17 @@ %% \begin{minipage}{\textwidth} %% \begin{verbatim} %% -%% + - - - - - - - - - + -%% . +---------------+ . -%% . | | . -%% . | | . -%% . | pagecell | . -%% . | | . -%% . | | . -%% . +---------------+ . -%% + - - - - - - - - - + +%% <-> bleed <-> bleed +%% +%% + - - - - - - - - - + + bleed +%% . +---------------+ . v +%% . | | . +%% . | | . +%% . | pagecell | . +%% . | | . +%% . | | . +%% . +---------------+ . + bleed +%% + - - - - - - - - - + v %% %% \end{verbatim} %% \end{minipage} @@ -2355,15 +2359,17 @@ %% \begin{minipage}{\textwidth} %% \begin{verbatim} %% -%% +-------------------+ -%% | + - - - - - - - + | -%% | . . | -%% | . . | -%% | . pagebleedcell . | -%% | . . | -%% | . . | -%% | + - - - - - - - + | -%% +-------------------+ +%% <-> bleed <-> bleed +%% +%% +-------------------+ + bleed +%% | + - - - - - - - + | v +%% | . . | +%% | . . | +%% | . pagebleedcell . | +%% | . . | +%% | . . | +%% | + - - - - - - - + | + bleed +%% +-------------------+ v %% %% \end{verbatim} %% \end{minipage} @@ -2391,6 +2397,8 @@ % XXX EXPERIMENTAL / TEST... %% \DescribeEnv{textcell} % +%% \EXPERIMENTAL +%% %% A cell taking up the page text block. % %% >> \begin{textcell}{}{} ... \end{textcell} @@ -2398,14 +2406,21 @@ %% \begin{minipage}{\textwidth} %% \begin{verbatim} %% -%% <-----------> \textwidth -%% +---------------+ -%% | +-----------+ | ^ -%% | | | | | \textheight -%% | | textcell | | | -%% | | | | | -%% | +-----------+ | v -%% +---------------+ +%% <-----------> \textwidth +%% +%% <-----------------> \pageblockwidth +%% +%% +-----------------+ ^ \pageblockheight +%% | | | +%% | +-----------+ | | ^ \textheight +%% | | | | | | +%% | | | | | | +%% | | textcell | | | | +%% | | | | | | +%% | | | | | | +%% | +-----------+ | | v +%% | | | +%% +-----------------+ v %% %% \end{verbatim} %% \end{minipage} diff --git a/scripts/make-images.sh b/scripts/make-images.sh new file mode 100644 index 0000000..f53349a --- /dev/null +++ b/scripts/make-images.sh @@ -0,0 +1,430 @@ +#!/bin/bash +shopt -s nullglob extglob + +#---------------------------------------------------------------------- +# +# Template structure: +# templates/ +# imagepage.tex +# textpage.tex +# ... +# $IMAGE_DIR/ +# $spread/ +# tweaks.tex +# template tweaks. +# loaded before the templates are handled. +# layout.tex +# manual layout of spread. +# if given rest of directory contents are +# ignored. +# fields: +# ${IMAGE0} +# ${CAPTION0} +# ${IMAGE1} +# ${CAPTION1} +# NOTE: if images are included, hi-res source +# substitution is not done here. +# .tpl +# indicates the spread template to use. +# if given the rest of the .tex files in +# directory are ignored. +# resolves to: +# templates/.tex +# fields: +# ${IMAGE0} +# ${CAPTION0} +# ${IMAGE1} +# ${CAPTION1} +# imagepage.tex +# image page template. +# fields: +# ${IMAGE} +# ${CAPTION} +# textpage.tex +# text page template. +# fields: +# ${TEXT} +# -imagepage.tpl +# -textpage.tpl +# indicates the image/text page template to use. +# ignored if explicit templates are given. +# image fields: +# ${IMAGE} +# ${CAPTION} +# text fields: +# ${TEXT} +# 00-.png +# image. +# if $IMAGE_HIRES_DIR is set then this will +# resolve to: +# $IMAGE_HIRES_DIR/ +# XXX hi-res substitution currently disabled. +# 01-.txt +# text. +# ... +# ... +# +# +# +# Env variables: +# IMAGE_HIRES_DIR= +# sets the path to which the hi-res images are resolved. +# +# +# +# +# XXX TODO: +# - revise printed comments... +# - add --help support... +# - add real arg handling... +# - add abbility to apply template to a specific page in spread... +# ...something like: +# -left.tpl +# -right.tpl +# +# +# +#---------------------------------------------------------------------- + +# defaults... + +CFG_FILE=`basename $0`.cfg + +TEMPLATE_PATH=templates/ + +IMAGE_DIR=pages/ + +#IMAGE_HIRES_DIR= + + +# Default timplates +#SINGLE_IMAGE=blank-image +SINGLE_IMAGE=imagebleedleft +DOUBLE_IMAGE=image-image + + +# load config... +[ -e $CFG_FILE ] && source $CFG_FILE + + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +printhelp(){ + echo "Usage: `basename $0` [ARGUMENTS] [PATH]" + echo " `basename $0` [ARGUMENTS] PATH FROM [COUNT]" + echo + echo "Arguments:" + echo " -h --help - print this help and exit." + echo " --templates=PATH" + echo " - path to search for templates (default: $TEMPLATE_PATH)." + echo " --single-image-tpl=NAME" + echo " - single image default template (default: $SINGLE_IMAGE)." + echo " --double-image-tpl=NAME" + echo " - double image default template (default: $DOUBLE_IMAGE)." + echo + echo "Parameters:" + echo " PATH - path to root pages directory (default: $IMAGE_DIR)" + echo " FROM - spread to start from (default: 0)" + echo " COUNT - number of spreads to generate (default: 1)" + echo + echo "Environment:" + echo " \$IMAGE_HIRES_DIR " + echo " - source directory for replacement hi-res images." + echo + echo "Configuration defaults can be stored in a config file: $CFG_FILE" + echo + echo "NOTE: COUNT is relevant iff FROM is given, otherwise all available " + echo " spreads are generated." + echo +} + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# handle arguments... + +while true ; do + case $1 in + -h|--help) + printhelp + exit + ;; + --templates) + TEMPLATE_PATH=$2 + shift + shift + ;; + --single-image-tpl) + SINGLE_IMAGE=$2 + shift + shift + ;; + --double-image-tpl) + DOUBLE_IMAGE=$2 + shift + shift + ;; + + *) + break + ;; + esac +done + + +if [ -z $1 ] ; then + IMAGE_DIR=pages/ +else + IMAGE_DIR=$1/ +fi + + +# XXX add support for negative indexing... +FROM=$2 +COUNT=$( [ -z $3 ] && echo 1 || echo $3 ) +STOP=$(( FROM + COUNT )) + + + +#---------------------------------------------------------------------- + +# XXX should we report images w/o captions??? +getCaption(){ + local C=`basename "${1%.*}"` + #C="${C/[0-9]-}" + C="captions/${C}.txt" + + if [ -e "${C}" ] ; then + C=`cat "${C}" | sed 's/\\\/\\\\\\\/g'` + else + C="" + fi + + echo ${C[*]} +} + + +getTemplate(){ + local SPREAD=$1 + local TYPE=$2 + local TEMPLATE=($SPREAD/*-$TYPE.tex) + if [ -z $TEMPLATE ] ; then + TEMPLATE=($SPREAD/*-$TYPE.tpl) + if ! [ -z $TEMPLATE ] ; then + TEMPLATE=${TEMPLATE/$SPREAD\//} + TEMPLATE=${TEMPLATE/[0-9]-/} + TEMPLATE="$TEMPLATE_PATH/${TEMPLATE[0]%-${TYPE}.*}.tex" + fi + fi + if [ -z $TEMPLATE ] ; then + TEMPLATE="$TEMPLATE_PATH/${TYPE}.tex" + fi + echo $TEMPLATE +} + +anotatePath(){ + if [ -z "$1" ] || [ -z "$ANOTATE_IMAGE_PATHS" ] ; then + return + fi + path=$(basename ${1%.*}) + # NOTE: did not figure out how to make a verbatim comment in latex + # so here we are, doing it in shell... + path=${path//_/\\_} + echo "\\marginpar{\\pdfcomment{Image: $path}}" +} + + +#---------------------------------------------------------------------- + + +echo %---------------------------------------------------------------------- +echo % +echo % WARNING: This file is auto-generated by make-images.sh and will be +echo "% overwritten on next run..." +echo % +echo "% Image source (preview): \"$IMAGE_DIR\"" +echo "% Image source (hi-res): \"$IMAGE_HIRES_DIR\"" +echo % +echo %---------------------------------------------------------------------- +echo % +#echo % set image source directory... +#echo "\\graphicspath{{${IMAGE_DIR}}}" +#echo % +#echo %---------------------------------------------------------------------- +#echo % +# +#cd ${IMAGE_DIR} + +l=$(ls "$IMAGE_DIR/" | wc -l) +c=0 + +for spread in "${IMAGE_DIR}"/* ; do + # skip non-spreads... + if ! [ -d "$spread" ] ; then + continue + fi + + c=$(( c + 1 )) + + # if $FROM is given print only stuff in range... + [ -z $FROM ] \ + || if (( $(( c - 1 )) < $FROM )) || (( $c > $STOP )) ; then + continue + fi + + # if we are building only a specific spread... + ##if ! [ -z $SPREAD ] && [[ "$spread" != "$IMAGE_DIR/$SPREAD" ]]; then + ## continue + ##fi + + if ! [ -z $SKIP_FIRST ] ; then + echo % + echo % + echo % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + fi + SKIP_FIRST=1 + # skip temporarily disabled... + if [ -z ${spread/-*/} ] ; then + echo "% spread: ${spread/-/}: skipped..." | tee >(cat >&2) + echo % + continue + else + printf "Spread ($c/$l): ${spread/-/} \r" >&2 + echo "% spread: ${spread/-/}" + fi + + + # auto layout / templates... + # NOTE: to use a specific template just `touch .tpl` + # in the spread directory... + + # layout tweaks... + tweaks=($spread/*tweak.tex) + if ! [ -z ${tweaks} ] ; then + echo "% tweaks: ${tweaks[0]}" + cat ${tweaks[0]} + fi + + + # NOTE: we also get *.txt files here... + items=($spread/*.!(tex|tpl|bak)) + + # get hi-res image paths... + if ! [ -z $IMAGE_HIRES_DIR ] ; then + C=0 + for img in "${items[@]}" ; do + # skip non-images... + if [[ "$img" == "${img/.txt/}" ]] ; then + #new="../$IMAGE_HIRES_DIR/`basename ${img/[0-9]-/}`" + new="$IMAGE_HIRES_DIR/`basename ${img/[0-9]-/}`" + # ignore file ext for availability test... + # NOTE: the first match may be an unsupported format... + new="${new%.*}" + new=($new.*) + if [ -e "${new[0]}" ] ; then + items[$C]=${new[0]} + else + echo % + echo "% WARNING: hi-res image not found for: \"${img}\" -> \"${new}\"" | tee >(cat >&2) + echo % + fi + fi + C=$(( C + 1 )) + done + fi + + + # manual layout... + layout=($spread/*layout.tex) + if ! [ -z $layout ] ; then + TEMPLATE=${layout[0]} + + # templates and partial templates... + else + # spread template... + TEMPLATE=($spread/*.tpl) + # skip page template refs: *-imagepage.tpl / *-textpage.tpl + # XXX this will also eat 0-imagepage.tpl / 20-textpage.tpl -- do a better pattern... + if ! [ -z $TEMPLATE ] ; then + TEMPLATE=(`ls "$spread/"*.tpl | egrep -v '.*-(imagepage|textpage)\.tpl'`) + fi + # no template explicitly defined -> match auto-template... + AUTO= + if [ -z $layout ] && [ -z $TEMPLATE ] ; then + AUTO=" (auto)" + if [ ${#items[@]} == 1 ] ; then + TEMPLATE=$SINGLE_IMAGE + + # multiple items... + else + C=0 + for img in "${items[@]}" ; do + C=$(( C + 1 )) + P=`[ $C == 1 ] && echo "left" || echo "right"` + + # image... + if [ "${img/.txt/}" == "${img}" ] ; then + echo % + echo "% $P page (image)..." + TEMPLATE=`getTemplate "$spread" "imagepage"` + echo % page template: $TEMPLATE + anotatePath "${img}" + CAPTION=`getCaption "${img}"` + cat "${TEMPLATE}" \ + | sed "s%\${IMAGE0\?}%${img%.*}%" \ + | sed "s%\${CAPTION0\?}%${CAPTION}%" + + # text... + else + echo % + echo "% $P page (text)..." + TEMPLATE=`getTemplate "$spread" "textpage"` + echo % page template: $TEMPLATE + cat "${TEMPLATE}" \ + | sed "s%\${TEXT}%${img}%" + fi + + # reset for next page... + TEMPLATE= + # only two pages at a time... + [ $C == 2 ] && break + done + fi + fi + # formatting done... + [ -z $TEMPLATE ] && continue + + # format... + TEMPLATE=${TEMPLATE/$spread\//} + TEMPLATE=${TEMPLATE/[0-9]-/} + # get... + TEMPLATE="$TEMPLATE_PATH/${TEMPLATE[0]%.*}.tex" + fi + + # captions... + CAPTION0=`getCaption "${items[0]}"` + CAPTION1=`getCaption "${items[1]}"` + + echo "% template: (template${AUTO}: $TEMPLATE)" + anotatePath "${items[0]}" + + # fill the template... + cat "${TEMPLATE}" \ + | sed "s%\${IMAGE0\?}%${items[0]%.*}%" \ + | sed "s%\${CAPTION0\?}%${CAPTION0}%" \ + | sed "s%\${IMAGE1}%${items[1]%.*}%" \ + | sed "s%\${CAPTION1}%${CAPTION1}%" +done + +echo % +echo % +echo % +echo %---------------------------------------------------------------------- +echo + +echo "Spread created: $c of $l " >&2 + + + +#---------------------------------------------------------------------- +# vim:set ts=4 sw=4 :