#!/usr/bin/env bash set -euo pipefail # Resume builder wrapper that runs Pandoc inside a Docker container. # # Layout assumptions (relative to repo root): # - Input Markdown files: resumes/input/*.md # - Output artifacts: output/*.pdf and output/*.docx # - Templates: templates/resume-template.tex, templates/resume-reference.docx # # Usage: # bin/resume-build # build all inputs to both PDF and DOCX (single container) # # Config via env vars: # PANDOC_IMAGE (default: pandoc/latex:latest) # PDF_ENGINE (default: xelatex) # TEMPLATE (default: templates/resume-template.tex) # REFDOC (default: templates/resume-reference.docx) # INPUT_DIR (default: resumes/input) # OUTPUT_DIR (default: output) PANDOC_IMAGE=${PANDOC_IMAGE:-danteev/texlive:latest} PDF_ENGINE=${PDF_ENGINE:-xelatex} INPUT_DIR=${INPUT_DIR:-resumes/input} OUTPUT_DIR=${OUTPUT_DIR:-output} TEMPLATE=${TEMPLATE:-templates/resume-template.tex} REFDOC=${REFDOC:-templates/resume-reference.docx} TEXLIVE_INSTALL=${TEXLIVE_INSTALL:-""} REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd) cd "$REPO_ROOT" err() { echo "[resume-build] $*" >&2; } log() { echo "[resume-build] $*"; } require() { command -v "$1" >/dev/null 2>&1 || { err "Missing dependency: $1"; exit 1; } } run_docker() { # Runs a command in the pandoc container with repo mounted at /data local user opt_user if user=$(id -u 2>/dev/null) && group=$(id -g 2>/dev/null); then opt_user=( -u "${user}:${group}" ) else opt_user=() fi local cmd=( docker run --rm "${opt_user[@]}" -v "$REPO_ROOT:/data" -w /data --entrypoint /bin/sh \ "$PANDOC_IMAGE" ) "${cmd[@]}" -c "$*" } cmd_pandoc_pdf() { # echo PDF pandoc command local in_md=$1 out_pdf=$2 template=$3 engine=$4 printf 'pandoc %q -o %q --from markdown+autolink_bare_uris --template=%q --pdf-engine=%q' \ "$in_md" "$out_pdf" "$template" "$engine" } cmd_pandoc_docx() { # echo DOCX pandoc command local in_md=$1 out_docx=$2 refdoc=$3 printf 'pandoc %q -o %q --from markdown+autolink_bare_uris --reference-doc=%q' \ "$in_md" "$out_docx" "$refdoc" } build_all() { require docker [[ -d "$INPUT_DIR" ]] || { err "Input dir not found: $INPUT_DIR"; exit 1; } mkdir -p "$OUTPUT_DIR" shopt -s nullglob local files=( "$INPUT_DIR"/*.md ) if (( ${#files[@]} == 0 )); then err "No markdown files in $INPUT_DIR"; exit 1 fi local batch="set -e; if [ -n \"${TEXLIVE_INSTALL}\" ]; then tlmgr install ${TEXLIVE_INSTALL} || true; fi"; local first=1 for f in "${files[@]}"; do local base md_in pdf_out docx_out base=$(basename "${f%.md}") md_in="/data/${f}" pdf_out="/data/${OUTPUT_DIR}/${base}.pdf" docx_out="/data/${OUTPUT_DIR}/${base}.docx" log "PDF <- $f" batch+=" && " batch+=$(cmd_pandoc_pdf "$md_in" "$pdf_out" "/data/${TEMPLATE}" "$PDF_ENGINE") log "DOCX <- $f" batch+=" && " batch+=$(cmd_pandoc_docx "$md_in" "$docx_out" "/data/${REFDOC}") done run_docker "$batch" } usage() { cat <