diff options
author | Audric Schiltknecht <storm@chemicalstorm.org> | 2025-08-11 20:31:11 -0400 |
---|---|---|
committer | Audric Schiltknecht <storm@chemicalstorm.org> | 2025-08-11 20:31:44 -0400 |
commit | 110a06e0aa84b5b8a8e280588424edf62fd099cf (patch) | |
tree | a3a75d17ba5540610df8c2d4c77c28de9c239714 | |
parent | c886955883cd81499cef6f7678e3cc75631ec09a (diff) | |
download | schiltknecht.org-110a06e0aa84b5b8a8e280588424edf62fd099cf.tar.gz schiltknecht.org-110a06e0aa84b5b8a8e280588424edf62fd099cf.tar.bz2 schiltknecht.org-110a06e0aa84b5b8a8e280588424edf62fd099cf.zip |
Maj pelican & thème
-rw-r--r-- | Makefile | 119 | ||||
-rw-r--r-- | pelicanconf.py | 33 | ||||
-rw-r--r-- | publishconf.py | 18 | ||||
-rw-r--r-- | tasks.py | 150 | ||||
-rw-r--r-- | themes/dev-urandom/templates/includes/sidebar.html | 8 |
5 files changed, 231 insertions, 97 deletions
@@ -1,5 +1,5 @@ -PY=python3 -PELICAN=pelican +PY?= +PELICAN?=pelican PELICANOPTS= BASEDIR=$(CURDIR) @@ -8,101 +8,82 @@ OUTPUTDIR=$(BASEDIR)/output CONFFILE=$(BASEDIR)/pelicanconf.py PUBLISHCONF=$(BASEDIR)/publishconf.py -FTP_HOST=localhost -FTP_USER=anonymous -FTP_TARGET_DIR=/ - SSH_HOST=www.chemicalstorm.org SSH_PORT=22 SSH_USER=storm SSH_TARGET_DIR=/home/storm/www.schiltknecht.org -S3_BUCKET=my_s3_bucket - -CLOUDFILES_USERNAME=my_rackspace_username -CLOUDFILES_API_KEY=my_rackspace_api_key -CLOUDFILES_CONTAINER=my_cloudfiles_container - -DROPBOX_DIR=~/Dropbox/Public/ 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 devserver [PORT=8000] start/restart develop_server.sh ' - @echo ' make stopserver stop local server ' - @echo ' make ssh_upload upload the web site via SSH ' - @echo ' make rsync_upload upload the web site via rsync+ssh ' - @echo ' make dropbox_upload upload the web site via Dropbox ' - @echo ' make ftp_upload upload the web site via FTP ' - @echo ' make s3_upload upload the web site via S3 ' - @echo ' make cf_upload upload the web site via Cloud Files' - @echo ' make github upload the web site via gh-pages ' - @echo ' ' - @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html' - @echo ' ' + @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 ' make ssh_upload upload the web site via SSH ' + @echo ' make sftp_upload upload the web site via SFTP ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @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) + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) clean: - [ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) + [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" regenerate: - $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) serve: -ifdef PORT - cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT) -else - cd $(OUTPUTDIR) && $(PY) -m pelican.server -endif + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve-global: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) devserver: -ifdef PORT - $(BASEDIR)/develop_server.sh restart $(PORT) -else - $(BASEDIR)/develop_server.sh restart -endif + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -stopserver: - kill -9 `cat pelican.pid` - kill -9 `cat srv.pid` - @echo 'Stopped Pelican and SimpleHTTPServer processes running in background.' +devserver-global: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b 0.0.0.0 publish: - $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) ssh_upload: publish - scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) - -rsync_upload: publish - rsync -e "ssh -p $(SSH_PORT)" -P -rvz --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude - -dropbox_upload: publish - cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR) + scp -P $(SSH_PORT) -r "$(OUTPUTDIR)"/* "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" -ftp_upload: publish - lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit" +sftp_upload: publish + printf 'put -r $(OUTPUTDIR)/*' | sftp $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) -s3_upload: publish - s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed - -cf_upload: publish - cd $(OUTPUTDIR) && swift -v -A https://auth.api.rackspacecloud.com/v1.0 -U $(CLOUDFILES_USERNAME) -K $(CLOUDFILES_API_KEY) upload -c $(CLOUDFILES_CONTAINER) . +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" -github: publish - ghp-import $(OUTPUTDIR) - git push origin gh-pages -.PHONY: html help clean regenerate serve devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github +.PHONY: html help clean regenerate serve serve-global devserver devserver-global publish ssh_upload sftp_upload rsync_upload diff --git a/pelicanconf.py b/pelicanconf.py index 3661260..534bace 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -1,12 +1,10 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- # -from __future__ import unicode_literals - AUTHOR = 'Audric Schiltknecht' SITENAME = 'Ma vie, mon œuvre - oupa' -SITEURL = '' +SITEURL = "" + +PATH = "content" -TIMEZONE = 'Europe/Paris' +TIMEZONE = 'America/Toronto' DEFAULT_LANG = 'fr' @@ -14,18 +12,29 @@ DEFAULT_LANG = 'fr' FEED_ALL_ATOM = None CATEGORY_FEED_ATOM = None TRANSLATION_FEED_ATOM = None +AUTHOR_FEED_ATOM = None +AUTHOR_FEED_RSS = None + +# Theme configuration +THEME = "./themes/dev-urandom" # Blogroll LINKS = (('Wiki de Jérome', 'http://wiki.drouet.eu/'),) -# Uncomment following line if you want document-relative URLs when developing -#RELATIVE_URLS = True +# Social widget +# SOCIAL = ( +# ("You can add links in your config file", "#"), +# ("Another social link", "#"), +# ) -# THEMES -THEME = "./themes/dev-urandom" +DEFAULT_PAGINATION = 10 + +DISPLAY_PAGES_ON_MENU=True + +# Uncomment following line if you want document-relative URLs when developing +RELATIVE_URLS = True # Static content to copy to output dir STATIC_PATHS = ['static'] -# Footer text - License -FOOTER_TEXT = """This work by <a xmlns:cc="http://creativecommons.org/ns#" href="http://schiltknecht.org" property="cc:attributionName" rel="cc:attributionURL">Audric Schiltknecht</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.""" +FOOTER_TEXT = """This work by <a xmlns:cc="http://creativecommons.org/ns#" href="http://www.schiltknecht.org" property="cc:attributionName" rel="cc:attributionURL">Audric Schiltknecht</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.""" diff --git a/publishconf.py b/publishconf.py index f27f40e..b28f0a2 100644 --- a/publishconf.py +++ b/publishconf.py @@ -1,24 +1,22 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- # -from __future__ import unicode_literals - # 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 * -SITEURL = 'http://www.schiltknecht.org' -RELATIVE_URLS = True +# If your site is available via HTTPS, make sure SITEURL begins with https:// +SITEURL = "https://schiltknecht.org" +RELATIVE_URLS = False -FEED_ALL_ATOM = 'feeds/all.atom.xml' -CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml' +FEED_ALL_ATOM = "feeds/all.atom.xml" +CATEGORY_FEED_ATOM = "feeds/{slug}.atom.xml" DELETE_OUTPUT_DIRECTORY = True # Following items are often useful when publishing -#DISQUS_SITENAME = "" -#GOOGLE_ANALYTICS = "" +# DISQUS_SITENAME = "" +# GOOGLE_ANALYTICS = "" diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..4bb7e3d --- /dev/null +++ b/tasks.py @@ -0,0 +1,150 @@ +import os +import shlex +import shutil +import sys + +from invoke import task +from invoke.main import program +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"], + # Remote server configuration + "ssh_user": "storm", + "ssh_host": "www.chemicalstorm.org", + "ssh_port": "22", + "ssh_path": "/home/storm/www.schiltknecht.org", + # 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"], + f"{theme_path}/templates/**/*.html", + ] + + content_file_extensions = [".md", ".rst"] + for extension in content_file_extensions: + content_glob = "{}/**/*{}".format(SETTINGS["PATH"], extension) + watched_globs.append(content_glob) + + static_file_extensions = [".css", ".js"] + for extension in static_file_extensions: + static_file_glob = f"{theme_path}/static/**/*{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)) diff --git a/themes/dev-urandom/templates/includes/sidebar.html b/themes/dev-urandom/templates/includes/sidebar.html index 0910f79..b3789e8 100644 --- a/themes/dev-urandom/templates/includes/sidebar.html +++ b/themes/dev-urandom/templates/includes/sidebar.html @@ -3,10 +3,8 @@ <nav> <h3>Pages</h3> <ul> - <li><a href="{{ SITEURL }}/index.html">Accueil</a></li> - {% if categories %} + <li><a href="{{ SITEURL }}">Accueil</a></li> <li><a href="{{ SITEURL }}/categories.html">Catégories</a></li> - {% endif %} <li><a href="{{ SITEURL }}/archives.html">Archives</a></li> <li><a href="{{ SITEURL }}/tags.html">Mots-clés</a></li> {% if MENUITEMS %} @@ -15,7 +13,7 @@ {% endfor %} {% endif %} {% if DISPLAY_PAGES_ON_MENU %} - {% for p in PAGES %} + {% for p in pages %} <li><a href="{{ SITEURL}}/{{ p.url }}"{% if p == page %} class="active"{% endif %}>{{ p.title }}</a></li> {% endfor %} {% endif %} @@ -33,7 +31,6 @@ </nav> {% endif %} - {% if FEED_ATOM or FEED_RSS or SOCIAL or LINKS %} <nav> <h3>Liens</h3> <ul> @@ -55,5 +52,4 @@ {% endif %} </ul> </nav> - {% endif %} <!-- end includes/sidebar.html --> |