#!/bin/bash # -*- coding: utf-8 -*- # Test file for: compile_manuscript.sh THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(realpath "$THIS_DIR/../..")" # Test counter TESTS_RUN=0 TESTS_PASSED=0 TESTS_FAILED=0 # Colors GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' assert_success() { local cmd="$1" local desc="${2:-$cmd}" ((TESTS_RUN++)) if eval "$cmd" > /dev/null 2>&1; then echo -e "${GREEN}✓${NC} $desc" ((TESTS_PASSED++)) else echo -e "${RED}✗${NC} $desc" ((TESTS_FAILED++)) fi } assert_file_exists() { local file="$1" ((TESTS_RUN++)) if [ -f "$file" ]; then echo -e "${GREEN}✓${NC} File exists: $file" ((TESTS_PASSED++)) else echo -e "${RED}✗${NC} File missing: $file" ((TESTS_FAILED++)) fi } # Add your tests here test_placeholder() { echo "TODO: Add tests for compile_manuscript.sh" } # Run tests main() { echo "Testing: compile_manuscript.sh" echo "========================================" test_placeholder echo "========================================" echo "Results: $TESTS_PASSED/$TESTS_RUN passed" [ $TESTS_FAILED -gt 0 ] && exit 1 exit 0 } main "$@" # -------------------------------------------------------------------------------- # Start of Source Code from: /home/ywatanabe/proj/scitex-writer/scripts/shell/compile_manuscript.sh # -------------------------------------------------------------------------------- # #!/bin/bash # # -*- coding: utf-8 -*- # # Timestamp: "2025-11-11 06:58:09 (ywatanabe)" # # File: ./scripts/shell/compile_manuscript.sh # # # shellcheck disable=SC1091 # Don't follow sourced files # # export ORIG_DIR # ORIG_DIR="$(pwd)" # THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # LOG_PATH="$THIS_DIR/.$(basename "$0").log" # echo >"$LOG_PATH" # # # Resolve project root - critical for working directory independence (Issue #13) # GIT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" # if [ -z "$GIT_ROOT" ]; then # # Fallback: resolve from script location # GIT_ROOT="$(cd "$THIS_DIR/../.." && pwd)" # fi # export PROJECT_ROOT="$GIT_ROOT" # # # Change to project root to ensure relative paths work # cd "$PROJECT_ROOT" || exit 1 # # # Timestamp tracking # STAGE_START_TIME=0 # COMPILATION_START_TIME=$(date +%s) # # # New logging functions (clean format) # log_stage_start() { # local stage_name="$1" # STAGE_START_TIME=$(date +%s) # echo -e "\033[0;34m▸\033[0m \033[1m${stage_name}\033[0m" # } # # log_stage_end() { # local stage_name="$1" # local end_time # end_time=$(date +%s) # local elapsed=$((end_time - STAGE_START_TIME)) # echo -e "\033[0;32m✓\033[0m ${stage_name} \033[0;90m(${elapsed}s)\033[0m" # } # # log_success() { # echo -e " \033[0;32m✓\033[0m $1" # } # # log_warning() { # echo -e " \033[0;33m⚠\033[0m $1" # } # # log_error() { # echo -e " \033[0;31m✗\033[0m $1" # } # # log_info() { # if [ "${SCITEX_LOG_LEVEL:-1}" -ge 2 ]; then # echo -e " \033[0;90m→ $1\033[0m" # fi # } # # # Compatibility aliases # echo_success() { log_success "$1"; } # echo_warning() { log_warning "$1"; } # echo_error() { log_error "$1"; } # echo_info() { log_info "$1"; } # echo_header() { log_stage_start "$1"; } # # # Configurations # export SCITEX_WRITER_DOC_TYPE="manuscript" # source ./config/load_config.sh "$SCITEX_WRITER_DOC_TYPE" # echo # # # Log # touch "$LOG_PATH" >/dev/null 2>&1 # mkdir -p "$LOG_DIR" && touch "$SCITEX_WRITER_GLOBAL_LOG_FILE" # # # Shell options # set -e # set -o pipefail # # # Deafult values for arguments # do_p2t=false # no_figs=false # no_tables=false # do_verbose=false # do_crop_tif=false # do_force=false # no_diff=false # draft_mode=false # dark_mode=false # # usage() { # echo "Usage: $0 [options]" # echo "Options:" # echo " -nf, --no_figs Exclude figures for quick compilation (default: false)" # echo " -nt, --no_tables Exclude tables for quick compilation (default: false)" # echo " -nd, --no_diff Skip diff generation (saves ~10s) (default: false)" # echo " -d, --draft Draft mode: single-pass compilation (saves ~5s) (default: false)" # echo " -dm, --dark_mode Dark mode: black background, white text (default: false)" # echo " -p2t, --ppt2tif Converts Power Point to TIF on WSL (default: $do_p2t)" # echo " -c, --crop_tif Crop TIF images to remove excess whitespace (default: $do_crop_tif)" # echo " -q, --quiet Do not shows detailed logs for latex compilation (default: $do_verbose)" # echo " --force Force full recompilation (ignore cache) (default: $do_force)" # echo " -h, --help Display this help message" # echo "" # echo "Note: All options accept both hyphens and underscores (e.g., --no-figs or --no_figs)" # exit 0 # } # # parse_arguments() { # while [[ "$#" -gt 0 ]]; do # # Normalize option: replace underscores with hyphens for matching # local normalized_opt # normalized_opt=$(echo "$1" | tr '_' '-') # # case $normalized_opt in # -h | --help) usage ;; # -p2t | --ppt2tif) do_p2t=true ;; # -nf | --no-figs) no_figs=true ;; # -nt | --no-tables) no_tables=true ;; # -nd | --no-diff) no_diff=true ;; # -d | --draft) draft_mode=true ;; # -dm | --dark-mode) dark_mode=true ;; # -c | --crop-tif) do_crop_tif=true ;; # -v | --verbose) do_verbose=true ;; # -q | --quiet) do_verbose=false ;; # --force) do_force=true ;; # *) # echo "Unknown option: $1" # usage # ;; # esac # shift # done # } # # main() { # parse_arguments "$@" # # # Log command options # options_display="" # $do_p2t && options_display="${options_display} --ppt2tif" # $no_figs && options_display="${options_display} --no_figs" # $no_tables && options_display="${options_display} --no_tables" # $no_diff && options_display="${options_display} --no_diff" # $draft_mode && options_display="${options_display} --draft" # $dark_mode && options_display="${options_display} --dark_mode" # $do_crop_tif && options_display="${options_display} --crop_tif" # $do_verbose && options_display="${options_display} --verbose" # # # Show options only in verbose mode # if [ "${SCITEX_LOG_LEVEL:-1}" -ge 2 ] && [ -n "$options_display" ]; then # log_info "Options:$options_display" # fi # # # Verbosity # export SCITEX_WRITER_VERBOSE_PDFLATEX=$do_verbose # export SCITEX_WRITER_VERBOSE_BIBTEX=$do_verbose # # # Draft mode (single-pass compilation) # export SCITEX_WRITER_DRAFT_MODE=$draft_mode # # # Dark mode (black background, white text) # export SCITEX_WRITER_DARK_MODE=$dark_mode # # # Check dependencies # log_stage_start "Dependency Check" # ./scripts/shell/modules/check_dependancy_commands.sh # log_stage_end "Dependency Check" # # # Merge bibliography files if multiple exist # log_stage_start "Bibliography Merge" # ./scripts/shell/modules/merge_bibliographies.sh # log_stage_end "Bibliography Merge" # # # Apply citation style from config # log_stage_start "Citation Style" # ./scripts/shell/modules/apply_citation_style.sh # log_stage_end "Citation Style" # # # Run independent processing in parallel for speed # log_stage_start "Asset Processing" # # # Create temp files for parallel job outputs # local temp_dir # temp_dir=$(mktemp -d) # local fig_log="$temp_dir/figures.log" # local tbl_log="$temp_dir/tables.log" # local wrd_log="$temp_dir/words.log" # # # Run all three in parallel # ( # ./scripts/shell/modules/process_figures.sh "$no_figs" "$do_p2t" "$do_verbose" "$do_crop_tif" >"$fig_log" 2>&1 # echo $? >"$temp_dir/fig_exit" # ) & # local fig_pid=$! # # ( # ./scripts/shell/modules/process_tables.sh "$no_tables" >"$tbl_log" 2>&1 # echo $? >"$temp_dir/tbl_exit" # ) & # local tbl_pid=$! # # ( # ./scripts/shell/modules/count_words.sh >"$wrd_log" 2>&1 # echo $? >"$temp_dir/wrd_exit" # ) & # local wrd_pid=$! # # # Wait for all parallel jobs # wait $fig_pid $tbl_pid $wrd_pid # # # Display outputs only in verbose mode # if [ "${SCITEX_LOG_LEVEL:-1}" -ge 2 ]; then # log_info "Figure Processing:" # sed 's/^/ /' "$fig_log" # # log_info "Table Processing:" # sed 's/^/ /' "$tbl_log" # # log_info "Word Count:" # sed 's/^/ /' "$wrd_log" # fi # # # Check exit codes # local fig_exit # local tbl_exit # local wrd_exit # fig_exit=$(cat "$temp_dir/fig_exit") # tbl_exit=$(cat "$temp_dir/tbl_exit") # wrd_exit=$(cat "$temp_dir/wrd_exit") # # # Extract summary lines for normal mode # if [ "${SCITEX_LOG_LEVEL:-1}" -lt 2 ]; then # # Show only key results (remove file paths from grep output) # grep -hE "(figures compiled|tables compiled|Word counts updated)" "$fig_log" "$tbl_log" "$wrd_log" 2>/dev/null | sed 's/^/ /' || true # fi # # rm -rf "$temp_dir" # # # Fail if any job failed # if [ "$fig_exit" -ne 0 ] || [ "$tbl_exit" -ne 0 ] || [ "$wrd_exit" -ne 0 ]; then # log_error "Asset processing failed (fig=$fig_exit, tbl=$tbl_exit, wrd=$wrd_exit)" # exit 1 # fi # # log_stage_end "Asset Processing" # # # Compile documents # log_stage_start "TeX Compilation (Structure)" # ./scripts/shell/modules/compilation_structure_tex_to_compiled_tex.sh # log_stage_end "TeX Compilation (Structure)" # # # Engine Selection # log_stage_start "Engine Selection" # source ./scripts/shell/modules/select_compilation_engine.sh # # # Get engine from config or default to auto # SELECTED_ENGINE="${SCITEX_WRITER_ENGINE:-auto}" # # if [ "$SELECTED_ENGINE" = "auto" ]; then # # Auto-detection: try engines in order # SELECTED_ENGINE=$(auto_detect_engine) # echo_info "Auto-detected engine: $SELECTED_ENGINE" # else # # Explicit selection: verify availability # if ! verify_engine "$SELECTED_ENGINE" >/dev/null 2>&1; then # echo_warning "Requested engine '$SELECTED_ENGINE' not available" # echo_info "Falling back to auto-detection..." # SELECTED_ENGINE=$(auto_detect_engine) # echo_info "Selected engine: $SELECTED_ENGINE" # else # echo_info "Using requested engine: $SELECTED_ENGINE" # fi # fi # # # Export for downstream modules # export SCITEX_WRITER_SELECTED_ENGINE="$SELECTED_ENGINE" # echo_info "$(get_engine_info "$SELECTED_ENGINE")" # log_stage_end "Engine Selection" # # # TeX to PDF # log_stage_start "PDF Generation" # ./scripts/shell/modules/compilation_compiled_tex_to_compiled_pdf.sh # log_stage_end "PDF Generation" # # # Diff (skip if --no_diff specified) # if [ "$no_diff" = false ]; then # log_stage_start "Diff Generation" # ./scripts/shell/modules/process_diff.sh # log_stage_end "Diff Generation" # else # echo_info "Skipping diff generation (--no_diff specified)" # fi # # # Versioning # log_stage_start "Archive/Versioning" # ./scripts/shell/modules/process_archive.sh # log_stage_end "Archive/Versioning" # # # Cleanup # log_stage_start "Cleanup" # ./scripts/shell/modules/cleanup.sh # log_stage_end "Cleanup" # # # Final steps # log_stage_start "Directory Tree" # ./scripts/shell/modules/custom_tree.sh # log_stage_end "Directory Tree" # # # Final summary # echo "" # local final_time # final_time=$(date +%s) # local total_compilation_time=$((final_time - COMPILATION_START_TIME)) # echo -e "\033[1;32m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m" # echo -e "\033[1;32m Compilation Complete\033[0m" # echo -e "\033[0;32m Total time: ${total_compilation_time}s\033[0m" # echo -e "\033[0;32m Output: $SCITEX_WRITER_COMPILED_PDF\033[0m" # echo -e "\033[0;90m Log: $SCITEX_WRITER_GLOBAL_LOG_FILE\033[0m" # echo -e "\033[1;32m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m" # echo "" # } # # main "$@" 2>&1 | tee -a "$LOG_PATH" "$SCITEX_WRITER_GLOBAL_LOG_FILE" # # # EOF # -------------------------------------------------------------------------------- # End of Source Code from: /home/ywatanabe/proj/scitex-writer/scripts/shell/compile_manuscript.sh # --------------------------------------------------------------------------------