diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..ea452c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,122 @@ +{ + description = "HdM Slides - Marp presentation builder with tools"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + # QR code generator script + qr-gen = pkgs.writeShellScriptBin "qr" '' + if [ -z "$1" ]; then + echo "Usage: qr [output.png]" + echo "" + echo "Examples:" + echo " qr https://example.com" + echo " qr https://example.com my-qr.png" + echo " qr 'https://librete.ch/hdm/223015b/' slides-qr.png" + exit 1 + fi + + URL="$1" + OUTPUT="''${2:-qr-code.png}" + + ${pkgs.qrencode}/bin/qrencode -o "$OUTPUT" -s 10 -m 2 "$URL" + echo "Generated: $OUTPUT" + ''; + + # QR code for course slides + qr-slides = pkgs.writeShellScriptBin "qr-slides" '' + COURSE="''${1:-223015b}" + OUTPUT="''${2:-build/$COURSE/qr-$COURSE.png}" + + mkdir -p "$(dirname "$OUTPUT")" + ${pkgs.qrencode}/bin/qrencode -o "$OUTPUT" -s 10 -m 2 "https://librete.ch/hdm/$COURSE/" + echo "Generated QR for $COURSE: $OUTPUT" + ''; + + # Image optimizer script + optimize-img = pkgs.writeShellScriptBin "optimize-img" '' + if [ -z "$1" ]; then + echo "Usage: optimize-img [max-width]" + echo "" + echo "Resizes images to max width (default: 1920px)" + exit 1 + fi + + TARGET="$1" + MAX_WIDTH="''${2:-1920}" + + if [ -d "$TARGET" ]; then + for img in "$TARGET"/*.{png,jpg,jpeg,webp} 2>/dev/null; do + [ -f "$img" ] || continue + echo "Optimizing: $(basename "$img")" + ${pkgs.imagemagick}/bin/magick "$img" -resize "''${MAX_WIDTH}x>" -quality 85 "$img" + done + elif [ -f "$TARGET" ]; then + echo "Optimizing: $TARGET" + ${pkgs.imagemagick}/bin/magick "$TARGET" -resize "''${MAX_WIDTH}x>" -quality 85 "$TARGET" + else + echo "Error: $TARGET not found" + exit 1 + fi + echo "Done!" + ''; + + in { + # Development shell with all tools + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + nodejs_20 + nodePackages.npm + qrencode + imagemagick + gnumake + ]; + + shellHook = '' + echo "HdM Slides Development Environment" + echo "" + echo "Available commands:" + echo " make dev-b - Start 223015b dev server (port 1312)" + echo " make dev-c - Start 223015c dev server (port 1313)" + echo " make build - Build all courses" + echo " qr - Generate QR code" + echo " qr-slides 223015b - Generate QR for course" + echo " optimize-img - Optimize images" + echo "" + ''; + }; + + # Standalone apps + packages = { + qr = qr-gen; + qr-slides = qr-slides; + optimize-img = optimize-img; + default = qr-gen; + }; + + # Direct runnable apps + apps = { + qr = { + type = "app"; + program = "${qr-gen}/bin/qr"; + }; + qr-slides = { + type = "app"; + program = "${qr-slides}/bin/qr-slides"; + }; + optimize-img = { + type = "app"; + program = "${optimize-img}/bin/optimize-img"; + }; + default = self.apps.${system}.qr; + }; + } + ); +}