add flake to provide environnement

added flake.nix to provide a build and dev environnement to bootstrap
	a venv with presenterm and weasyprint easily
added a package output to flake.nix to build all the posts.
	the build process use a python script for easier extensibility
This commit is contained in:
shobu 2025-09-11 04:57:12 +02:00
parent aa7fec3b1b
commit aa6bfb373c
17 changed files with 139 additions and 0 deletions

1
.envrc Normal file
View File

@ -0,0 +1 @@
use flake

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
result/

25
flake.lock generated Normal file
View File

@ -0,0 +1,25 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1757347588,
"narHash": "sha256-tLdkkC6XnsY9EOZW9TlpesTclELy8W7lL2ClL+nma8o=",
"rev": "b599843bad24621dcaa5ab60dac98f9b0eb1cabe",
"revCount": 858212,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.858212%2Brev-b599843bad24621dcaa5ab60dac98f9b0eb1cabe/01992e5d-548e-7231-8669-92a393e208fa/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.1"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

84
flake.nix Normal file
View File

@ -0,0 +1,84 @@
{
description = "An empty flake template that you can adapt to your own environment";
# Flake inputs
inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1";
# Flake outputs
outputs =
inputs:
let
# The systems supported for this flake
supportedSystems = [
"x86_64-linux" # 64-bit Intel/AMD Linux
"aarch64-linux" # 64-bit ARM Linux
"x86_64-darwin" # 64-bit Intel macOS
"aarch64-darwin" # 64-bit ARM macOS
];
# Helper to provide system-specific attributes
forEachSupportedSystem =
f:
inputs.nixpkgs.lib.genAttrs supportedSystems (
system:
f {
pkgs = import inputs.nixpkgs { inherit system; };
}
);
in
{
devShells = forEachSupportedSystem (
{ pkgs }: {
default = pkgs.mkShell {
# The Nix packages provided in the environment
# Add any you need here
packages = with pkgs; [
presenterm
python313Packages.weasyprint
];
# Set any environment variables for your dev shell
env = { };
# Add any shell logic you want executed any time the environment is activated
shellHook = '''';
};
}
);
packages = forEachSupportedSystem (
{ pkgs }: {
default = pkgs.stdenv.mkDerivation {
inherit (pkgs) system;
name = "linkedin-shoblog-posts";
src = ./src;
buildInputs = with pkgs; [
presenterm
python313Packages.weasyprint
];
buildPhase = let
font_dir = "${pkgs.nerd-fonts.jetbrains-mono}/share/fonts/truetype/NerdFonts/JetBrainsMono/";
config = pkgs.writeTextFile {
name = "presenterm.conf";
text = ''
export:
dimensions:
columns: 108
rows: 85
pdf:
fonts:
normal: ${font_dir}/JetBrainsMonoNerdFont-Regular.ttf
italic: ${font_dir}/JetBrainsMonoNerdFont-Italic.ttf
bold: ${font_dir}/JetBrainsMonoNerdFont-Bold.ttf
bold_italic: ${font_dir}/JetBrainsMonoNerdFont-BoldItalic.ttf
'';
};
in
''
export PRES_CONFIG=${config}
python scripts/build.py
'';
};
}
);
};
}

3
src/Makefile Normal file
View File

@ -0,0 +1,3 @@
install:
mkdir -p ${out}
cp output/* ${out}/

View File

@ -0,0 +1,11 @@
export:
dimensions:
columns: 108
rows: 85
pdf:
fonts:
normal: /usr/share/fonts/truetype/tlwg/TlwgMono.ttf
italic: /usr/share/fonts/truetype/tlwg/TlwgMono-Oblique.ttf
bold: /usr/share/fonts/truetype/tlwg/TlwgMono-Bold.ttf
bold_italic: /usr/share/fonts/truetype/tlwg/TlwgMono-BoldOblique.ttf

BIN
src/output/nginx.pdf Normal file

Binary file not shown.

BIN
src/output/vue.pdf Normal file

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 743 KiB

After

Width:  |  Height:  |  Size: 743 KiB

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

14
src/scripts/build.py Normal file
View File

@ -0,0 +1,14 @@
import os
from pathlib import Path
from subprocess import run
posts = [post for topic in Path("./posts").iterdir() for post in topic.iterdir()]
config = Path(os.environ.get("PRES_CONFIG", "./configs/presenterm.yaml"))
out_dir = Path('./output')
out_dir.exists() or out_dir.mkdir()
for post_dir in posts:
run_result = run([f"presenterm -e --config-file {config} {post_dir / f'{post_dir.name}.md'}"], shell = True)
(post_dir / f'{post_dir.name}.pdf').replace(out_dir / f'{post_dir.name}.pdf')