# Uni Slides – Unified Makefile # Multi-course Marp build system (HdM + DHBW) .PHONY: help dev build html pdf klausur deploy deploy-index build-index \ clean install qr qr-slides optimize-images # ----------------------------------------------------------------------------- # Course registry # ----------------------------------------------------------------------------- COURSES = 223015b 223015c dhbw SLIDES_DIR = slides DEPLOY_HOST = tengo@tuttle.uberspace.de # Per-course settings: NAME, KAPITEL, DEPLOY, PORT, KLAUSUR (1 or empty) 223015b_NAME = Dateiformate, Schnittstellen, Speichermedien 223015b_KAPITEL = 00-intro 01-grundlagen-text-audio 02-bild-audio-video 03-speichermedien-schnittstellen 04-distribution-apis-zukunft 05-vertiefung-offene-fragen klausurfolien klausurfragen 223015b_DEPLOY = /home/tengo/html/hdm/223015b 223015b_PORT = 1313 223015b_KLAUSUR = 1 223015c_NAME = Internettechnologien 223015c_KAPITEL = 01-geschichte-grundlagen-html 02-netzwerke-protokolle-css 03-interaktivitaet-javascript klausurfolien klausurfragen 223015c_DEPLOY = /home/tengo/html/hdm/223015c 223015c_PORT = 1314 223015c_KLAUSUR = 1 dhbw_NAME = Technik I – Grundlagen IT dhbw_KAPITEL = 01_web_eng 02_css_extended 03_nodejs_basics 04_nodejs_advanced 05_testing 06_typescript 07_docker 08_best_practices dhbw_DEPLOY = /home/tengo/html/dhbw dhbw_PORT = 1315 dhbw_KLAUSUR = # Courses with klausur extraction enabled KLAUSUR_COURSES = $(foreach c,$(COURSES),$(if $($(c)_KLAUSUR),$(c),)) ROOT_DEPLOY = /home/tengo/html/hdm # ----------------------------------------------------------------------------- # Help # ----------------------------------------------------------------------------- help: @echo "Uni Slides – Unified Build System" @echo "" @echo "Courses:" @for c in $(COURSES); do echo " $$c"; done @echo "" @echo "Per-course (replace with course id):" @echo " make dev- Live server (HMR)" @echo " make build- Build HTML + PDF" @echo " make html- Build HTML only" @echo " make pdf- Build PDF only" @echo " make klausur- Extract klausur slides" @echo " make deploy- Build + deploy" @echo "" @echo "All courses:" @echo " make dev Combined dev server (port 1312, all courses)" @echo " make build Build everything" @echo " make html / pdf HTML / PDF only" @echo " make klausur Extract klausur (HdM courses)" @echo " make deploy Deploy everything" @echo "" @echo "Tools:" @echo " make qr URL=... QR code" @echo " make qr-slides COURSE= QR for course URL" @echo " make optimize-images COURSE= Resize images" @echo " make clean Remove generated files" @echo " make install npm install" # ----------------------------------------------------------------------------- # Build infrastructure # ----------------------------------------------------------------------------- build/.exists: @mkdir -p $(addprefix build/,$(COURSES)) @touch $@ # ----------------------------------------------------------------------------- # Pattern rules: dev-, build-, html-, pdf-, klausur-, deploy- # Per-course config read via $($*_VAR) # ----------------------------------------------------------------------------- dev-%: @./scripts/dev-server.sh $* $($*_PORT) build-%: build/.exists @echo "Building $*..." @mkdir -p build/$* @cp -r $(SLIDES_DIR)/$*/assets build/$*/ 2>/dev/null || true @cp -r $(SLIDES_DIR)/$*/materials build/$*/ 2>/dev/null || true @for f in $($*_KAPITEL); do \ if [ -f "$(SLIDES_DIR)/$*/$$f.md" ]; then \ echo " $$f"; \ npx @marp-team/marp-cli $(SLIDES_DIR)/$*/$$f.md -o build/$*/$$f.html; \ npx @marp-team/marp-cli $(SLIDES_DIR)/$*/$$f.md --pdf --allow-local-files -o build/$*/$$f.pdf; \ fi \ done @./scripts/generate-index.sh $* build/$* html-%: build/.exists @echo "Building HTML for $*..." @mkdir -p build/$* @cp -r $(SLIDES_DIR)/$*/assets build/$*/ 2>/dev/null || true @cp -r $(SLIDES_DIR)/$*/materials build/$*/ 2>/dev/null || true @for f in $($*_KAPITEL); do \ if [ -f "$(SLIDES_DIR)/$*/$$f.md" ]; then \ echo " $$f.html"; \ npx @marp-team/marp-cli $(SLIDES_DIR)/$*/$$f.md -o build/$*/$$f.html; \ fi \ done @./scripts/generate-index.sh $* build/$* pdf-%: build/.exists @echo "Building PDFs for $*..." @mkdir -p build/$* @for f in $($*_KAPITEL); do \ if [ -f "$(SLIDES_DIR)/$*/$$f.md" ]; then \ echo " $$f.pdf"; \ npx @marp-team/marp-cli $(SLIDES_DIR)/$*/$$f.md --pdf --allow-local-files -o build/$*/$$f.pdf; \ fi \ done klausur-%: @./scripts/extract-klausur.sh $* deploy-%: build-% @echo "Deploying $*..." scp build/$*/*.html $(DEPLOY_HOST):$($*_DEPLOY)/ scp build/$*/*.pdf $(DEPLOY_HOST):$($*_DEPLOY)/ 2>/dev/null || true scp build/$*/*.svg $(DEPLOY_HOST):$($*_DEPLOY)/ 2>/dev/null || true scp -r build/$*/assets/ $(DEPLOY_HOST):$($*_DEPLOY)/ 2>/dev/null || true scp -r build/$*/materials/ $(DEPLOY_HOST):$($*_DEPLOY)/ 2>/dev/null || true @echo "$* deployed." # ----------------------------------------------------------------------------- # Group targets (all courses) # ----------------------------------------------------------------------------- dev: @./scripts/dev-server.sh build: $(addprefix build-,$(COURSES)) html: $(addprefix html-,$(COURSES)) pdf: $(addprefix pdf-,$(COURSES)) klausur: $(addprefix klausur-,$(KLAUSUR_COURSES)) build-index: build/.exists @echo "Building root index..." @mkdir -p build @./scripts/generate-root-index.sh deploy-index: build-index @echo "Deploying root index..." scp build/index.html $(DEPLOY_HOST):$(ROOT_DEPLOY)/ 2>/dev/null || true @echo "Root index deployed." deploy: build-index $(addprefix deploy-,$(COURSES)) deploy-index @echo "All courses deployed." # ----------------------------------------------------------------------------- # Tools # ----------------------------------------------------------------------------- qr: ifndef URL @echo "Usage: make qr URL=https://example.com [OUTPUT=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-slides: ifndef COURSE @echo "Usage: make qr-slides COURSE=" 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: ifndef COURSE @echo "Usage: make optimize-images COURSE=" else @echo "Optimizing images for $(COURSE)..." @mkdir -p $(SLIDES_DIR)/$(COURSE)/assets-original @nix-shell -p imagemagick --run 'for img in $(SLIDES_DIR)/$(COURSE)/assets/*.png $(SLIDES_DIR)/$(COURSE)/assets/*.jpg 2>/dev/null; do \ [ -f "$$img" ] && cp "$$img" $(SLIDES_DIR)/$(COURSE)/assets-original/ && \ magick "$$img" -resize "1920x>" -quality 85 "$$img" && echo " $$(basename $$img)"; \ done || true' @echo "Done. Originals in assets-original/" endif clean: @echo "Cleaning..." rm -rf build/ .dev-index/ *.pdf *.html qr-code.png install: @npm install