add nix flake with dev tools
provides: - nix develop: dev shell with nodejs, qrencode, imagemagick - nix run .#qr: generate qr codes from urls - nix run .#qr-slides: generate qr for course urls - nix run .#optimize-img: resize images to max width
This commit is contained in:
122
flake.nix
Normal file
122
flake.nix
Normal file
@@ -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 <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
|
||||||
|
];
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user