- `mvnw` — Unix-Startskript (Apache Maven Wrapper 3.3.2)
- `mvnw.cmd` — Windows-Startskript (Apache Maven Wrapper 3.3.2)
+## Multi-Parent-Einträge im Navigationsmenü (`import-in-astro.sh`)
+
+Eine Seite kann in `stili-json` in mehreren `childs`-Listen gleichzeitig auftauchen — z.B. erscheinen Mojo-Seiten eines Maven-Plugins sowohl in `plugin-info.html.childs` (ihre kanonische Position) als auch in `index.html.childs` (als Direktzugang von der Startseite).
+
+Das Import-Skript unterscheidet:
+
+- **Kanonischer Ort** — bestimmt durch `crumbs`/`path` der Seite. Hier entsteht die vollständige Content-Datei mit Body sowie die zugehörige Routing-Datei. Die `url` dieser Datei ist maßgeblich (z.B. für `<link rel="canonical">`).
+- **Stub-Datei** — für jeden weiteren Elternteil (dessen `childs` die Seite enthält, der aber nicht dem kanonischen Elternteil entspricht) wird eine zusätzliche Content-Datei am entsprechenden Ort im Verzeichnisbaum angelegt. Der Stub enthält denselben Frontmatter (Titel, URL, Weight, Params), aber einen leeren Body und **keine** eigene Routing-Datei.
+
+Beide Dateien haben dieselbe `url` — Nav-Links an beiden Positionen zeigen also auf dieselbe Seite. Die Nav-Logik des Renderers (Astro: `buildNavTree`) zeigt die Seite an beiden Stellen im Menü.
+
+**Beispiel** `create-mojo.html` (hibernate-maven-plugin):
+
+| Datei | Typ | Grund |
+|---|---|---|
+| `project-reports/plugin-info/create-mojo.html` | Kanonisch (mit Body + Routing) | `crumbs: ["project-reports.html", "plugin-info.html"]` |
+| `create-mojo.html` (root-Ebene) | Stub (kein Body, kein Routing) | auch in `index.html.childs` |
+
## Maven-Site-Dokumentation neu generieren
Die Markdown-Dateien unter `src/site/markdown/` sind aus README.md abgeleitet und werden **manuell auf Anforderung** neu generiert.
} > "$ROUTING_TARGET"
echo "Routing: $ROUTING_TARGET"
+
+ # Create nav stubs for pages that appear in multiple childs lists.
+ # The canonical location comes from crumbs/path; extra parents get empty-body stubs
+ # at their child path so the page appears in multiple places in the nav tree.
+ if [[ "$FILE" != "index.html" ]]; then
+ CRUMBS_LENGTH=$(echo "$PAGE" | jq '.crumbs | length')
+ if [[ "$CRUMBS_LENGTH" -gt 0 ]]; then
+ CANONICAL_PARENT=$(echo "$PAGE" | jq -r '.crumbs[-1]')
+ else
+ CANONICAL_PARENT="index.html"
+ fi
+ while IFS= read -r EXTRA_PARENT_HREF; do
+ [[ -z "$EXTRA_PARENT_HREF" ]] && continue
+ EXTRA_PARENT_PAGE=$(echo "$JSON" | jq --arg href "$EXTRA_PARENT_HREF" '.pages[] | select(.href == $href)')
+ EXTRA_PARENT_PATH=$(echo "$EXTRA_PARENT_PAGE" | jq -r '.path')
+ if [[ "$EXTRA_PARENT_HREF" == "index.html" ]]; then
+ STUB_PREFIX=""
+ else
+ EXTRA_HREF_NOEXT="${EXTRA_PARENT_HREF%.html}"
+ [[ -n "$EXTRA_PARENT_PATH" && "${EXTRA_PARENT_PATH: -1}" != "/" ]] && EXTRA_PARENT_PATH="${EXTRA_PARENT_PATH}/"
+ STUB_PREFIX="${EXTRA_PARENT_PATH}${EXTRA_HREF_NOEXT}/"
+ fi
+ STUB_CONTENT_REL="${STUB_PREFIX}${FILE}"
+ [[ "$STUB_CONTENT_REL" == "$CONTENT_REL" ]] && continue
+ STUB_CONTENT_TARGET="$CONTENT_BASE/$STUB_CONTENT_REL"
+ mkdir -p "$(dirname "$STUB_CONTENT_TARGET")"
+ {
+ echo "---"
+ echo "title: $TITLE_YAML"
+ echo "weight: $WEIGHT"
+ echo "url: $PAGE_URL"
+ echo "params:"
+ echo " current: $CURRENT_BOOL"
+ [[ "$CURRENT_BOOL" == "false" ]] && echo " canonical: $CANONICAL_URL"
+ echo "---"
+ } > "$STUB_CONTENT_TARGET"
+ echo "Stub: $STUB_CONTENT_TARGET"
+ done < <(echo "$JSON" | jq -r --arg file "$FILE" --arg canonical "$CANONICAL_PARENT" \
+ '.pages[] | select(.childs | contains([$file])) | select(.href != $canonical) | .href')
+ fi
done
mkdir -p "$PUBLIC_BASE"