Update pelican files

This commit is contained in:
Alexandre Vicenzi 2022-07-08 19:41:42 +02:00
parent 0006c3e6db
commit c96adc71f9
2 changed files with 100 additions and 68 deletions

View file

@ -21,6 +21,14 @@ ifeq ($(RELATIVE), 1)
PELICANOPTS += --relative-urls PELICANOPTS += --relative-urls
endif endif
SERVER ?= "0.0.0.0"
PORT ?= 0
ifneq ($(PORT), 0)
PELICANOPTS += -p $(PORT)
endif
help: help:
@echo 'Makefile for a pelican Web site ' @echo 'Makefile for a pelican Web site '
@echo ' ' @echo ' '
@ -32,43 +40,40 @@ help:
@echo ' make serve [PORT=8000] serve site at http://localhost:8000' @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 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 [PORT=8000] serve and regenerate together '
@echo ' make devserver-global regenerate and serve on 0.0.0.0 '
@echo ' make github upload the web site via gh-pages '
@echo ' ' @echo ' '
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' @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 'Set the RELATIVE variable to 1 to enable relative urls '
@echo ' ' @echo ' '
html: html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
clean: clean:
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)"
regenerate: regenerate:
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
serve: serve:
ifdef PORT "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
else
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
endif
serve-global: serve-global:
ifdef SERVER "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER)
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b $(SERVER)
else
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b 0.0.0.0
endif
devserver: devserver:
ifdef PORT "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
else devserver-global:
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -b 0.0.0.0
endif
publish: publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS)
.PHONY: html help clean regenerate serve serve-global devserver publish github: publish
ghp-import -m "Generate Pelican site" -b $(GITHUB_PAGES_BRANCH) "$(OUTPUTDIR)"
git push origin $(GITHUB_PAGES_BRANCH)
.PHONY: html help clean regenerate serve serve-global devserver publish github

View file

