#!/usr/bin/env bash # Generate index.html for slide overview # Usage: ./generate-index.sh COURSE="${1:-223015b}" BUILD_DIR="${2:-build/$COURSE}" # Course-specific configuration case "$COURSE" in 223015b) TITLE="Dateiformate, Schnittstellen, Speichermedien & Distributionswege" SUBTITLE="223015b · Modul \"Technik 1\" · 1. Semester" SLIDES_URL="https://librete.ch/hdm/223015b" ACCENT_COLOR="#1e5f8a" ACCENT_LIGHT="#e8f4fc" INSTITUTION="HdM Stuttgart" HEADLINE="HdM Vorlesungen" KAPITEL_TERM="Kapitel" BREADCRUMB_URL="../" EXAM_URL="" EXAM_LABEL="" KONTAKT_URL="mailto:mail@librete.ch" KONTAKT_LABEL="Kontakt" QR_IMG="qr-index.svg" ;; 223015c) TITLE="Grundlagen IT- und Internettechnik" SUBTITLE="223015c · Modul \"Technik 1\" · 1. Semester" SLIDES_URL="https://librete.ch/hdm/223015c" ACCENT_COLOR="#d63384" ACCENT_LIGHT="#fce4ec" INSTITUTION="HdM Stuttgart" HEADLINE="HdM Vorlesungen" KAPITEL_TERM="Kapitel" BREADCRUMB_URL="../" EXAM_URL="" EXAM_LABEL="" KONTAKT_URL="mailto:mail@librete.ch" KONTAKT_LABEL="Kontakt" QR_IMG="qr-index.svg" ;; dhbw) TITLE="Web Engineering" SUBTITLE="Informatik / Wirtschaftsinformatik" SLIDES_URL="https://librete.ch/dhbw" ACCENT_COLOR="#a02060" ACCENT_LIGHT="#fce4ec" INSTITUTION="DHBW Stuttgart" HEADLINE="DHBW Vorlesungen" KAPITEL_TERM="Sitzung" BREADCRUMB_URL="" EXAM_URL="https://git.librete.ch/DHBW/pruefungsleistung" EXAM_LABEL="Prüfungsleistung" KONTAKT_URL="mailto:michael.czechowski@lehre.dhbw-stuttgart.de" KONTAKT_LABEL="Kontakt" QR_IMG="assets/slides-dhbw.png" ;; *) TITLE="$COURSE - Slides" SUBTITLE="Lecture Slides" SLIDES_URL="https://librete.ch/$COURSE" ACCENT_COLOR="#0066cc" ACCENT_LIGHT="#e8f4fc" INSTITUTION="Stuttgart" HEADLINE="Vorlesungen" KAPITEL_TERM="Kapitel" BREADCRUMB_URL="" EXAM_URL="" EXAM_LABEL="" KONTAKT_URL="mailto:mail@librete.ch" KONTAKT_LABEL="Kontakt" QR_IMG="qr-index.svg" ;; esac # Optional breadcrumb HTML (empty if no parent overview) if [[ -n "$BREADCRUMB_URL" ]]; then BREADCRUMB_HTML="

← Kursübersicht

" else BREADCRUMB_HTML="" fi # Optional exam-link HTML if [[ -n "$EXAM_URL" ]]; then EXAM_HTML="

$EXAM_LABEL →

" else EXAM_HTML="" fi # Footer kursübersicht link only when breadcrumb parent exists if [[ -n "$BREADCRUMB_URL" ]]; then FOOTER_KURS_HTML=" · Kursübersicht" else FOOTER_KURS_HTML="" fi # Topic mappings for nice German titles declare -A TOPIC_MAP TOPIC_MAP["intro"]="Einführung" TOPIC_MAP["grundlagen-text-audio"]="Grundlagen, Text & Audio" TOPIC_MAP["bild-audio-video"]="Bild, Audio & Video" TOPIC_MAP["speichermedien-schnittstellen"]="Speichermedien & Schnittstellen" TOPIC_MAP["distribution-apis-zukunft"]="Distribution, APIs & Zukunft" TOPIC_MAP["vertiefung-offene-fragen"]="Vertiefung & Offene Fragen" TOPIC_MAP["geschichte-grundlagen-html"]="Geschichte, Grundlagen & HTML" TOPIC_MAP["netzwerke-protokolle-css"]="Netzwerke, Protokolle & CSS" TOPIC_MAP["interaktivitaet-javascript"]="Interaktivität & JavaScript" TOPIC_MAP["html-css"]="HTML & CSS" TOPIC_MAP["js-frameworks"]="JS, Frameworks & Build Tools" TOPIC_MAP["nodejs-basics"]="Node.js: Scripting, Running & Building" TOPIC_MAP["express"]="Express API, CRUD & Middlewares" TOPIC_MAP["testing"]="Testing" TOPIC_MAP["typescript"]="TypeScript" TOPIC_MAP["docker"]="Docker, Proxies & DBs" TOPIC_MAP["best-practices"]="Wrap-up & Best Practices" # Configure which topics should appear disabled per course # Two modes: fully disabled (non-clickable card) and buttons-disabled (link remains clickable, buttons are disabled) declare -A DISABLED_FULL declare -A DISABLED_BUTTONS # For course B: chapters 3,4,5 should be fully disabled DISABLED_FULL["223015b"]="speichermedien-schnittstellen distribution-apis-zukunft vertiefung-offene-fragen" # For course C: all chapters fully active DISABLED_BUTTONS["223015c"]="" # Courses where the "Klausurrelevante Folien" card should be active (clickable) declare -A KLAUSURFOLIEN_ACTIVE KLAUSURFOLIEN_ACTIVE["223015b"]=1 # Courses where the "Klausurfragen" card should be active (clickable) declare -A KLAUSURFRAGEN_ACTIVE KLAUSURFRAGEN_ACTIVE["223015b"]=1 KLAUSURFRAGEN_ACTIVE["223015c"]=1 cat > "$BUILD_DIR/index.html" << HEADER $TITLE
$BREADCRUMB_HTML

