#!/bin/bash # -*- coding: utf-8 -*- # File: scripts/shell/modules/check_crossrefs.sh # Purpose: Cross-reference validation for check_project.sh # Sourced by check_project.sh - requires log_pass, log_warn, log_detail functions check_crossrefs() { local doc_dir="$1" local doc_label="$2" local content_dir="$doc_dir/contents" local issues=() if [ ! -d "$content_dir" ]; then log_pass "Cross-references ($doc_label) - no contents" return fi # Collect existing figure IDs local fig_ids=() local fig_dir="$content_dir/figures/caption_and_media" if [ -d "$fig_dir" ]; then for f in "$fig_dir"/[0-9]*.tex; do [ -e "$f" ] || continue local base base=$(basename "$f" .tex) [[ "$base" =~ ^[0-9]+[a-zA-Z]_ ]] && continue fig_ids+=("$base") done fi # Collect existing table IDs local tab_ids=() local tbl_dir="$content_dir/tables/caption_and_media" if [ -d "$tbl_dir" ]; then for f in "$tbl_dir"/[0-9]*.tex; do [ -e "$f" ] || continue local base base=$(basename "$f" .tex) tab_ids+=("$base") done fi # Scan content .tex files for references for tex_file in "$content_dir"/*.tex; do [ -e "$tex_file" ] || continue local fname fname=$(basename "$tex_file") # Check figure references while IFS= read -r ref; do local found=false for fid in "${fig_ids[@]:-}"; do [[ "$fid" == "$ref" ]] && found=true && break done if ! $found; then issues+=("$fname: \\ref{fig:$ref} - no matching figure") fi done < <(grep -oP '\\ref\{fig:([^}]+)\}' "$tex_file" 2>/dev/null | sed 's/\\ref{fig://;s/}//' || true) # Check table references while IFS= read -r ref; do local found=false for tid in "${tab_ids[@]:-}"; do [[ "$tid" == "$ref" ]] && found=true && break done if ! $found; then issues+=("$fname: \\ref{tab:$ref} - no matching table") fi done < <(grep -oP '\\ref\{tab:([^}]+)\}' "$tex_file" 2>/dev/null | sed 's/\\ref{tab://;s/}//' || true) done if [ ${#issues[@]} -eq 0 ]; then log_pass "Cross-references ($doc_label)" else log_warn "Cross-references ($doc_label)" for i in "${issues[@]}"; do log_detail "$i" done fi } ###% EOF