# HTML Generators This folder contains the build scripts that generate all HTML detail pages and `site/data/snippets.json` from the JSON source files in `content/`. ## Files | File | Description | |-----------------|-----------------------------------------------| | `generate.java` | JBang script (Java 25) — primary generator | | `generate.py` | Python equivalent — produces identical output | | `generate.jar` | Pre-built fat JAR (no JBang/JDK setup needed) | | `build-cds.sh` | Script to build a platform-specific AOT cache | ## Benchmark See [benchmark/README.md](benchmark/README.md) for performance comparisons across all four execution methods (AOT, Fat JAR, JBang, Python). ## Running ### Option 1: Fat JAR (fastest, no setup) ```bash java -jar html-generators/generate.jar ``` Requires only a Java 25+ runtime — no JBang installation needed. ### Option 2: Fat JAR with AOT cache (fastest possible) ```bash # One-time: build the AOT cache (~21 MB, platform-specific) ./html-generators/build-cds.sh # Subsequent runs use the cache java -XX:AOTCache=html-generators/generate.aot -jar html-generators/generate.jar ``` The AOT cache (Java 25, JEP 514/515) pre-loads classes from a training run, reducing startup time by ~30%. The cache is platform-specific and is not committed to git — regenerate it after changing the JAR or JDK version. ### Option 3: JBang (for development) ```bash jbang html-generators/generate.java ``` Requires [JBang](https://jbang.dev) and Java 25+. ### Option 4: Python ```bash python3 html-generators/generate.py ``` Requires Python 3.8+. ## Rebuilding the fat JAR After modifying `generate.java`, rebuild the fat JAR: ```bash jbang export fatjar --output html-generators/generate.jar html-generators/generate.java ``` This produces a self-contained ~2.2 MB JAR with all dependencies (Jackson) bundled. The `build-generator.yml` GitHub Action does this automatically when `generate.java` changes. ## CI/CD Workflows Two GitHub Actions workflows automate the build and deploy pipeline: 1. **`build-generator.yml`** — Triggered when `generate.java` changes on `main`. Uses JBang to rebuild the fat JAR and commits the updated `generate.jar` back to the repository. 2. **`deploy.yml`** — Triggered when content, templates, the JAR, or site assets change on `main`. Runs `java -jar html-generators/generate.jar` to regenerate all HTML pages, `snippets.json`, and `index.html`, then deploys the `site/` folder to GitHub Pages. This means the deploy workflow always uses the pre-built fat JAR (no JBang required at deploy time), and the JAR stays in sync with the source automatically.