diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3fb1613 --- /dev/null +++ b/Makefile @@ -0,0 +1,217 @@ +# HdM Slides - Unified Makefile +# Supports multiple courses: 223015b (Dateiformate) and 223015c (Internettechnik) + +.PHONY: help dev dev-b dev-c build build-b build-c pdf html clean install deploy qr optimize-images + +# Course configuration +COURSES = 223015b 223015c +COURSE_DIR = courses + +# Course-specific settings +223015b_NAME = Dateiformate, Schnittstellen, Speichermedien +223015b_PORT = 1312 +223015b_TERMINS = 2025-12-19-termin-0-intro 2025-12-19-termin-1-grundlagen-text-audio 2026-01-09-termin-2-bild-audio-video 2026-01-23-termin-3-speichermedien-schnittstellen 2026-01-30-termin-4-distribution-apis-zukunft 2026-xx-xx-termin-5-vertiefung-offene-fragen +223015b_DEPLOY_PATH = /home/tengo/html/hdm/223015b + +223015c_NAME = Internettechnologien +223015c_PORT = 1313 +223015c_TERMINS = 2025-12-20-termin-1-geschichte-grundlagen-html 2026-01-10-termin-2-netzwerke-protokolle-css 2026-01-24-termin-3-interaktivitaet-javascript +223015c_DEPLOY_PATH = /home/tengo/html/hdm/223015c + +DEPLOY_HOST = tengo@tuttle.uberspace.de + +# Default target +help: + @echo "HdM Slides - Unified Build System" + @echo "" + @echo "Courses:" + @echo " 223015b - Dateiformate, Schnittstellen, Speichermedien" + @echo " 223015c - Internettechnologien" + @echo "" + @echo "Development:" + @echo " make dev - Both servers + index (ports 1311, 1312, 1313)" + @echo " make dev-b - Dev server for 223015b (port 1312)" + @echo " make dev-c - Dev server for 223015c (port 1313)" + @echo "" + @echo "Build:" + @echo " make build - Build all courses" + @echo " make build-b - Build 223015b only" + @echo " make build-c - Build 223015c only" + @echo " make pdf - Export all to PDF" + @echo " make html - Export all to HTML" + @echo "" + @echo "Tools:" + @echo " make qr URL=... - Generate QR code for URL" + @echo " make optimize-images COURSE=223015b - Resize images" + @echo "" + @echo "Deploy:" + @echo " make deploy - Deploy all courses" + @echo " make deploy-b - Deploy 223015b only" + @echo " make deploy-c - Deploy 223015c only" + @echo "" + @echo "Other:" + @echo " make clean - Remove generated files" + @echo " make install - Install dependencies" + +# Ensure build directories exist +build/.exists: + @mkdir -p build/223015b build/223015c + @touch $@ + +# Development servers +dev: dev-index + @echo "Starting all dev servers..." + @echo "" + @echo " Index: http://localhost:1311" + @echo " 223015b: http://localhost:1312" + @echo " 223015c: http://localhost:1313" + @echo "" + @echo "Press Ctrl+C to stop all servers" + @trap 'kill 0' INT; \ + PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/ & \ + PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/ & \ + python3 -m http.server 1311 --directory .dev-index & \ + wait + +dev-index: + @mkdir -p .dev-index + @echo 'HdM Slides

HdM Slides

Development Server

223015b - DateiformatePort 1312223015c - InternettechnikPort 1313' > .dev-index/index.html + +dev-b: + @echo "Starting 223015b dev server on port 1312..." + @echo "Open: http://localhost:1312" + PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/ + +dev-c: + @echo "Starting 223015c dev server on port 1313..." + @echo "Open: http://localhost:1313" + PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/ + +# Build functions +define build_course + @echo "Building $(1)..." + @mkdir -p build/$(1) + @cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true + @cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true + @for f in $($(1)_TERMINS); do \ + if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \ + echo " Building $$f..."; \ + npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \ + npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \ + fi \ + done + @./scripts/generate-index.sh $(1) build/$(1) +endef + +build-b: build/.exists + $(call build_course,223015b) + +build-c: build/.exists + $(call build_course,223015c) + +build: build-b build-c + @echo "All courses built!" + +# HTML only builds +define html_course + @echo "Building HTML for $(1)..." + @mkdir -p build/$(1) + @cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true + @cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true + @for f in $($(1)_TERMINS); do \ + if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \ + echo " $$f.html"; \ + npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \ + fi \ + done + @./scripts/generate-index.sh $(1) build/$(1) +endef + +html-b: build/.exists + $(call html_course,223015b) + +html-c: build/.exists + $(call html_course,223015c) + +html: html-b html-c + +# PDF only builds +define pdf_course + @echo "Building PDFs for $(1)..." + @mkdir -p build/$(1) + @for f in $($(1)_TERMINS); do \ + if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \ + echo " $$f.pdf"; \ + npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \ + fi \ + done +endef + +pdf-b: build/.exists + $(call pdf_course,223015b) + +pdf-c: build/.exists + $(call pdf_course,223015c) + +pdf: pdf-b pdf-c + +# QR Code generation (uses nix-shell) +qr: +ifndef URL + @echo "Usage: make qr URL=https://example.com" + @echo " make qr URL=https://example.com OUTPUT=my-qr.png" +else + @nix-shell -p qrencode --run 'qrencode -o $(or $(OUTPUT),qr-code.png) -s 10 "$(URL)"' + @echo "Generated: $(or $(OUTPUT),qr-code.png)" +endif + +# QR code for a slide deck URL +qr-slides: +ifndef COURSE + @echo "Usage: make qr-slides COURSE=223015b" +else + @nix-shell -p qrencode --run 'qrencode -o build/$(COURSE)/qr-$(COURSE).png -s 10 "https://librete.ch/hdm/$(COURSE)/"' + @echo "Generated: build/$(COURSE)/qr-$(COURSE).png" +endif + +# Optimize images +optimize-images: +ifndef COURSE + @echo "Usage: make optimize-images COURSE=223015b" +else + @echo "Optimizing images for $(COURSE)..." + @mkdir -p $(COURSE_DIR)/$(COURSE)/slides/assets-original + @nix-shell -p imagemagick --run 'for img in $(COURSE_DIR)/$(COURSE)/slides/assets/*.png $(COURSE_DIR)/$(COURSE)/slides/assets/*.jpg 2>/dev/null; do \ + [ -f "$$img" ] && cp "$$img" $(COURSE_DIR)/$(COURSE)/slides/assets-original/ && \ + magick "$$img" -resize "1920x>" -quality 85 "$$img" && echo " Optimized: $$(basename $$img)"; \ + done || true' + @echo "Done! Originals in assets-original/" +endif + +# Deploy +define deploy_course + @echo "Deploying $(1)..." + scp build/$(1)/*.html $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ + scp -r build/$(1)/assets/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ + scp -r build/$(1)/materials/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ 2>/dev/null || true + @echo "$(1) deployed!" +endef + +deploy-b: build-b + $(call deploy_course,223015b) + +deploy-c: build-c + $(call deploy_course,223015c) + +deploy: deploy-b deploy-c + @echo "All courses deployed!" + +# Clean +clean: + @echo "Cleaning generated files..." + rm -rf build/ .dev-index/ *.pdf *.html qr-code.png + +# Install dependencies +install: + @echo "Installing dependencies..." + npm install