Loading...
No commits yet
Not committed History
Blame
test_process_tables.sh • 20.3 KB
#!/bin/bash
# -*- coding: utf-8 -*-
# Test file for: process_tables.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 process_tables.sh"
}

# Run tests
main() {
    echo "Testing: process_tables.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/modules/process_tables.sh
# --------------------------------------------------------------------------------
# #!/bin/bash
# # -*- coding: utf-8 -*-
# # Timestamp: "2025-09-28 19:49:15 (ywatanabe)"
# # File: ./paper/scripts/shell/modules/process_tables.sh
# 
# # Quick check for --no_tables BEFORE expensive config loading
# NO_TABLES_ARG="${1:-false}"
# if [ "$NO_TABLES_ARG" = true ]; then
#     echo -e "\033[0;90mINFO: Running $0 ...\033[0m"
#     echo -e "\033[0;90mINFO:     Skipping all table processing (--no_tables specified)\033[0m"
#     exit 0
# fi
# 
# ORIG_DIR="$(pwd)"
# THIS_DIR="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)"
# LOG_PATH="$THIS_DIR/.$(basename $0).log"
# echo > "$LOG_PATH"
# 
# GIT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"
# 
# GRAY='\033[0;90m'
# GREEN='\033[0;32m'
# YELLOW='\033[0;33m'
# RED='\033[0;31m'
# NC='\033[0m' # No Color
# 
# echo_info() { echo -e "${GRAY}INFO: $1${NC}"; }
# log_info() {
#     if [ "${SCITEX_LOG_LEVEL:-1}" -ge 2 ]; then
#         echo -e "  \033[0;90m→ $1\033[0m"
#     fi
# }
# echo_success() { echo -e "${GREEN}SUCC: $1${NC}"; }
# echo_warning() { echo -e "${YELLOW}WARN: $1${NC}"; }
# echo_error() { echo -e "${RED}ERRO: $1${NC}"; }
# echo_header() { echo_info "=== $1 ==="; }
# # ---------------------------------------
# 
# # Timestamp tracking for table processing
# TABLE_STAGE_START=0
# log_table_stage_start() {
#     TABLE_STAGE_START=$(date +%s)
#     local timestamp=$(date '+%H:%M:%S')
#     echo_info "  [$timestamp] $1"
# }
# 
# log_table_stage_end() {
#     local end=$(date +%s)
#     local elapsed=$((end - TABLE_STAGE_START))
#     local timestamp=$(date '+%H:%M:%S')
#     echo_success "  [$timestamp] $1 (${elapsed}s)"
# }
# # ---------------------------------------
# 
# # Configurations
# source ./config/load_config.sh $SCITEX_WRITER_DOC_TYPE
# 
# # Logging
# touch "$LOG_PATH" >/dev/null 2>&1
# echo
# log_info "Running $0 ..."
# 
# function init_tables() {
#     # Cleanup and prepare directories
#     rm -f "$SCITEX_WRITER_TABLE_COMPILED_DIR"/*.tex
#     mkdir -p "$SCITEX_WRITER_TABLE_DIR" >/dev/null
#     mkdir -p "$SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR" >/dev/null
#     mkdir -p "$SCITEX_WRITER_TABLE_COMPILED_DIR" >/dev/null
#     echo > "$SCITEX_WRITER_TABLE_COMPILED_FILE"
# }
# 
# function xlsx2csv_convert() {
#     # Convert Excel files to CSV if xlsx2csv is available
#     if command -v xlsx2csv >/dev/null 2>&1; then
#         for xlsx_file in "$SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR"/[0-9]*.{xlsx,xls}; do
#             [ -e "$xlsx_file" ] || continue
# 
#             base_name=$(basename "$xlsx_file" | sed 's/\.\(xlsx\|xls\)$//')
#             csv_file="${SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR}/${base_name}.csv"
# 
#             # Convert only if CSV doesn't exist or is older than Excel file
#             if [ ! -f "$csv_file" ] || [ "$xlsx_file" -nt "$csv_file" ]; then
#                 echo_info "    Converting $xlsx_file to CSV..."
#                 xlsx2csv "$xlsx_file" "$csv_file"
#                 if [ $? -eq 0 ]; then
#                     echo_success "    Created $csv_file from Excel"
#                 else
#                     echo_warning "    Failed to convert $xlsx_file"
#                 fi
#             fi
#         done
#     fi
# }
# 
# function ensure_caption() {
#     # Create default captions for any table without one
#     for csv_file in "$SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR"/[0-9]*.csv; do
#         [ -e "$csv_file" ] || continue
#         local base_name=$(basename "$csv_file" .csv)
#         # Extract table number from filename like 01_seizure_count
#         local table_number=""
#         if [[ "$base_name" =~ ^([0-9]+)_ ]]; then
#             table_number="${BASH_REMATCH[1]}"
#         else
#             table_number="$base_name"
#         fi
#         local caption_file="${SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR}/${base_name}.tex"
# 
#         if [ ! -f "$caption_file" ] && [ ! -L "$caption_file" ]; then
#             echo_info "    Creating default caption for table $base_name"
#             mkdir -p $(dirname "$caption_file")
#             cat > "$caption_file" << EOF
# \\caption{\\textbf{
# TABLE TITLE HERE
# }
# \\smallskip
# \\
# \\text{
# TABLE CAPTION HERE.
# }}
# EOF
#         fi
#     done
# }
# 
# # Function removed - no longer needed for new naming convention
# 
# function check_csv_for_special_chars() {
#     # Check CSV file for potential problematic characters
#     local csv_file="$1"
#     local problem_chars="[&%$#_{}^~\\|<>]"
#     local problems=$(grep -n "$problem_chars" "$csv_file" 2>/dev/null || echo "")
#     if [ -n "$problems" ]; then
#         echo_warn "    Potential LaTeX special characters found in $csv_file:"
#         echo -e ${YELLOW}
#         echo "$problems" | head -5
#         echo "These may need proper LaTeX escaping."
#         echo -e ${NC}
#     fi
# }
# 
# function csv2tex() {
#     # Determine best method for CSV processing
#     local use_method="fallback"
# 
#     # Check for csv2latex command (best option)
#     if command -v csv2latex >/dev/null 2>&1; then
#         use_method="csv2latex"
#         echo_info "    Using csv2latex for table processing"
#     # Check if Python and pandas are available (second best)
#     elif command -v python3 >/dev/null 2>&1 && python3 -c "import pandas" 2>/dev/null; then
#         use_method="python"
#         echo_info "    Using Python with pandas for table processing"
#     # Check if Python is available without pandas
#     elif command -v python3 >/dev/null 2>&1; then
#         use_method="python_basic"
#         echo_info "    Using Python (basic) for table processing"
#     else
#         echo_warning "    Using fallback AWK processing for tables"
#     fi
# 
#     # Process each CSV file
#     for csv_file in "$SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR"/[0-9]*.csv; do
#         [ -e "$csv_file" ] || continue
# 
#         base_name=$(basename "$csv_file" .csv)
#         caption_file="${SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR}/${base_name}.tex"
#         compiled_file="$SCITEX_WRITER_TABLE_COMPILED_DIR/${base_name}.tex"
# 
#         case "$use_method" in
#             csv2latex)
#                 # Use csv2latex command - generate basic table structure
#                 # Note: csv2latex doesn't support captions or labels directly
#                 {
#                     echo "\\pdfbookmark[2]{Table ${base_name#0}}{table_${base_name}}"
#                     echo "\\begin{table}[htbp]"
#                     echo "\\centering"
#                     echo "\\footnotesize"
# 
#                     # Generate the tabular environment using csv2latex
#                     csv2latex --nohead --separator comma "$csv_file" 2>/dev/null
# 
#                     # Add caption if it exists
#                     if [ -f "$caption_file" ] || [ -L "$caption_file" ]; then
#                         cat "$caption_file"
#                     else
#                         echo "\\caption{Table ${base_name#0}: ${base_name#*_}}"
#                     fi
# 
#                     # Add label
#                     echo "\\label{tab:${base_name}}"
#                     echo "\\end{table}"
#                 } > "$compiled_file"
# 
#                 # Check if csv2latex succeeded (look for \begin{tabular} with single backslash)
#                 if [ -s "$compiled_file" ] && grep -q "\\\\begin{tabular}" "$compiled_file" 2>/dev/null; then
#                     echo_success "    $compiled_file compiled (using csv2latex)"
#                 else
#                     echo_warning "    csv2latex failed, trying fallback"
#                     csv2tex_single_fallback "$csv_file" "$compiled_file" "$caption_file"
#                 fi
#                 ;;
# 
#             python|python_basic)
#                 # Use our Python script
#                 local caption_arg=""
#                 if [ -f "$caption_file" ] || [ -L "$caption_file" ]; then
#                     temp_caption_file="/tmp/caption_${base_name}.txt"
#                     cat "$caption_file" > "$temp_caption_file"
#                     caption_arg="--caption-file $temp_caption_file"
#                 fi
# 
#                 if [ -f "./scripts/python/csv_to_latex.py" ]; then
#                     python3 ./scripts/python/csv_to_latex.py "$csv_file" "$compiled_file" $caption_arg
#                     if [ $? -eq 0 ]; then
#                         echo_success "    $compiled_file compiled (using Python)"
#                     else
#                         echo_warning "    Python processing failed, trying fallback"
#                         csv2tex_single_fallback "$csv_file" "$compiled_file" "$caption_file"
#                     fi
#                     [ -f "$temp_caption_file" ] && rm -f "$temp_caption_file"
#                 else
#                     csv2tex_single_fallback "$csv_file" "$compiled_file" "$caption_file"
#                 fi
#                 ;;
# 
#             *)
#                 # Use fallback AWK processing
#                 csv2tex_single_fallback "$csv_file" "$compiled_file" "$caption_file"
#                 ;;
#         esac
#     done
# }
# 
# function csv2tex_single_fallback() {
#     # Basic CSV processing for a single file (fallback method)
#     local csv_file="$1"
#     local compiled_file="$2"
#     local caption_file="$3"
# 
#     base_name=$(basename "$csv_file" .csv)
#     # Extract table number from filename like 01_seizure_count
#     if [[ "$base_name" =~ ^([0-9]+)_ ]]; then
#         table_number="${BASH_REMATCH[1]}"
#         table_clean_name="${base_name#*_}"
#     else
#         table_number="$base_name"
#         table_clean_name="$base_name"
#     fi
# 
#     # Pre-check CSV for problematic characters
#     check_csv_for_special_chars "$csv_file"
# 
#     # Basic AWK processing (existing code)
#     num_columns=$(head -n 1 "$csv_file" | awk -F, '{print NF}')
#     num_rows=$(wc -l < "$csv_file")
#     max_rows=30
# 
#     # Use standard font size for tables
#     # Standard academic paper convention: \footnotesize (8pt) for tables
#     fontsize="\\footnotesize"
# 
#     # Check if truncation needed
#     truncated=false
#     if [ $num_rows -gt $((max_rows + 1)) ]; then  # +1 for header
#         truncated=true
#         rows_omitted=$((num_rows - max_rows - 1))
#     fi
# 
#     {
#         echo "\\pdfbookmark[2]{Table ${table_number#0}}{table_${base_name}}"
#         echo "\\begin{table}[htbp]"
#         echo "\\centering"
#         echo "$fontsize"
#         
#         # Adjust tabcolsep based on number of columns to fit width
#         if [ $num_columns -gt 8 ]; then
#             echo "\\setlength{\\tabcolsep}{2pt}"  # Very tight for many columns
#         elif [ $num_columns -gt 6 ]; then
#             echo "\\setlength{\\tabcolsep}{3pt}"  # Tight spacing
#         elif [ $num_columns -gt 4 ]; then
#             echo "\\setlength{\\tabcolsep}{4pt}"  # Medium spacing
#         else
#             echo "\\setlength{\\tabcolsep}{6pt}"  # Normal spacing
#         fi
#         
#         # Use resizebox to ensure table fits within text width
#         echo "\\resizebox{\\textwidth}{!}{%"
#         echo "\\begin{tabular}{*{$num_columns}{l}}"
#         echo "\\toprule"
# 
#         # Simple header processing
#         head -n 1 "$csv_file" | awk -F, '{
#             for (ii=1; ii<=NF; ii++) {
#                 val = $ii
#                 gsub(/[_]/, "\\\\_", val)
#                 printf("\\textbf{%s}", val)
#                 if (ii < NF) printf(" & ")
#             }
#             print "\\\\"
#         }'
# 
#         echo "\\midrule"
# 
#         # Process data with potential truncation
#         if [ "$truncated" = true ]; then
#             # Show first max_rows-2 rows
#             tail -n +2 "$csv_file" | head -n $((max_rows - 2)) | awk -F, '{
#                 for (i=1; i<=NF; i++) {
#                     val = $i
#                     gsub(/[_]/, "\\\\_", val)
#                     printf("%s", val)
#                     if (i < NF) printf(" & ")
#                 }
#                 print "\\\\"
#             }'
# 
#             # Add truncation indicator
#             echo "\\midrule"
#             echo "\\multicolumn{$num_columns}{c}{\\textit{... $rows_omitted rows omitted ...}} \\\\"
#             echo "\\midrule"
# 
#             # Show last 2 rows
#             tail -n 2 "$csv_file" | awk -F, '{
#                 for (i=1; i<=NF; i++) {
#                     val = $i
#                     gsub(/[_]/, "\\\\_", val)
#                     printf("%s", val)
#                     if (i < NF) printf(" & ")
#                 }
#                 print "\\\\"
#             }'
#         else
#             # Simple data processing without truncation
#             tail -n +2 "$csv_file" | awk -F, '{
#                 for (i=1; i<=NF; i++) {
#                     val = $i
#                     gsub(/[_]/, "\\\\_", val)
#                     printf("%s", val)
#                     if (i < NF) printf(" & ")
#                 }
#                 print "\\\\"
#             }'
#         fi
# 
#         echo "\\bottomrule"
#         echo "\\end{tabular}"
#         echo "}"  # Close resizebox
#         
#         if [ -f "$caption_file" ] || [ -L "$caption_file" ]; then
#             if [ "$truncated" = true ]; then
#                 # Add truncation note to caption
#                 cat "$caption_file" | sed 's/}$//'
#                 echo "\\textit{Note: Table truncated to $max_rows rows from $num_rows total rows for display purposes.}}"
#             else
#                 cat "$caption_file"
#             fi
#         else
#             echo "\\caption{Table ${table_number#0}: ${table_clean_name//_/ }"
#             if [ "$truncated" = true ]; then
#                 echo "\\textit{Note: Table truncated to $max_rows rows from $num_rows total rows for display purposes.}"
#             fi
#             echo "}"
#         fi
# 
#         echo "\\label{tab:${base_name}}"
#         echo "\\end{table}"
#     } > "$compiled_file"
# 
#     echo_info "    $compiled_file compiled (using fallback)"
# }
# 
# function csv2tex_fallback() {
#     # Process all CSV files with fallback method
#     for csv_file in "$SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR"/[0-9]*.csv; do
#         [ -e "$csv_file" ] || continue
#         base_name=$(basename "$csv_file" .csv)
#         caption_file="${SCITEX_WRITER_TABLE_CAPTION_MEDIA_DIR}/${base_name}.tex"
#         compiled_file="$SCITEX_WRITER_TABLE_COMPILED_DIR/${base_name}.tex"
#         csv2tex_single_fallback "$csv_file" "$compiled_file" "$caption_file"
#     done
# }
# 
# function create_table_header() {
#     # Create a header/template table when no real tables exist
#     local header_file="$SCITEX_WRITER_TABLE_COMPILED_DIR/00_Tables_Header.tex"
# 
#     cat > "$header_file" << 'EOF'
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# %% TABLES
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# %% \clearpage
# \section*{Tables}
# \label{tables}
# \pdfbookmark[1]{Tables}{tables}
# 
# % Template table when no actual tables are present
# \begin{table}[htbp]
#     \centering
#     \caption{\textbf{Table 0: Placeholder}\\
#     \smallskip
#     To add tables to your manuscript:\\
#     1. Place CSV files in \texttt{caption\_and\_media/} with format \texttt{XX\_description.csv}\\
#     2. Create matching caption files \texttt{XX\_description.tex}\\
#     3. Reference in text using \texttt{Table\textasciitilde\textbackslash ref\{tab:XX\_description\}}\\
#     \smallskip
#     Example: \texttt{01\_seizure\_count.csv} with \texttt{01\_seizure\_count.tex}
#     }
#     \label{tab:0_Tables_Header}
#     \begin{tabular}{p{0.3\textwidth}p{0.6\textwidth}}
#         \toprule
#         \textbf{Step} & \textbf{Instructions} \\
#         \midrule
#         1. Add CSV & Place file like \texttt{01\_data.csv} in \texttt{caption\_and\_media/} \\
#         2. Add Caption & Create \texttt{01\_data.tex} with table caption \\
#         3. Compile & Run \texttt{./compile -m} to process tables \\
#         4. Reference & Use \texttt{\textbackslash ref\{tab:01\_data\}} in manuscript \\
#         \bottomrule
#     \end{tabular}
# \end{table}
# EOF
#     echo_info "    Created table header template with instructions"
# }
# 
# function gather_table_tex_files() {
#     # Gather all table tex files into the final compiled file
#     output_file="${SCITEX_WRITER_TABLE_COMPILED_FILE}"
#     rm -f "$output_file" > /dev/null 2>&1
#     echo "% Auto-generated file containing all table inputs" > "$output_file"
#     echo "% Generated by gather_table_tex_files()" >> "$output_file"
#     echo "" >> "$output_file"
# 
#     # First check if there are any real table files
#     local table_files=($(find "$SCITEX_WRITER_TABLE_COMPILED_DIR" -maxdepth 1 -name "[0-9]*.tex" 2>/dev/null | grep -v "00_Tables_Header.tex" | sort))
#     local has_real_tables=false
#     if [ ${#table_files[@]} -gt 0 ]; then
#         has_real_tables=true
#         # Don't add anything here - base.tex handles the section header and spacing
#     fi
# 
#     # If no real tables, create the header/template
#     if [ "$has_real_tables" = false ]; then
#         create_table_header
#     fi
# 
#     # Count available tables
#     table_count=0
#     for table_tex in $(find "$SCITEX_WRITER_TABLE_COMPILED_DIR" -name "[0-9]*.tex" 2>/dev/null | sort); do
#         if [ -f "$table_tex" ] || [ -L "$table_tex" ]; then
#             # Skip header if we have real tables
#             local basename=$(basename "$table_tex")
#             if [[ "$basename" == "00_Tables_Header.tex" ]] && [ "$has_real_tables" = true ]; then
#                 continue
#             fi
# 
#             # For header template when no real tables exist
#             if [[ "$basename" == "00_Tables_Header.tex" ]] && [ "$has_real_tables" = false ]; then
#                 echo "\\input{$table_tex}" >> "$output_file"
#             else
#                 # For real tables, input them directly
#                 echo "% Table from: $basename" >> "$output_file"
#                 echo "\\input{$table_tex}" >> "$output_file"
#             fi
#             echo "" >> "$output_file"
#             table_count=$((table_count + 1))
#         fi
#     done
# 
#     if [ $table_count -eq 0 ]; then
#         echo_warning "    No tables were found to compile."
#     else
#         echo_success "    $table_count tables compiled"
#     fi
# }
# 
# # Main execution
# log_table_stage_start "Initializing tables"
# init_tables
# log_table_stage_end "Initializing tables"
# 
# log_table_stage_start "Converting XLSX to CSV"
# xlsx2csv_convert  # Convert Excel files to CSV first
# log_table_stage_end "Converting XLSX to CSV"
# 
# log_table_stage_start "Ensuring captions exist"
# ensure_caption
# log_table_stage_end "Ensuring captions exist"
# 
# log_table_stage_start "Converting CSV to LaTeX"
# csv2tex
# log_table_stage_end "Converting CSV to LaTeX"
# 
# log_table_stage_start "Gathering table files"
# gather_table_tex_files
# log_table_stage_end "Gathering table files"
# 
# # EOF
# --------------------------------------------------------------------------------
# End of Source Code from: /home/ywatanabe/proj/scitex-writer/scripts/shell/modules/process_tables.sh
# --------------------------------------------------------------------------------