#!/bin/sh
#
# Copyright (c) 2022-2024 by Friedemann Bartels
#
# This file may be distributed and/or modified under the
# conditions of the LaTeX Project Public License, either
# version 1.3c of this license or (at your option) any later
# version. The latest version of this license is in:
#
# http://www.latex-project.org/lppl.txt
#
# and version 1.3c or later is part of all distributions of
# LaTeX version 2008/05/04 or later.
#
version=1.1.1
_convert() {
turbo=$1
filename=$2
filenamecache=$3
fileextcache=$4
originalwidthsp=$5
originalheightsp=$6
originalcropleftsp=$7
originalcroprightsp=$8
originalcroptopsp=$9
originalcropbottomsp=${10}
density=${11}
displaywidth=${12}
displayheight=${13}
resizethreshold=${14}
unsharp=${15}
quality="${16}"
mkdir -p cache/"$filenamecache"
originalwidth=$( magick identify -ping -format %w "$filename" )
originalheight=$( magick identify -ping -format %h "$filename" )
width=$(( (10 * originalwidth * (originalwidthsp - originalcropleftsp - originalcroprightsp) / originalwidthsp + 5) / 10 ))
height=$(( (10 * originalheight * (originalheightsp - originalcroptopsp - originalcropbottomsp) / originalheightsp + 5) / 10 ))
cropleft=$(( (10 * originalwidth * originalcropleftsp / originalwidthsp + 5) / 10 ))
croptop=$(( (10 * originalheight * originalcroptopsp / originalheightsp + 5) / 10 ))
resizewidth=$(( (10 * displaywidth * 100 * density / 473628672 + 5) / 10 ))
if [ $(( resizewidth * resizethreshold / 100 )) -gt $width ]; then
resizewidth=$width
resizeheight=$height
else
resizeheight=$(( resizewidth * height / width + 1 ))
fi
x="x"
if [ $turbo = 1 ]; then
export MAGICK_THREAD_LIMIT=1
fi
if [ "$quality" != "" ]; then
quality="-quality $quality"
fi
if [ "$unsharp" != "" ]; then
unsharp="-unsharp $unsharp"
fi
magick "$filename" -crop $width$x$height+$cropleft+$croptop -resize $resizewidth$x$resizeheight $unsharp $quality "cache/$filenamecache/.g$fileextcache"
mv "cache/$filenamecache/.g$fileextcache" "cache/$filenamecache/g$fileextcache"
}
_startbatchprocess() {
success=0
for file in cache/*; do
if [ -f "$file" ]; then
success=1
name=$( basename "${file}" )
mv "$file" "cache/.$name" 2> /dev/null
if [ $? -eq 0 ]; then
line=$(head -n 1 "cache/.$name")
IFS="%"
set -- $line
IFS=" "
_convert 1 "$@"
rm "cache/.$name"
break
fi
fi
done
if [ $success -eq 1 ]; then
_startbatchprocess
fi
}
getwidth() {
if command -v magick >/dev/null 2>&1; then
filename=$1
originalwidth=$( magick identify -ping -format %w "$filename" )
echo $originalwidth
else
echo errormagicknotinstalled
fi
}
getheight() {
if command -v magick >/dev/null 2>&1; then
filename=$1
originalheight=$( magick identify -ping -format %h "$filename" )
echo $originalheight
else
echo errormagicknotinstalled
fi
}
optimize() {
if command -v magick >/dev/null 2>&1; then
filenamecache=$2
fileextcache=$3
if [ -f cache/"$filenamecache" ]; then
mv cache/"$filenamecache" cache/."$filenamecache" 2> /dev/null
if [ $? -eq 0 ]; then
line=$(head -n 1 "cache/.$filenamecache")
IFS="%"
set -- $line
IFS=" "
_convert 1 "$@"
rm "cache/.$filenamecache"
else
while [ ! -f cache/"$filenamecache"/g"$fileextcache" ]; do
sleep 0.05
done
fi
elif [ -d cache/"$filenamecache" ]; then
while [ ! -f cache/"$filenamecache"/g"$fileextcache" ]; do
sleep 0.05
done
else
_convert 0 "$@"
fi
echo ok
else
echo errormagicknotinstalled
fi
}
makeshadow() {
if command -v inkscape >/dev/null 2>&1; then
filename=$1
stdDeviation=$2
opacity=$3
fill=$4
width=$5
height=$6
framewidth=$7
frameheight=$8
frameborder=$9
frameradius=${10}
[ ! -d cache ] && mkdir cache
mkdir -p cache/$filename
echo "
" > cache/$filename/s.svg
inkscape cache/$filename/s.svg --export-dpi=600 --export-filename cache/$filename/s.pdf
rm cache/$filename/s.svg
echo ok
else
echo errorinkscapenotinstalled
fi
}
import() {
if [ -d import ]; then
importdir=import
elif [ "$PAGELAYOUT_IMPORT_DIRECTORY" != "" ]; then
if [ -d "$PAGELAYOUT_IMPORT_DIRECTORY" ]; then
importdir="$PAGELAYOUT_IMPORT_DIRECTORY"
else
echo $PAGELAYOUT_IMPORT_DIRECTORY
exit
fi
else
echo errornoimportdir
exit
fi
defaultdirectory=$( echo $1 | sed -e 's/^{//g' | sed -e 's/}{.*//g' )
directorylist=$( echo $1 | sed -e 's/^{//g' | sed -e 's/}$//g' | sed -e 's/}{/$/g' )
for entry in "$importdir"/*.*
do
if [ -f "$entry" ]; then
name=$( basename "${entry}" )
if [ "$directorylist" != "" ]; then
echo "$directorylist" | tr '$' '\n' | while read directory; do
if [ -f "$directory$name" ]; then
mv "$entry" "$directory"
fi
done
fi
if [ -f "$entry" ]; then
if [ -d "$defaultdirectory" ]; then
mv "$entry" "$defaultdirectory"
else
mv "$entry" .
fi
fi
cachename=$( echo "$name" | sed -e 's/\.[a-zA-Z]*$//g' )
rm -rf cache/"$cachename"*
fi
done
}
startturbo() {
file="$(echo $1 | sed -e 's/\.pdflatex$//g')"
if [ -f $file.tex ]; then
tmpdir=$( mktemp -d 2>/dev/null )/pagelayoutturbo$( date "+%Y%m%d%H%M%S" )$RANDOM
mkdir $tmpdir
cp $file.tex $tmpdir/pagelayoutturbobatchoptimizexyz.tex
command=$(echo $(ps -p $PPID -o command ))
engine=$(echo $command | sed -e 's/^[A-Z ]*//g' | sed -e 's/ .*//g' | tr -d '\n')
case "$command" in
*-shell-escape*)
shellescape="--shell-escape"
;;
esac
if [ "$engine" = "xelatex" ]; then
nopdf="-no-pdf"
fi
$engine $shellescape -interaction=batchmode $nopdf --output-directory $tmpdir $tmpdir/pagelayoutturbobatchoptimizexyz.tex > /dev/null
rm -rf $tmpdir
fi
}
batchoptimize() {
[ ! -d cache ] && mkdir cache
length=$(( $# / 15 ))
if command -v nproc >/dev/null 2>&1; then
cores=$( nproc )
else
cores=1
fi
[ $cores -gt $length ] && cores=$length
while [ $length -gt 0 ]; do
filenamecache="$2"
if [ ! -e cache/"$filenamecache" ]; then
index=0
while [ $index -lt 15 ]; do
if [ $index -eq 0 ]; then
item="$1"
else
item="$item%$1"
fi
shift
index=$(( index + 1 ))
done
echo $item > cache/"$filenamecache"
else
shift 15
fi
length=$(( length - 1 ))
done
cores=$(( cores - 1 ))
while [ $cores -gt 0 ]; do
_startbatchprocess &
sleep 0.01
cores=$(( cores - 1 ))
done
}
usage() {
cat <