diff --git a/.gitignore b/.gitignore index 53752db..2ac8977 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -output +.hugo_build.lock +public +themes diff --git a/Makefile b/Makefile deleted file mode 100644 index f071905..0000000 --- a/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -PY?= -PELICAN?=pelican -PELICANOPTS= - -BASEDIR=$(CURDIR) -INPUTDIR=$(BASEDIR)/content -OUTPUTDIR=$(BASEDIR)/output -CONFFILE=$(BASEDIR)/pelicanconf.py -PUBLISHCONF=$(BASEDIR)/publishconf.py - - -DEBUG ?= 0 -ifeq ($(DEBUG), 1) - PELICANOPTS += -D -endif - -RELATIVE ?= 0 -ifeq ($(RELATIVE), 1) - PELICANOPTS += --relative-urls -endif - -SERVER ?= "0.0.0.0" - -PORT ?= 0 -ifneq ($(PORT), 0) - PELICANOPTS += -p $(PORT) -endif - - -help: - @echo 'Makefile for a pelican Web site ' - @echo ' ' - @echo 'Usage: ' - @echo ' make html (re)generate the web site ' - @echo ' make clean remove the generated files ' - @echo ' make regenerate regenerate files upon modification ' - @echo ' make publish generate using production settings ' - @echo ' make serve [PORT=8000] serve site at http://localhost:8000' - @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' - @echo ' make devserver [PORT=8000] serve and regenerate together ' - @echo ' make devserver-global regenerate and serve on 0.0.0.0 ' - @echo ' ' - @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' - @echo 'Set the RELATIVE variable to 1 to enable relative urls ' - @echo ' ' - -html: - "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) - -clean: - [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" - -regenerate: - "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) - -serve: - "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) - -serve-global: - "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) - -devserver: - "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) - -devserver-global: - $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -b 0.0.0.0 - -publish: - "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) - - -.PHONY: html help clean regenerate serve serve-global devserver publish \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..9b8bee3 --- /dev/null +++ b/config.yml @@ -0,0 +1,22 @@ +baseURL: "https://pnm.tf/" +title: Personal website of Paul-Nicolas Madelaine +theme: papermod + +params: + homeInfoParams: + Title: Hello world! + Content: | + My name is *Paul-Nicolas Madelaine*, often shortened to *PNM*. I am + a research engineer at Inria and a Nix enthusiast. My pronouns are + *he/him*. + socialIcons: + - name: github + url: "https://github.com/pnmadelaine" + - name: mastodon + url: "https://mamot.fr/@pnm" + - name: lichess + url: "https://lichess.org/@/pnmadelaine" + - name: email + url: "pnm@pnm.tf" + - name: rss + url: "index.xml" diff --git a/content/pages/about.md b/content/pages/about.md deleted file mode 100644 index 44e8a96..0000000 --- a/content/pages/about.md +++ /dev/null @@ -1,15 +0,0 @@ -Title: About - -## About me - -My name is *Paul-Nicolas Madelaine*, often shortened to *PNM*. My pronouns are -*he/him*. - -## About this website - -This website is built with [Pelican](https://getpelican.com/) and -[Nix](https://nixos.org/), source code is available on -[GitHub](https://github.com/pnmadelaine/website). The domain name *pnm.tf* is -registered at [Gandi](https://www.gandi.net/) and the top-level domain *.tf* is -administrated by [AFNIC](https://www.afnic.fr/). Certificates are provided by -[Let's Encrypt](https://letsencrypt.org/). diff --git a/content/pages/contact.md b/content/pages/contact.md deleted file mode 100644 index 633dcf4..0000000 --- a/content/pages/contact.md +++ /dev/null @@ -1,3 +0,0 @@ -Title: Contact - -**email:** diff --git a/content/2022-06-09-nix-registry.md b/content/posts/2022-06-09-nix-registry.md similarity index 92% rename from content/2022-06-09-nix-registry.md rename to content/posts/2022-06-09-nix-registry.md index f57b344..58d013b 100644 --- a/content/2022-06-09-nix-registry.md +++ b/content/posts/2022-06-09-nix-registry.md @@ -1,8 +1,8 @@ -Title: Nix registry -Author: Paul-Nicolas Madelaine -Date: 2022-06-09 -Category: Blog -Summary: A quick note about a small trick I implemented in my NixOS configurations. +--- +title: Nix registry +date: 2022-06-09 +summary: A quick note about a small trick I implemented in my NixOS configurations. +--- *A quick note about a small trick I implemented in my NixOS configurations.* diff --git a/content/2023-11-07-flake-template.md b/content/posts/2023-11-07-flake-template.md similarity index 91% rename from content/2023-11-07-flake-template.md rename to content/posts/2023-11-07-flake-template.md index c1786e1..f57c7e3 100644 --- a/content/2023-11-07-flake-template.md +++ b/content/posts/2023-11-07-flake-template.md @@ -1,8 +1,8 @@ -Title: A Nix Flake Template -Author: Paul-Nicolas Madelaine -Date: 2023-11-07 -Category: Blog -Summary: I wrote a Flake template +--- +title: A Nix Flake Template +date: 2023-11-07 +summary: I wrote a Nix ❄ Template +--- I learned to use Nix when flakes were already ubiquitous, and I realized recently that by learning Nix through flakes I adopted some bad coding habits. I diff --git a/fetch.sh b/fetch.sh new file mode 100755 index 0000000..0dd4fda --- /dev/null +++ b/fetch.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +version="v7.0" +rm -rf themes +mkdir themes +cd themes +curl -L "https://github.com/adityatelange/hugo-PaperMod/tarball/$version" | tar -zx +mv "$(ls)" papermod diff --git a/flake.nix b/flake.nix index d181482..cdddba1 100644 --- a/flake.nix +++ b/flake.nix @@ -11,34 +11,22 @@ }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs {inherit system;}; - python = pkgs.python3.withPackages (ps: - with ps; [ - markdown - (pelican.overrideAttrs (_: _: {patches = [./pelican.patch];})) - ( - buildPythonPackage rec { - pname = "pelican-sitemap"; - version = "1.1.0"; - src = pkgs.fetchFromGitHub { - owner = "pelican-plugins"; - repo = "sitemap"; - rev = version; - sha256 = "sha256-GEOLM4wc25VLRZ4qpOENTV6YGfYPHeu95gGdBauJswA="; - }; - format = "pyproject"; - propagatedBuildInputs = [poetry-core]; - } - ) - ]); + papermod = pkgs.fetchFromGitHub { + owner = "adityatelange"; + repo = "hugo-PaperMod"; + rev = "v7.0"; + hash = "sha256-33EnCEvTxZYn31fxZkYJlQXvJsczXMVufSj6QJJHrLk="; + }; website = pkgs.stdenv.mkDerivation { name = "website"; src = ./.; - nativeBuildInputs = [pkgs.libfaketime python]; - buildPhase = "faketime @${builtins.toString self.lastModified} make publish"; - installPhase = "cp -r output $out"; + postPatch = "mkdir themes && cp -r ${papermod} themes/papermod"; + nativeBuildInputs = [pkgs.hugo]; + buildPhase = "hugo"; + installPhase = "cp -r public $out"; }; in { packages.default = website; - devShells.default = pkgs.mkShell {packages = [python];}; + devShells.default = pkgs.mkShell {packages = [pkgs.hugo];}; }); } diff --git a/pelican.patch b/pelican.patch deleted file mode 100644 index 031de0d..0000000 --- a/pelican.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/pelican/themes/notmyidea/templates/base.html b/pelican/themes/notmyidea/templates/base.html -index 2b302899..07e28e2d 100644 ---- a/pelican/themes/notmyidea/templates/base.html -+++ b/pelican/themes/notmyidea/templates/base.html -@@ -62,7 +62,7 @@ - {% endif %} - - {% for name, link in SOCIAL %} --
  • {{ name }}
  • -+
  • {{ name }}
  • - {% endfor %} - - diff --git a/pelicanconf.py b/pelicanconf.py deleted file mode 100644 index 332bfbc..0000000 --- a/pelicanconf.py +++ /dev/null @@ -1,29 +0,0 @@ -AUTHOR = 'Paul-Nicolas Madelaine' -SITENAME = 'Personal website of Paul-Nicolas Madelaine' -SITEURL = '' - -PATH = 'content' - -TIMEZONE = 'Europe/Paris' - -DEFAULT_LANG = 'en' - -# Feed generation is usually not desired when developing -FEED_ALL_ATOM = None -CATEGORY_FEED_ATOM = None -TRANSLATION_FEED_ATOM = None -AUTHOR_FEED_ATOM = None -AUTHOR_FEED_RSS = None - -# Blogroll -LINKS = (('GitHub', 'https://github.com/pnmadelaine'), - ('Lichess', 'https://lichess.org/@/pnmadelaine'), - ('Chess.com', 'https://chess.com/member/pnmadelaine')) - -# Social widget -SOCIAL = (('Mastodon', 'https://mamot.fr/@pnm'),) - -DEFAULT_PAGINATION = 10 - -# Uncomment following line if you want document-relative URLs when developing -#RELATIVE_URLS = True diff --git a/publishconf.py b/publishconf.py deleted file mode 100644 index 92cfd20..0000000 --- a/publishconf.py +++ /dev/null @@ -1,18 +0,0 @@ -# This file is only used if you use `make publish` or -# explicitly specify it as your config file. - -import os -import sys -sys.path.append(os.curdir) -from pelicanconf import * - -# If your site is available via HTTPS, make sure SITEURL begins with https:// -SITEURL = 'https://pnm.tf' -RELATIVE_URLS = True - -DELETE_OUTPUT_DIRECTORY = True - -# Following items are often useful when publishing - -#DISQUS_SITENAME = "" -#GOOGLE_ANALYTICS = "" diff --git a/tasks.py b/tasks.py deleted file mode 100644 index c7c6c46..0000000 --- a/tasks.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import shlex -import shutil -import sys -import datetime - -from invoke import task -from invoke.main import program -from invoke.util import cd -from pelican import main as pelican_main -from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer -from pelican.settings import DEFAULT_CONFIG, get_settings_from_file - -OPEN_BROWSER_ON_SERVE = True -SETTINGS_FILE_BASE = 'pelicanconf.py' -SETTINGS = {} -SETTINGS.update(DEFAULT_CONFIG) -LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) -SETTINGS.update(LOCAL_SETTINGS) - -CONFIG = { - 'settings_base': SETTINGS_FILE_BASE, - 'settings_publish': 'publishconf.py', - # Output path. Can be absolute or relative to tasks.py. Default: 'output' - 'deploy_path': SETTINGS['OUTPUT_PATH'], - # Host and port for `serve` - 'host': 'localhost', - 'port': 8000, -} - -@task -def clean(c): - """Remove generated files""" - if os.path.isdir(CONFIG['deploy_path']): - shutil.rmtree(CONFIG['deploy_path']) - os.makedirs(CONFIG['deploy_path']) - -@task -def build(c): - """Build local version of site""" - pelican_run('-s {settings_base}'.format(**CONFIG)) - -@task -def rebuild(c): - """`build` with the delete switch""" - pelican_run('-d -s {settings_base}'.format(**CONFIG)) - -@task -def regenerate(c): - """Automatically regenerate site upon file modification""" - pelican_run('-r -s {settings_base}'.format(**CONFIG)) - -@task -def serve(c): - """Serve site at http://$HOST:$PORT/ (default is localhost:8000)""" - - class AddressReuseTCPServer(RootedHTTPServer): - allow_reuse_address = True - - server = AddressReuseTCPServer( - CONFIG['deploy_path'], - (CONFIG['host'], CONFIG['port']), - ComplexHTTPRequestHandler) - - if OPEN_BROWSER_ON_SERVE: - # Open site in default browser - import webbrowser - webbrowser.open("http://{host}:{port}".format(**CONFIG)) - - sys.stderr.write('Serving at {host}:{port} ...\n'.format(**CONFIG)) - server.serve_forever() - -@task -def reserve(c): - """`build`, then `serve`""" - build(c) - serve(c) - -@task -def preview(c): - """Build production version of site""" - pelican_run('-s {settings_publish}'.format(**CONFIG)) - -@task -def livereload(c): - """Automatically reload browser tab upon file modification.""" - from livereload import Server - - def cached_build(): - cmd = '-s {settings_base} -e CACHE_CONTENT=true LOAD_CONTENT_CACHE=true' - pelican_run(cmd.format(**CONFIG)) - - cached_build() - server = Server() - theme_path = SETTINGS['THEME'] - watched_globs = [ - CONFIG['settings_base'], - '{}/templates/**/*.html'.format(theme_path), - ] - - content_file_extensions = ['.md', '.rst'] - for extension in content_file_extensions: - content_glob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension) - watched_globs.append(content_glob) - - static_file_extensions = ['.css', '.js'] - for extension in static_file_extensions: - static_file_glob = '{0}/static/**/*{1}'.format(theme_path, extension) - watched_globs.append(static_file_glob) - - for glob in watched_globs: - server.watch(glob, cached_build) - - if OPEN_BROWSER_ON_SERVE: - # Open site in default browser - import webbrowser - webbrowser.open("http://{host}:{port}".format(**CONFIG)) - - server.serve(host=CONFIG['host'], port=CONFIG['port'], root=CONFIG['deploy_path']) - - -@task -def publish(c): - """Publish to production via rsync""" - pelican_run('-s {settings_publish}'.format(**CONFIG)) - c.run( - 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' - '-e "ssh -p {ssh_port}" ' - '{} {ssh_user}@{ssh_host}:{ssh_path}'.format( - CONFIG['deploy_path'].rstrip('/') + '/', - **CONFIG)) - - -def pelican_run(cmd): - cmd += ' ' + program.core.remainder # allows to pass-through args to pelican - pelican_main(shlex.split(cmd)) \ No newline at end of file