282 lines
7.4 KiB
Bash
Executable File
282 lines
7.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Generate index.html for slide overview
|
|
# Usage: ./generate-index.sh <course_id> <build_dir>
|
|
|
|
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"
|
|
;;
|
|
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"
|
|
;;
|
|
*)
|
|
TITLE="$COURSE - HdM Slides"
|
|
SUBTITLE="Lecture Slides"
|
|
SLIDES_URL="https://librete.ch/hdm/$COURSE"
|
|
ACCENT_COLOR="#0066cc"
|
|
ACCENT_LIGHT="#e8f4fc"
|
|
;;
|
|
esac
|
|
|
|
# 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"
|
|
|
|
cat > "$BUILD_DIR/index.html" << HEADER
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>$TITLE</title>
|
|
<style>
|
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", Roboto, sans-serif;
|
|
max-width: 720px;
|
|
margin: 0 auto;
|
|
padding: 3rem 1.5rem;
|
|
background: #fafafa;
|
|
color: #1d1d1f;
|
|
line-height: 1.5;
|
|
}
|
|
header { margin-bottom: 2rem; }
|
|
h1 {
|
|
font-size: 1.75rem;
|
|
font-weight: 600;
|
|
letter-spacing: -0.02em;
|
|
margin-bottom: 0.5rem;
|
|
color: $ACCENT_COLOR;
|
|
}
|
|
.subtitle {
|
|
color: #86868b;
|
|
font-size: 0.95rem;
|
|
}
|
|
.meta {
|
|
color: #86868b;
|
|
font-size: 0.875rem;
|
|
margin-top: 0.25rem;
|
|
}
|
|
.kapitel {
|
|
margin-top: 1.5rem;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.75rem;
|
|
}
|
|
.kapitel-card {
|
|
position: relative;
|
|
background: #fff;
|
|
border-radius: 12px;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
transition: all 0.2s ease;
|
|
display: grid;
|
|
grid-template-columns: 1fr auto auto;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
}
|
|
.kapitel-card:hover {
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 12px rgba(0,0,0,0.12);
|
|
}
|
|
.kapitel-link {
|
|
display: block;
|
|
padding: 1.25rem 1.5rem;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
grid-column: 1;
|
|
}
|
|
.kapitel-label {
|
|
font-size: 0.7rem;
|
|
font-weight: 600;
|
|
color: $ACCENT_COLOR;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
}
|
|
.kapitel-title {
|
|
font-size: 1.05rem;
|
|
font-weight: 500;
|
|
color: #1d1d1f;
|
|
margin: 0.15rem 0;
|
|
}
|
|
.kapitel-date {
|
|
font-size: 0.8rem;
|
|
color: #86868b;
|
|
}
|
|
.btn {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 0.5rem 1rem;
|
|
border-radius: 8px;
|
|
text-decoration: none;
|
|
font-size: 0.8rem;
|
|
font-weight: 500;
|
|
transition: all 0.2s;
|
|
white-space: nowrap;
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
.btn-slides {
|
|
background: $ACCENT_COLOR;
|
|
color: #fff;
|
|
margin-right: 0.5rem;
|
|
}
|
|
.btn-slides:hover {
|
|
filter: brightness(1.1);
|
|
}
|
|
.btn-pdf {
|
|
background: #f5f5f7;
|
|
color: #1d1d1f;
|
|
margin-right: 1rem;
|
|
}
|
|
.btn-pdf:hover { background: #e8e8ed; }
|
|
/* Make entire card clickable via overlay */
|
|
.kapitel-link::after {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: 12px;
|
|
}
|
|
footer {
|
|
margin-top: 2.5rem;
|
|
padding-top: 1.5rem;
|
|
border-top: 1px solid #e5e5e7;
|
|
color: #86868b;
|
|
font-size: 0.85rem;
|
|
}
|
|
footer a { color: $ACCENT_COLOR; text-decoration: none; }
|
|
footer a:hover { text-decoration: underline; }
|
|
.qr-section {
|
|
margin-top: 2.5rem;
|
|
padding: 1.5rem;
|
|
background: #fff;
|
|
border-radius: 12px;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
text-align: center;
|
|
}
|
|
.qr-code {
|
|
width: 100%;
|
|
height: auto;
|
|
}
|
|
.qr-url {
|
|
margin-top: 0.75rem;
|
|
font-size: 0.85rem;
|
|
color: #86868b;
|
|
}
|
|
@media (max-width: 600px) {
|
|
.kapitel-card {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
.kapitel-link {
|
|
padding-bottom: 0.75rem;
|
|
}
|
|
.btn-slides, .btn-pdf {
|
|
margin: 0 1rem 1rem 1.5rem;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1>$TITLE</h1>
|
|
<p class="subtitle">$SUBTITLE</p>
|
|
<p class="meta">HdM Stuttgart · Wintersemester 2025/26 · Michael Czechowski</p>
|
|
</header>
|
|
<div class="termine">
|
|
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 $kapitel_num"
|
|
fi
|
|
|
|
pdf_filename="${filename%.html}.pdf"
|
|
|
|
# Check if PDF exists
|
|
pdf_link=""
|
|
if [[ -f "$BUILD_DIR/$pdf_filename" ]]; then
|
|
pdf_link="<a href=\"$pdf_filename\" class=\"btn btn-pdf\">PDF</a>"
|
|
fi
|
|
|
|
cat >> "$BUILD_DIR/index.html" << LINK
|
|
<div class="kapitel-card">
|
|
<a href="$filename" class="kapitel-link">
|
|
<div class="kapitel-label">$kapitel_label</div>
|
|
<div class="kapitel-title">$topic</div>
|
|
</a>
|
|
<a href="$filename" class="btn btn-slides">Folien</a>
|
|
$pdf_link
|
|
</div>
|
|
LINK
|
|
done
|
|
|
|
# Add klausur entry if it exists
|
|
if [[ -f "$BUILD_DIR/klausur.html" ]]; then
|
|
pdf_link=""
|
|
if [[ -f "$BUILD_DIR/klausur.pdf" ]]; then
|
|
pdf_link="<a href=\"klausur.pdf\" class=\"btn btn-pdf\">PDF</a>"
|
|
fi
|
|
cat >> "$BUILD_DIR/index.html" << KLAUSUR
|
|
<div class="kapitel-card" style="border-left: 3px solid $ACCENT_COLOR;">
|
|
<a href="klausur.html" class="kapitel-link">
|
|
<div class="kapitel-label">Prüfung</div>
|
|
<div class="kapitel-title">Klausurrelevante Folien</div>
|
|
</a>
|
|
<a href="klausur.html" class="btn btn-slides">Folien</a>
|
|
$pdf_link
|
|
</div>
|
|
KLAUSUR
|
|
fi
|
|
|
|
cat >> "$BUILD_DIR/index.html" << FOOTER
|
|
</div>
|
|
<div class="qr-section">
|
|
<img src="qr-index.svg" alt="QR Code" class="qr-code">
|
|
<p class="qr-url">$SLIDES_URL</p>
|
|
</div>
|
|
<footer>
|
|
<a href="mailto:mail@librete.ch">Kontakt</a> ·
|
|
<a href="../">Alle Kurse</a>
|
|
</footer>
|
|
</body>
|
|
</html>
|
|
FOOTER
|
|
|
|
echo "Generated $BUILD_DIR/index.html"
|