@ -1,121 +1,148 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import shlex
import shutil import shutil
import sys import sys
import datetime import datetime
from invoke import task from invoke import task
from invoke.main import program
from invoke.util import cd from invoke.util import cd
from pelican import main as pelican_main
from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
from pelican.settings import DEFAULT_CONFIG, get_settings_from_file from pelican.settings import DEFAULT_CONFIG, get_settings_from_file
SETTINGS_FILE_BASE = "pelicanconf.py" OPEN_BROWSER_ON_SERVE = True
SETTINGS_FILE_BASE = 'pelicanconf.py'
SETTINGS = {} SETTINGS = {}
SETTINGS.update(DEFAULT_CONFIG) SETTINGS.update(DEFAULT_CONFIG)
LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE)
SETTINGS.update(LOCAL_SETTINGS) SETTINGS.update(LOCAL_SETTINGS)
CONFIG = { CONFIG = {
"settings_base": SETTINGS_FILE_BASE, 'settings_base': SETTINGS_FILE_BASE,
"settings_publish": "publishconf.py", 'settings_publish': 'publishconf.py',
# Output path. Can be absolute or relative to tasks.py. Default: 'output' # Output path. Can be absolute or relative to tasks.py. Default: 'output'
"deploy_path": SETTINGS["OUTPUT_PATH"], 'deploy_path': SETTINGS['OUTPUT_PATH'],
# Github Pages configuration # Github Pages configuration
"github_pages_branch": "gh-pages", 'github_pages_branch': 'gh-pages',
"commit_message": "'Publish site on {}'".format(datetime.date.today().isoformat()), 'commit_message': "'Publish site on {}'".format(datetime.date.today().isoformat()),
# Port for `serve` # Host and port for `serve`
"port": 8000, 'host': 'localhost',
'port': 8000,
} }
@task @task
def clean(c): def clean(c):
"""Remove generated files""" """Remove generated files"""
if os.path.isdir(CONFIG["deploy_path"]): if os.path.isdir(CONFIG['deploy_path']):
shutil.rmtree(CONFIG["deploy_path"]) shutil.rmtree(CONFIG['deploy_path'])
os.makedirs(CONFIG["deploy_path"]) os.makedirs(CONFIG['deploy_path'])
@task @task
def build(c): def build(c):
"""Build local version of site""" """Build local version of site"""
c.run("pelican -s {settings_base}".format(**CONFIG)) pelican_run('-s {settings_base}'.format(**CONFIG))
@task @task
def rebuild(c): def rebuild(c):
"""`build` with the delete switch""" """`build` with the delete switch"""
c.run("pelican -d -s {settings_base}".format(**CONFIG)) pelican_run('-d -s {settings_base}'.format(**CONFIG))
@task @task
def regenerate(c): def regenerate(c):
"""Automatically regenerate site upon file modification""" """Automatically regenerate site upon file modification"""
c.run("pelican -r -s {settings_base}".format(**CONFIG)) pelican_run('-r -s {settings_base}'.format(**CONFIG))
@task @task
def serve(c): def serve(c):
"""Serve site at http://localhost:$PORT/ (default port is 8000)""" """Serve site at http://$HOST:$PORT/ (default is localhost:8000)"""
class AddressReuseTCPServer(RootedHTTPServer): class AddressReuseTCPServer(RootedHTTPServer):
allow_reuse_address = True allow_reuse_address = True
server = AddressReuseTCPServer( server = AddressReuseTCPServer(
CONFIG["deploy_path"], ("", CONFIG["port"]), ComplexHTTPRequestHandler CONFIG['deploy_path'],
) (CONFIG['host'], CONFIG['port']),
ComplexHTTPRequestHandler)
sys.stderr.write("Serving on port {port} ...\n".format(**CONFIG)) 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() server.serve_forever()
@task @task
def reserve(c): def reserve(c):
"""`build`, then `serve`""" """`build`, then `serve`"""
build(c) build(c)
serve(c) serve(c)
@task @task
def preview(c): def preview(c):
"""Build production version of site""" """Build production version of site"""
c.run("pelican -s {settings_publish}".format(**CONFIG)) pelican_run('-s {settings_publish}'.format(**CONFIG))
@task @task
def livereload(c): def livereload(c):
"""Automatically reload browser tab upon file modification.""" """Automatically reload browser tab upon file modification."""
from livereload import Server from livereload import Server
build(c) def cached_build():
cmd = '-s {settings_base} -e CACHE_CONTENT=True LOAD_CONTENT_CACHE=True'
pelican_run(cmd.format(**CONFIG))
cached_build()
server = Server() server = Server()
# Watch the base settings file theme_path = SETTINGS['THEME']
server.watch(CONFIG["settings_base"], lambda: build(c)) watched_globs = [
# Watch content source files CONFIG['settings_base'],
content_file_extensions = [".md", ".rst"] '{}/templates/**/*.html'.format(theme_path),
]
content_file_extensions = ['.md', '.rst']
for extension in content_file_extensions: for extension in content_file_extensions:
content_blob = "{0}/**/*{1}".format(SETTINGS["PATH"], extension) content_glob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension)
server.watch(content_blob, lambda: build(c)) watched_globs.append(content_glob)
# Watch the theme's templates and static assets
theme_path = SETTINGS["THEME"] static_file_extensions = ['.css', '.js']
server.watch("{}/templates/*.html".format(theme_path), lambda: build(c))
static_file_extensions = [".css", ".js"]
for extension in static_file_extensions: for extension in static_file_extensions:
static_file = "{0}/static/**/*{1}".format(theme_path, extension) static_file_glob = '{0}/static/**/*{1}'.format(theme_path, extension)
server.watch(static_file, lambda: build(c)) watched_globs.append(static_file_glob)
# Serve output path on configured port
server.serve(port=CONFIG["port"], root=CONFIG["deploy_path"]) 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 @task
def publish(c): def publish(c):
"""Publish to production via rsync""" """Publish to production via rsync"""
c.run("pelican -s {settings_publish}".format(**CONFIG)) pelican_run('-s {settings_publish}'.format(**CONFIG))
c.run( c.run(
'rsync --delete --exclude ".DS_Store" -pthrvz -c ' 'rsync --delete --exclude ".DS_Store" -pthrvz -c '
'-e "ssh -p {ssh_port}" ' '-e "ssh -p {ssh_port}" '
"{} {ssh_user}@{ssh_host}:{ssh_path}".format( '{} {ssh_user}@{ssh_host}:{ssh_path}'.format(
CONFIG["deploy_path"].rstrip("/") + "/", **CONFIG CONFIG['deploy_path'].rstrip('/') + '/',
) **CONFIG))
)
@task
def gh_pages(c):
"""Publish to GitHub Pages"""
preview(c)
c.run('ghp-import -b {github_pages_branch} '
'-m {commit_message} '
'{deploy_path} -p'.format(**CONFIG))
def pelican_run(cmd):
cmd += ' ' + program.core.remainder # allows to pass-through args to pelican
pelican_main(shlex.split(cmd))