photobook/scripts/make-images.sh
Alex A. Naanou fbf4a951d8 added an English version of the slides...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-03-01 23:26:09 +03:00

451 lines
10 KiB
Bash

#!/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.
# <spread-template-name>.tpl
# indicates the spread template to use.
# if given the rest of the .tex files in
# directory are ignored.
# resolves to:
# templates/<spread-template-name>.tex
# fields:
# ${IMAGE0}
# ${CAPTION0}
# ${IMAGE1}
# ${CAPTION1}
# imagepage.tex
# image page template.
# fields:
# ${IMAGE}
# ${CAPTION}
# textpage.tex
# text page template.
# fields:
# ${TEXT}
# <spread-template-name>-imagepage.tpl
# <spread-template-name>-textpage.tpl
# indicates the image/text page template to use.
# ignored if explicit templates are given.
# image fields:
# ${IMAGE}
# ${CAPTION}
# text fields:
# ${TEXT}
# 00-<image>.png
# image.
# if $IMAGE_HIRES_DIR is set then this will
# resolve to:
# $IMAGE_HIRES_DIR/<image>
# XXX hi-res substitution currently disabled.
# 01-<text>.txt
# text.
# ...
# ...
#
#
#
# Env variables:
# IMAGE_HIRES_DIR=<path>
# sets the path to which the hi-res images are resolved.
#
#
#
#
# XXX TODO:
# - revise printed comments...
# - add real arg handling...
# - add abbility to apply template to a specific page in spread...
# ...something like:
# <template-name>-left.tpl
# <template-name>-right.tpl
# - add multiple images/captions...
#
#
#
#----------------------------------------------------------------------
# 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 "Generate LaTeX layout from directory structure."
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 " \$ANOTATE_IMAGE_PATHS "
echo " - if true add image paths in anotations."
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
echo "Examples:"
echo " $ `basename $0` ./pages > pages.tex"
echo " - generate a layout fron the contents of ./pages"
echo
echo " $ IMAGE_HIRES_DIR=images/hi-res `basename $0` ./pages"
echo " - generate a layout fron the contents of ./pages and "
echo " replaceing local images with images in ./images/hi-res"
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
;;
# handle unknown options...
-*|--*)
echo "Error: unknown option \"$1\""
exit
;;
*)
break
;;
esac
done
if [ -z $1 ] ; then
IMAGE_DIR=pages/
else
IMAGE_DIR=$1/
fi
# calculate spread index range...
# 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 "\\pdfmargincomment{Image: $path}%"
echo "\\pdfcommentcell{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 <template-name>.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 :