Add the ledger schema, class router, lint codes, ingest/build pipeline, and three work-tree examples: align derivation, superfig delegation, and supertensor delegation.
62 lines
1.9 KiB
Bash
Executable File
62 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Raster one ledger figure from paper.pdf via pdftoppm. crop_bbox is 200 dpi page pixels.
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
WORK=""
|
|
FID=""
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--work|--out) WORK="$2"; shift 2 ;;
|
|
--id) FID="$2"; shift 2 ;;
|
|
*) echo "usage: screenshot.sh --work DIR --id F2" >&2; exit 2 ;;
|
|
esac
|
|
done
|
|
[[ -n "$WORK" && -n "$FID" ]] || { echo "need --work and --id" >&2; exit 2; }
|
|
|
|
"$ROOT/scripts/python" - "$WORK" "$FID" <<'PY'
|
|
import sys, tempfile, subprocess, shutil
|
|
from pathlib import Path
|
|
import yaml
|
|
|
|
work = Path(sys.argv[1])
|
|
fid = sys.argv[2]
|
|
ledger = yaml.safe_load((work / "ledger.yaml").read_text())
|
|
fig = next((f for f in (ledger.get("figures") or []) if f.get("id") == fid), None)
|
|
if fig is None:
|
|
sys.exit(f"no figure {fid}")
|
|
pages = fig.get("source_pages") or []
|
|
if not pages:
|
|
sys.exit("source_pages required")
|
|
n = int(pages[0])
|
|
pdf = work / "source" / "paper.pdf"
|
|
if not pdf.is_file():
|
|
sys.exit(f"missing {pdf}")
|
|
dest_dir = work / "notes" / "figures" / fid
|
|
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
dest = dest_dir / "orig.png"
|
|
bbox = fig.get("crop_bbox")
|
|
with tempfile.TemporaryDirectory() as td:
|
|
prefix = Path(td) / "pg"
|
|
subprocess.run(
|
|
["pdftoppm", "-png", "-r", "200", "-f", str(n), "-l", str(n), str(pdf), str(prefix)],
|
|
check=True,
|
|
)
|
|
produced = sorted(Path(td).glob("pg*.png"))
|
|
if not produced:
|
|
sys.exit("pdftoppm produced no page")
|
|
page = produced[0]
|
|
if bbox is None:
|
|
shutil.copy2(page, dest)
|
|
else:
|
|
if shutil.which("magick") is None:
|
|
sys.exit("crop_bbox set but magick is missing")
|
|
x0, y0, x1, y1 = bbox
|
|
w, h = int(x1 - x0), int(y1 - y0)
|
|
subprocess.run(
|
|
["magick", str(page), "-crop", f"{w}x{h}+{int(x0)}+{int(y0)}", "+repage", str(dest)],
|
|
check=True,
|
|
)
|
|
print(dest)
|
|
PY
|