rebuild dev and build system with single marp server

- simplify development: single marp server on port 3000 instead of 3 processes
- rename klausur to klausurfolien for better naming
- update extract script to use 00-intro.md as template when no 01-*.md exists
- update makefile and package.json for new workflow
- add comprehensive AGENTS.md guidelines
This commit is contained in:
2026-02-01 18:17:51 +01:00
parent 7e4d4a8a4b
commit 9e12447528
11 changed files with 705 additions and 2337 deletions

View File

@@ -1,106 +1,53 @@
#!/usr/bin/env bash
# Development server script for HdM slides
# Starts index server + marp servers for each course
# Simplified development server for HdM slides
# Starts single Marp server for all courses
set -e
# Configuration
INDEX_PORT=1310
COURSE_B_PORT=1311
COURSE_C_PORT=1312
SLIDES_DIR="slides"
DEV_INDEX_DIR=".dev-index"
DEV_PORT=3000
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Cleanup function
cleanup() {
echo -e "\n${RED}Shutting down servers...${NC}"
kill $PID_INDEX $PID_B $PID_C 2>/dev/null || true
echo -e "\n${RED}Shutting down dev server...${NC}"
pkill -f "marp-cli.*--server" 2>/dev/null || true
exit 0
}
# Kill existing processes on our ports
# Kill existing processes on our port
kill_existing() {
echo -e "${BLUE}Cleaning up existing processes...${NC}"
# Kill marp processes first
pkill -9 -f "marp-cli" 2>/dev/null || true
pkill -f "python3 -m http.server" 2>/dev/null || true
# Kill ports including marp's WebSocket ports (37717-37720 range)
fuser -k $INDEX_PORT/tcp $COURSE_B_PORT/tcp $COURSE_C_PORT/tcp 2>/dev/null || true
fuser -k 37717/tcp 37718/tcp 37719/tcp 37720/tcp 2>/dev/null || true
sleep 2
}
# Generate dev index
generate_index() {
mkdir -p "$DEV_INDEX_DIR"
cat > "$DEV_INDEX_DIR/index.html" << 'EOF'
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>HdM Slides - Dev</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}
h1{font-size:2rem;font-weight:600;letter-spacing:-0.02em;margin-bottom:.5rem}
.subtitle{color:#86868b;font-size:1rem}
.courses{margin-top:2rem;display:flex;flex-direction:column;gap:.75rem}
a.course{display:block;background:#fff;border-radius:12px;padding:1.5rem;text-decoration:none;color:inherit;box-shadow:0 1px 3px rgba(0,0,0,0.08);transition:all .2s ease;cursor:pointer}
a.course:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.12)}
.course-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}
.course-b .course-label{color:#1e5f8a}
.course-c .course-label{color:#d63384}
.course-title{font-size:1.15rem;font-weight:500;color:#1d1d1f;margin:.25rem 0}
.course-info{font-size:.85rem;color:#86868b}
</style>
</head>
<body>
<h1>HdM Slides</h1>
<p class="subtitle">Development Server</p>
<div class="courses">
EOF
echo " <a class=\"course course-b\" href=\"http://localhost:$COURSE_B_PORT\"><span class=\"course-label\">223015b</span><div class=\"course-title\">Dateiformate, Schnittstellen, Speichermedien & Distributionswege</div><span class=\"course-info\">Port $COURSE_B_PORT</span></a>" >> "$DEV_INDEX_DIR/index.html"
echo " <a class=\"course course-c\" href=\"http://localhost:$COURSE_C_PORT\"><span class=\"course-label\">223015c</span><div class=\"course-title\">Grundlagen IT- und Internettechnik</div><span class=\"course-info\">Port $COURSE_C_PORT</span></a>" >> "$DEV_INDEX_DIR/index.html"
cat >> "$DEV_INDEX_DIR/index.html" << 'EOF'
</div>
</body>
</html>
EOF
fuser -k $DEV_PORT/tcp 2>/dev/null || true
sleep 1
}
# Main
trap cleanup SIGINT SIGTERM
kill_existing
generate_index
echo -e "${GREEN}Starting development servers...${NC}"
echo -e "${GREEN}Starting development server...${NC}"
echo ""
echo -e " Index: ${BLUE}http://localhost:$INDEX_PORT${NC}"
echo -e " 223015b: ${BLUE}http://localhost:$COURSE_B_PORT${NC}"
echo -e " 223015c: ${BLUE}http://localhost:$COURSE_C_PORT${NC}"
echo -e " Server: ${BLUE}http://localhost:$DEV_PORT${NC}"
echo -e " Slides: ${BLUE}$SLIDES_DIR/${NC}"
echo ""
echo -e "Press ${RED}Ctrl+C${NC} to stop all servers"
echo -e "Available courses:"
echo -e " 223015b: ${BLUE}http://localhost:$DEV_PORT/223015b/${NC}"
echo -e " 223015c: ${BLUE}http://localhost:$DEV_PORT/223015c/${NC}"
echo ""
echo -e "Press ${RED}Ctrl+C${NC} to stop the server"
echo ""
# Start servers
python3 -m http.server $INDEX_PORT --directory "$DEV_INDEX_DIR" &
PID_INDEX=$!
# Start single Marp server for all slides
PORT=$DEV_PORT npx @marp-team/marp-cli --server "$SLIDES_DIR/"
PORT=$COURSE_B_PORT npx @marp-team/marp-cli --server "$SLIDES_DIR/223015b/" &
PID_B=$!
sleep 3 # Stagger starts to avoid WebSocket port collision
PORT=$COURSE_C_PORT npx @marp-team/marp-cli --server "$SLIDES_DIR/223015c/" &
PID_C=$!
# Wait for any process to exit
wait
# Wait for process to exit
wait

View File

@@ -1,19 +1,19 @@
#!/usr/bin/env bash
# Extract klausur-relevant slides from all kapitel
# Usage: ./extract-klausur.sh <course_id>
# Output: slides/<course>/klausur.md
# Output: slides/<course>/klausurfolien.md
set -e
COURSE="${1:-223015b}"
SLIDES_DIR="slides/$COURSE"
OUTPUT_FILE="$SLIDES_DIR/klausur.md"
OUTPUT_FILE="$SLIDES_DIR/klausurfolien.md"
# Find the first kapitel file (01-*.md) to copy styles from
FIRST_KAPITEL=$(ls "$SLIDES_DIR"/01-*.md 2>/dev/null | head -1)
# Find the first kapitel file (00-intro.md or 01-*.md) to copy styles from
FIRST_KAPITEL=$(ls "$SLIDES_DIR"/00-intro.md "$SLIDES_DIR"/01-*.md 2>/dev/null | head -1)
if [[ -z "$FIRST_KAPITEL" ]]; then
echo "Error: No 01-*.md file found in $SLIDES_DIR"
echo "Error: No 00-intro.md or 01-*.md file found in $SLIDES_DIR"
exit 1
fi
@@ -57,7 +57,7 @@ awk '
' "$FIRST_KAPITEL" >> "$OUTPUT_FILE"
# Process each kapitel file in order - extract klausur slides only
for md_file in $(ls "$SLIDES_DIR"/[0-9][0-9]-*.md 2>/dev/null | grep -v klausur | sort); do
for md_file in $(ls "$SLIDES_DIR"/[0-9][0-9]-*.md 2>/dev/null | grep -v klausurfolien | sort); do
filename=$(basename "$md_file")
kapitel_num=$(echo "$filename" | grep -oE '^[0-9]+' | sed 's/^0*//')

View File

@@ -246,19 +246,19 @@ for html in $(ls "$BUILD_DIR"/[0-9][0-9]-*.html 2>/dev/null | sort); do
LINK
done
# Add klausur entry if it exists
if [[ -f "$BUILD_DIR/klausur.html" ]]; then
# Add klausurfolien entry if it exists
if [[ -f "$BUILD_DIR/klausurfolien.html" ]]; then
pdf_link=""
if [[ -f "$BUILD_DIR/klausur.pdf" ]]; then
pdf_link="<a href=\"klausur.pdf\" class=\"btn btn-pdf\">PDF</a>"
if [[ -f "$BUILD_DIR/klausurfolien.pdf" ]]; then
pdf_link="<a href=\"klausurfolien.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">
<a href="klausurfolien.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>
<a href="klausurfolien.html" class="btn btn-slides">Folien</a>
$pdf_link
</div>
KLAUSUR