mirror of
				https://github.com/flynx/photobook.git
				synced 2025-11-04 05:10:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			450 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			450 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
 | 
						|
#
 | 
						|
#
 | 
						|
#
 | 
						|
#----------------------------------------------------------------------
 | 
						|
 | 
						|
# 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 :
 |