125 lines
3.8 KiB
Nix
125 lines
3.8 KiB
Nix
{
|
|
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 = import nixpkgs { inherit system; config.allowUnfree = true; };
|
|
|
|
|
|
# QR code generator script
|
|
qr-gen = pkgs.writeShellScriptBin "qr" ''
|
|
if [ -z "$1" ]; then
|
|
echo "Usage: qr <url> [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 <image-or-directory> [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
|
|
claude-code
|
|
];
|
|
|
|
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 <url> - Generate QR code"
|
|
echo " qr-slides 223015b - Generate QR for course"
|
|
echo " optimize-img <dir> - 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;
|
|
};
|
|
}
|
|
);
|
|
}
|