$HEADLINE

$TITLE

$SUBTITLE

$INSTITUTION · Sommersemester 2026 · Michael Czechowski

$EXAM_HTML
HEADER # Generate links for each kapitel (sorted) for html in $(ls "$BUILD_DIR"/[0-9][0-9]-*.html 2>/dev/null | sort); do filename=$(basename "$html") # Extract components from filename (format: NN-topic.html) kapitel_num=$(echo "$filename" | grep -oE '^[0-9]+' | sed 's/^0*//') topic_raw=$(echo "$filename" | sed -E 's/^[0-9]+-//' | sed 's/\.html$//') # Look up nice topic name or fallback topic="${TOPIC_MAP[$topic_raw]}" if [[ -z "$topic" ]]; then topic=$(echo "$topic_raw" | sed 's/-/ /g' | sed 's/.*/\\u&/') fi # Handle kapitel number if [[ "$kapitel_num" == "0" ]] || [[ -z "$kapitel_num" ]]; then kapitel_label="Einführung" else kapitel_label="$KAPITEL_TERM $kapitel_num" fi pdf_filename="${filename%.html}.pdf" # Determine whether this topic is configured as disabled for this course disabled_full=false disabled_buttons=false for t in ${DISABLED_FULL["$COURSE"]}; do if [[ "$topic_raw" == "$t" ]]; then disabled_full=true break fi done if [[ "$disabled_full" == false ]]; then for t in ${DISABLED_BUTTONS["$COURSE"]}; do if [[ "$topic_raw" == "$t" ]]; then disabled_buttons=true break fi done fi # Decide card class card_class="kapitel-card" if [[ "$disabled_full" == true ]] || [[ "$disabled_buttons" == true ]]; then card_class="$card_class disabled" fi # Build link/button HTML depending on disabled state if [[ "$disabled_full" == true ]]; then # non-interactive card (visually dimmed and not clickable) link_html="
$kapitel_label
$topic
" slides_html="Folien" pdf_html="" if [[ -f "$BUILD_DIR/$pdf_filename" ]]; then pdf_html="PDF" fi elif [[ "$disabled_buttons" == true ]]; then # link stays clickable, but buttons are disabled; card appears dimmed link_html="
$kapitel_label
$topic
" slides_html="Folien" pdf_html="" if [[ -f "$BUILD_DIR/$pdf_filename" ]]; then pdf_html="PDF" fi else # normal interactive card pdf_link="" if [[ -f "$BUILD_DIR/$pdf_filename" ]]; then pdf_link="PDF" fi link_html="
$kapitel_label
$topic
" slides_html="Folien" pdf_html="$pdf_link" fi cat >> "$BUILD_DIR/index.html" << LINK
$link_html $slides_html $pdf_html
LINK done # Add klausurfolien entry if it exists (active per KLAUSURFOLIEN_ACTIVE, else disabled) if [[ -f "$BUILD_DIR/klausurfolien.html" ]]; then if [[ "${KLAUSURFOLIEN_ACTIVE[$COURSE]}" == "1" ]]; then pdf_active="" if [[ -f "$BUILD_DIR/klausurfolien.pdf" ]]; then pdf_active="PDF" fi cat >> "$BUILD_DIR/index.html" << KLAUSUR KLAUSUR else pdf_disabled="" if [[ -f "$BUILD_DIR/klausurfolien.pdf" ]]; then pdf_disabled="PDF" fi cat >> "$BUILD_DIR/index.html" << KLAUSUROFF
Folien $pdf_disabled
KLAUSUROFF fi fi # Add klausurfragen entry if it exists (active per KLAUSURFRAGEN_ACTIVE, else disabled) if [[ -f "$BUILD_DIR/klausurfragen.html" ]] || [[ -f "$BUILD_DIR/klausurfragen.pdf" ]]; then if [[ "${KLAUSURFRAGEN_ACTIVE[$COURSE]}" == "1" ]]; then pdf_active="" if [[ -f "$BUILD_DIR/klausurfragen.pdf" ]]; then pdf_active="PDF" fi slides_active="" if [[ -f "$BUILD_DIR/klausurfragen.html" ]]; then slides_active="Folien" fi cat >> "$BUILD_DIR/index.html" << KLAUSURFRAGEN
Prüfung
Klausurfragen
$slides_active $pdf_active
KLAUSURFRAGEN else pdf_disabled="" if [[ -f "$BUILD_DIR/klausurfragen.pdf" ]]; then pdf_disabled="PDF" fi slides_disabled="" if [[ -f "$BUILD_DIR/klausurfragen.html" ]]; then slides_disabled="Folien" fi cat >> "$BUILD_DIR/index.html" << KLAUSURFRAGENOFF
$slides_disabled $pdf_disabled
KLAUSURFRAGENOFF fi fi cat >> "$BUILD_DIR/index.html" << FOOTER
QR Code

$SLIDES_URL

FOOTER echo "Generated $BUILD_DIR/index.html"