#!/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 <