#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "$(date +"%Y-%m-%d %H:%M:%S") ($(whoami))"
# File: process_figures.sh
# Refactored modular version of process_figures.sh
# shellcheck disable=SC1091 # Don't follow sourced files
# Get script directory and resolve project root (Issue #13)
export ORIG_DIR
ORIG_DIR="$(pwd)"
THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MODULES_DIR="$THIS_DIR/process_figures_modules"
# Resolve project root from script location (safe for nested repos)
PROJECT_ROOT="$(cd "$THIS_DIR/../../.." && pwd)"
export PROJECT_ROOT
cd "$PROJECT_ROOT" || exit 1
# Source configuration
source ./config/load_config.sh manuscript >/dev/null 2>&1
# Source all modules
source "$MODULES_DIR/00_common.src"
source "$MODULES_DIR/01_caption_management.src"
source "$MODULES_DIR/02_format_conversion.src"
source "$MODULES_DIR/03_panel_tiling.src"
source "$MODULES_DIR/04_compilation.src"
# Additional utility functions not yet modularized
ensure_lower_letter_id() {
# Convert uppercase panel IDs to lowercase (01A_ -> 01a_)
for file in "$SCITEX_WRITER_FIGURE_CAPTION_MEDIA_DIR"/[0-9]*[A-Z]_*; do
[ -e "$file" ] || continue
local dir
dir=$(dirname "$file")
local bname
bname=$(basename "$file")
local new_basename
# shellcheck disable=SC2001 # sed needed for \L case conversion
new_basename=$(echo "$bname" | sed 's/\([0-9]*\)\([A-Z]\)_/\1\L\2_/')
if [ "$bname" != "$new_basename" ]; then
echo_info "Renaming: $bname -> $new_basename"
mv "$file" "$dir/$new_basename"
fi
done
}
crop_image() {
local input_file="$1"
local output_file="${2:-$input_file}"
if command -v mogrify >/dev/null 2>&1; then
mogrify -trim +repage "$input_file"
elif command -v convert >/dev/null 2>&1; then
convert "$input_file" -trim +repage "$output_file"
fi
}
crop_all_images() {
echo_info "Cropping all images..."
for jpg_file in "$SCITEX_WRITER_FIGURE_JPG_DIR"/*.jpg; do
[ -e "$jpg_file" ] || continue
crop_image "$jpg_file"
done
}
# Main function
main() {
local no_figs="${1:-false}"
local p2t="${2:-false}" # Convert PPTX to TIF
local verbose="${3:-false}"
local do_crop="${4:-false}" # Crop images
if [ "$verbose" = true ]; then
echo_info "Figure processing: Starting with parameters: "
echo_info "no_figs=$no_figs, p2t=$p2t, crop=$do_crop"
fi
# Initialize environment
init_figures
ensure_lower_letter_id
# Clean up panel captions that shouldn't exist
cleanup_panel_captions
# Ensure captions for main figures only
ensure_caption
if [ "$no_figs" = false ]; then
# Run the figure conversion cascade
convert_figure_formats_in_cascade "$p2t" "$do_crop"
# Post-processing
check_and_create_placeholders
auto_tile_panels "$no_figs"
fi
# Final compilation steps
compile_legends
handle_figure_visibility "$no_figs"
compile_figure_tex_files
# Report results
local compiled_count
compiled_count=$(find "$SCITEX_WRITER_FIGURE_COMPILED_DIR" -name "[0-9]*.tex" 2>/dev/null | wc -l)
if [ "$no_figs" = false ] && [ "$compiled_count" -gt 0 ]; then
echo_success "$compiled_count figures compiled"
fi
}
# Run if executed directly
if [ "${BASH_SOURCE[0]}" == "${0}" ]; then
main "$@"
fi
# EOF