Replace Dockerfile/Compose with single-container wrapper; new input/output layout; always build both PDF+DOCX via bin/resume-build; add .gitignore; update README and AGENTS.md; generate artifacts to output/ (ignored)
This commit is contained in:
117
bin/resume-build
Executable file
117
bin/resume-build
Executable file
@@ -0,0 +1,117 @@
|
||||
#!/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 <<EOF
|
||||
Usage: $0
|
||||
Builds all Markdown files in "$INPUT_DIR" to both PDF and DOCX into "$OUTPUT_DIR".
|
||||
|
||||
Env:
|
||||
PANDOC_IMAGE=${PANDOC_IMAGE}
|
||||
INPUT_DIR=${INPUT_DIR}
|
||||
OUTPUT_DIR=${OUTPUT_DIR}
|
||||
TEMPLATE=${TEMPLATE}
|
||||
REFDOC=${REFDOC}
|
||||
PDF_ENGINE=${PDF_ENGINE}
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
if [[ $# -gt 0 ]]; then usage; exit 1; fi
|
||||
build_all
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user