#!/usr/bin/env bash set -euo pipefail IMAGE="md2gost" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" usage() { echo "Использование: md2gost file.md [-o dir]" echo " file.md - исходный Markdown-файл" echo " -o dir - выходная директория (по умолчанию ./build)" exit 1 } # Парсим аргументы INPUT_FILE="" OUTPUT_DIR="./build" while [[ $# -gt 0 ]]; do case "$1" in -o) OUTPUT_DIR="${2:-}" [[ -z "$OUTPUT_DIR" ]] && usage shift 2 ;; -h|--help) usage ;; -*) echo "неизвестный флаг: $1" >&2 usage ;; *) INPUT_FILE="$1" shift ;; esac done [[ -z "$INPUT_FILE" ]] && usage # Проверяем входной файл if [[ ! -f "$INPUT_FILE" ]]; then echo "ошибка: $INPUT_FILE не найден" >&2 exit 1 fi # Абсолютные пути INPUT_ABS="$(realpath "$INPUT_FILE")" OUTPUT_ABS="$(realpath -m "$OUTPUT_DIR")" mkdir -p "$OUTPUT_ABS" INPUT_BASE="$(basename "$INPUT_FILE")" # Собираем образ если нужно if ! docker image inspect "$IMAGE" &>/dev/null; then echo "образ $IMAGE не найден, собираю..." docker build -t "$IMAGE" "$SCRIPT_DIR" fi echo "-> конвертация $INPUT_FILE -> $OUTPUT_DIR/" # Запуск контейнера: # - вход: только .md файл (read-only) # - выход: директория для .tex и .pdf # - user: текущий пользователь (не root) docker run --rm \ -v "$INPUT_ABS:/input/$INPUT_BASE:ro" \ -v "$OUTPUT_ABS:/output" \ --user "$(id -u):$(id -g)" \ "$IMAGE" "/input/$INPUT_BASE" -o /output