Build slides with Nix
This commit is contained in:
parent
e80aee1deb
commit
6f98c753c2
6 changed files with 111 additions and 131 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -1,11 +1,6 @@
|
||||||
# Nix.
|
# Nix.
|
||||||
/.direnv/
|
/.direnv/
|
||||||
|
/result
|
||||||
# rst2df.
|
|
||||||
/**/*.pdf
|
|
||||||
/**/*.rst.build_temp
|
|
||||||
/dist/*
|
|
||||||
!/dist/.keep
|
|
||||||
|
|
||||||
# pdfpc.
|
# pdfpc.
|
||||||
/**/*.pdfpc
|
/**/*.pdfpc
|
||||||
|
|
0
dist/.keep
vendored
0
dist/.keep
vendored
8
flake.lock
generated
8
flake.lock
generated
|
@ -2,16 +2,16 @@
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1725001927,
|
"lastModified": 1741010256,
|
||||||
"narHash": "sha256-eV+63gK0Mp7ygCR0Oy4yIYSNcum2VQwnZamHxYTNi+M=",
|
"narHash": "sha256-WZNlK/KX7Sni0RyqLSqLPbK8k08Kq7H7RijPJbq9KHM=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6e99f2a27d600612004fbd2c3282d614bfee6421",
|
"rev": "ba487dbc9d04e0634c64e3b1f0d25839a0a68246",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-24.05",
|
"ref": "nixos-unstable",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
|
89
flake.nix
89
flake.nix
|
@ -1,25 +1,98 @@
|
||||||
{
|
{
|
||||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
{ nixpkgs, ... }:
|
{ nixpkgs, ... }:
|
||||||
let
|
let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
|
||||||
inherit (pkgs) mkShell nixfmt-classic;
|
inherit (nixpkgs.lib) makeOverridable;
|
||||||
|
inherit (pkgs.stdenvNoCC) mkDerivation;
|
||||||
|
|
||||||
|
shared = mkDerivation {
|
||||||
|
name = "talks-shared";
|
||||||
|
src = ./src;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir $out
|
||||||
|
cp -r fonts styles $out
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
commonBuildInputs = with pkgs; [
|
||||||
|
(python310.withPackages (p: with p; [ rst2pdf ]))
|
||||||
|
];
|
||||||
|
|
||||||
|
mkTalk = makeOverridable (
|
||||||
|
{ name, src }:
|
||||||
|
mkDerivation {
|
||||||
|
inherit name shared src;
|
||||||
|
|
||||||
|
buildInputs = commonBuildInputs;
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
mkdir $out
|
||||||
|
|
||||||
|
rst2pdf slides.rst \
|
||||||
|
--break-level 1 \
|
||||||
|
--fit-background-mode scale \
|
||||||
|
--font-path "${toString shared}/fonts" \
|
||||||
|
--output "$out/slides.pdf" \
|
||||||
|
--stylesheets bw,"${toString shared}/styles/opdavies-light"
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
talks = {
|
||||||
|
build-configs = mkTalk {
|
||||||
|
name = "build-configs";
|
||||||
|
src = ./src/building-build-configs;
|
||||||
|
};
|
||||||
|
|
||||||
|
sculpin = mkTalk {
|
||||||
|
name = "building-static-websites-sculpin";
|
||||||
|
src = ./src/building-static-websites-sculpin;
|
||||||
|
};
|
||||||
|
|
||||||
|
tailwind-css = mkTalk {
|
||||||
|
name = "taking-flight-with-tailwind-css";
|
||||||
|
src = ./src/taking-flight-with-tailwind-css;
|
||||||
|
};
|
||||||
|
|
||||||
|
test-driven-drupal = mkTalk {
|
||||||
|
name = "test-driven-drupal";
|
||||||
|
src = ./src/test-driven-drupal;
|
||||||
|
};
|
||||||
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
devShells.${system}.default = mkShell {
|
devShells.${system}.default =
|
||||||
packages = with pkgs; [
|
with pkgs;
|
||||||
|
mkShell {
|
||||||
|
packages =
|
||||||
|
with pkgs;
|
||||||
|
commonBuildInputs
|
||||||
|
++ [
|
||||||
ghostscript
|
ghostscript
|
||||||
|
just
|
||||||
pdfpc
|
pdfpc
|
||||||
python310Packages.rst2pdf
|
|
||||||
texliveMedium # includes pdfjam
|
texliveMedium # includes pdfjam
|
||||||
tree
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
formatter.${system} = nixfmt-classic;
|
packages.${system} = {
|
||||||
|
inherit shared;
|
||||||
|
} // talks;
|
||||||
|
|
||||||
|
formatter.${system} = pkgs.nixfmt-rfc-style;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
19
justfile
Normal file
19
justfile
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
alias b := build
|
||||||
|
|
||||||
|
_default:
|
||||||
|
just --list
|
||||||
|
|
||||||
|
build:
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
selected=$(nix flake show --json | jq --raw-output '.packages["x86_64-linux"] | keys[]' | grep -v shared | fzf)
|
||||||
|
|
||||||
|
nix build \
|
||||||
|
--json \
|
||||||
|
--print-build-logs \
|
||||||
|
.#"$selected"
|
||||||
|
|
||||||
|
check:
|
||||||
|
nix flake check
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -frv result
|
107
run
107
run
|
@ -1,107 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
PDF_FILENAME=slides.pdf
|
|
||||||
RST_FILENAME="${RST_FILENAME:-slides.rst}"
|
|
||||||
THUMBNAIL_FILENAME=thumbnail.jpg
|
|
||||||
|
|
||||||
function clean {
|
|
||||||
rm -fr dist/*
|
|
||||||
touch dist/.keep
|
|
||||||
|
|
||||||
find . \
|
|
||||||
-type f \( -name "${PDF_FILENAME}*" -o -name *.build_temp -o -name ${THUMBNAIL_FILENAME} \) \
|
|
||||||
-delete
|
|
||||||
}
|
|
||||||
|
|
||||||
function generate {
|
|
||||||
generate:pdf "${@}"
|
|
||||||
}
|
|
||||||
|
|
||||||
function generate:pdf {
|
|
||||||
if [ "${1}" == "" ]; then
|
|
||||||
echo "Usage: ./${0##*/} ${FUNCNAME[0]} <talk-name>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
DIRECTORY_NAME=$1
|
|
||||||
shift 1
|
|
||||||
pushd "src/${DIRECTORY_NAME}"
|
|
||||||
|
|
||||||
rst2pdf "${RST_FILENAME}" \
|
|
||||||
--break-level 1 \
|
|
||||||
-e preprocess \
|
|
||||||
--fit-background-mode scale \
|
|
||||||
--font-path ../fonts \
|
|
||||||
--output "../../dist/${DIRECTORY_NAME}.pdf" \
|
|
||||||
--stylesheets ../styles/opdavies-light,tango \
|
|
||||||
"${@}"
|
|
||||||
|
|
||||||
popd
|
|
||||||
|
|
||||||
tree dist
|
|
||||||
}
|
|
||||||
|
|
||||||
# Generate JPG thumbnails of each slide in a presentation.
|
|
||||||
function generate:thumbnail {
|
|
||||||
if [ "${1}" == "" ]; then
|
|
||||||
echo "Usage: ./${0##*/} ${FUNCNAME[0]} <talk-name>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -d "src/${1}" ]; then
|
|
||||||
echo "${1} not found"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
generate:pdf "${1}"
|
|
||||||
|
|
||||||
mkdir -p "dist/${1}"
|
|
||||||
|
|
||||||
gs \
|
|
||||||
-dBATCH \
|
|
||||||
-dDownScaleFactor=3 \
|
|
||||||
-dNOPAUSE \
|
|
||||||
-r600 \
|
|
||||||
-sDEVICE=jpeg \
|
|
||||||
-sOutputFile="dist/${1}/%d.jpg" \
|
|
||||||
"dist/${1}.pdf"
|
|
||||||
}
|
|
||||||
|
|
||||||
function help {
|
|
||||||
printf "%s <task> [args]\n\nTasks:\n" "${0}"
|
|
||||||
|
|
||||||
compgen -A function | grep -v "^_" | cat -n
|
|
||||||
|
|
||||||
printf "\nExtended help:\n Each task has comments for general usage\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create a new talk.
|
|
||||||
function new {
|
|
||||||
if [ "${1}" == "" ]; then
|
|
||||||
echo "Usage: ./${0##*/} ${FUNCNAME[0]} <talk-name>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -e "src/${1}" ]]; then
|
|
||||||
echo "Error: ${1} already exists."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -vp "src/${1}"
|
|
||||||
|
|
||||||
touch "src/${1}/slides.rst"
|
|
||||||
}
|
|
||||||
|
|
||||||
function present {
|
|
||||||
TALK_PATH=$1
|
|
||||||
shift 1
|
|
||||||
|
|
||||||
pdfpc "${@}" "dist/${TALK_PATH}.pdf"
|
|
||||||
}
|
|
||||||
|
|
||||||
TIMEFORMAT=$'\nTask completed in %3lR'
|
|
||||||
time "${@:-help}"
|
|
Loading…
Add table
Add a link
Reference in a new issue