manetta
4 years ago
8 changed files with 305 additions and 0 deletions
@ -0,0 +1,73 @@ |
|||
PY?=python3 |
|||
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 ssh_upload upload the web site via SSH ' |
|||
@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) |
|||
|
|||
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 |
@ -0,0 +1,15 @@ |
|||
Title: What is digital infrapuncture? |
|||
Slug: digital-infrapuncture-1 |
|||
Date: 2020-08-25 12:00 |
|||
|
|||
What is digital infrastructure? And why do should they be rethought in terms of capacity and care? |
|||
|
|||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse in libero viverra risus pulvinar congue. Sed pellentesque condimentum cursus. Quisque vestibulum ex quis tincidunt faucibus. Etiam porta nec eros quis ornare. Curabitur posuere lorem a lectus tincidunt fermentum. Nunc efficitur neque in mattis ullamcorper. Nullam aliquam nunc et elit tempor hendrerit. Proin eu erat sit amet nisl ultrices feugiat. Suspendisse dignissim ipsum sed ex porttitor molestie. Aenean elementum vitae justo eget scelerisque. Phasellus in quam vulputate, tempus libero eu, ornare tellus. Etiam sollicitudin venenatis hendrerit. Ut dolor dolor, commodo sit amet arcu eget, porttitor aliquam justo. Fusce maximus laoreet turpis sit amet molestie. Nulla facilisi. |
|||
|
|||
Curabitur ut sapien et velit rutrum laoreet. Cras ac aliquet massa. Pellentesque elementum ornare orci. Donec mattis auctor lacus, quis dignissim arcu sollicitudin sit amet. Etiam imperdiet, risus sed condimentum interdum, ante est mattis sem, a tempor mi odio eget tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Proin sed justo ac nisi aliquam efficitur nec venenatis turpis. |
|||
|
|||
Nulla pretium, purus vitae pretium porttitor, elit purus sagittis leo, ut blandit arcu nisl a metus. Nunc sit amet arcu ac magna finibus suscipit. Sed malesuada sem arcu, id egestas risus pharetra at. Sed sed pulvinar massa, at ornare odio. Donec quis magna sed turpis rhoncus dignissim. Aenean scelerisque sapien nec interdum suscipit. Donec sit amet tincidunt odio, in fermentum eros. Morbi varius augue nulla. Aliquam erat volutpat. Sed sit amet ligula hendrerit nisl posuere venenatis placerat quis sem. Phasellus in iaculis urna. Etiam mollis arcu eget dui volutpat molestie. Pellentesque sodales leo nec mi interdum interdum. Proin at gravida ante. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. |
|||
|
|||
Donec non massa sapien. Aenean ligula lectus, iaculis ut tempus quis, scelerisque sit amet dui. Donec varius dui sed elit consectetur rhoncus non in leo. Quisque feugiat lobortis magna, eu auctor nisi sodales et. Fusce nec iaculis arcu. Morbi placerat pellentesque felis sed eleifend. Vivamus consectetur felis fringilla urna porta aliquam. |
|||
|
|||
Nam rhoncus lacus libero, ut tincidunt lorem ultricies vel. Proin nibh neque, tempor quis nulla ac, vulputate dapibus metus. Proin rhoncus a diam quis hendrerit. Ut laoreet est id erat gravida, vitae aliquet lorem suscipit. Mauris eu tempor metus, sit amet blandit erat. Aenean viverra imperdiet orci, at condimentum nunc euismod ac. Suspendisse lectus augue, venenatis ullamcorper sollicitudin vel, venenatis vitae dui. In in velit feugiat, molestie nibh vitae, finibus elit. Nulla mattis metus eu finibus laoreet. Nullam lobortis dui ac feugiat dictum. |
@ -0,0 +1,15 @@ |
|||
Title: Systematic causes of pain? |
|||
Slug: digital-infrapuncture-2 |
|||
Date: 2020-08-25 12:00 |
|||
|
|||
How do we amend systematic causes of pain? |
|||
|
|||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse in libero viverra risus pulvinar congue. Sed pellentesque condimentum cursus. Quisque vestibulum ex quis tincidunt faucibus. Etiam porta nec eros quis ornare. Curabitur posuere lorem a lectus tincidunt fermentum. Nunc efficitur neque in mattis ullamcorper. Nullam aliquam nunc et elit tempor hendrerit. Proin eu erat sit amet nisl ultrices feugiat. Suspendisse dignissim ipsum sed ex porttitor molestie. Aenean elementum vitae justo eget scelerisque. Phasellus in quam vulputate, tempus libero eu, ornare tellus. Etiam sollicitudin venenatis hendrerit. Ut dolor dolor, commodo sit amet arcu eget, porttitor aliquam justo. Fusce maximus laoreet turpis sit amet molestie. Nulla facilisi. |
|||
|
|||
Curabitur ut sapien et velit rutrum laoreet. Cras ac aliquet massa. Pellentesque elementum ornare orci. Donec mattis auctor lacus, quis dignissim arcu sollicitudin sit amet. Etiam imperdiet, risus sed condimentum interdum, ante est mattis sem, a tempor mi odio eget tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Proin sed justo ac nisi aliquam efficitur nec venenatis turpis. |
|||
|
|||
Nulla pretium, purus vitae pretium porttitor, elit purus sagittis leo, ut blandit arcu nisl a metus. Nunc sit amet arcu ac magna finibus suscipit. Sed malesuada sem arcu, id egestas risus pharetra at. Sed sed pulvinar massa, at ornare odio. Donec quis magna sed turpis rhoncus dignissim. Aenean scelerisque sapien nec interdum suscipit. Donec sit amet tincidunt odio, in fermentum eros. Morbi varius augue nulla. Aliquam erat volutpat. Sed sit amet ligula hendrerit nisl posuere venenatis placerat quis sem. Phasellus in iaculis urna. Etiam mollis arcu eget dui volutpat molestie. Pellentesque sodales leo nec mi interdum interdum. Proin at gravida ante. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. |
|||
|
|||
Donec non massa sapien. Aenean ligula lectus, iaculis ut tempus quis, scelerisque sit amet dui. Donec varius dui sed elit consectetur rhoncus non in leo. Quisque feugiat lobortis magna, eu auctor nisi sodales et. Fusce nec iaculis arcu. Morbi placerat pellentesque felis sed eleifend. Vivamus consectetur felis fringilla urna porta aliquam. |
|||
|
|||
Nam rhoncus lacus libero, ut tincidunt lorem ultricies vel. Proin nibh neque, tempor quis nulla ac, vulputate dapibus metus. Proin rhoncus a diam quis hendrerit. Ut laoreet est id erat gravida, vitae aliquet lorem suscipit. Mauris eu tempor metus, sit amet blandit erat. Aenean viverra imperdiet orci, at condimentum nunc euismod ac. Suspendisse lectus augue, venenatis ullamcorper sollicitudin vel, venenatis vitae dui. In in velit feugiat, molestie nibh vitae, finibus elit. Nulla mattis metus eu finibus laoreet. Nullam lobortis dui ac feugiat dictum. |
@ -0,0 +1,15 @@ |
|||
Title: What types of bots are there? |
|||
Slug: what-types-of-bots-are-there |
|||
Date: 2020-08-25 12:00 |
|||
|
|||
What types of bots are there? |
|||
|
|||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse in libero viverra risus pulvinar congue. Sed pellentesque condimentum cursus. Quisque vestibulum ex quis tincidunt faucibus. Etiam porta nec eros quis ornare. Curabitur posuere lorem a lectus tincidunt fermentum. Nunc efficitur neque in mattis ullamcorper. Nullam aliquam nunc et elit tempor hendrerit. Proin eu erat sit amet nisl ultrices feugiat. Suspendisse dignissim ipsum sed ex porttitor molestie. Aenean elementum vitae justo eget scelerisque. Phasellus in quam vulputate, tempus libero eu, ornare tellus. Etiam sollicitudin venenatis hendrerit. Ut dolor dolor, commodo sit amet arcu eget, porttitor aliquam justo. Fusce maximus laoreet turpis sit amet molestie. Nulla facilisi. |
|||
|
|||
Curabitur ut sapien et velit rutrum laoreet. Cras ac aliquet massa. Pellentesque elementum ornare orci. Donec mattis auctor lacus, quis dignissim arcu sollicitudin sit amet. Etiam imperdiet, risus sed condimentum interdum, ante est mattis sem, a tempor mi odio eget tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Proin sed justo ac nisi aliquam efficitur nec venenatis turpis. |
|||
|
|||
Nulla pretium, purus vitae pretium porttitor, elit purus sagittis leo, ut blandit arcu nisl a metus. Nunc sit amet arcu ac magna finibus suscipit. Sed malesuada sem arcu, id egestas risus pharetra at. Sed sed pulvinar massa, at ornare odio. Donec quis magna sed turpis rhoncus dignissim. Aenean scelerisque sapien nec interdum suscipit. Donec sit amet tincidunt odio, in fermentum eros. Morbi varius augue nulla. Aliquam erat volutpat. Sed sit amet ligula hendrerit nisl posuere venenatis placerat quis sem. Phasellus in iaculis urna. Etiam mollis arcu eget dui volutpat molestie. Pellentesque sodales leo nec mi interdum interdum. Proin at gravida ante. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. |
|||
|
|||
Donec non massa sapien. Aenean ligula lectus, iaculis ut tempus quis, scelerisque sit amet dui. Donec varius dui sed elit consectetur rhoncus non in leo. Quisque feugiat lobortis magna, eu auctor nisi sodales et. Fusce nec iaculis arcu. Morbi placerat pellentesque felis sed eleifend. Vivamus consectetur felis fringilla urna porta aliquam. |
|||
|
|||
Nam rhoncus lacus libero, ut tincidunt lorem ultricies vel. Proin nibh neque, tempor quis nulla ac, vulputate dapibus metus. Proin rhoncus a diam quis hendrerit. Ut laoreet est id erat gravida, vitae aliquet lorem suscipit. Mauris eu tempor metus, sit amet blandit erat. Aenean viverra imperdiet orci, at condimentum nunc euismod ac. Suspendisse lectus augue, venenatis ullamcorper sollicitudin vel, venenatis vitae dui. In in velit feugiat, molestie nibh vitae, finibus elit. Nulla mattis metus eu finibus laoreet. Nullam lobortis dui ac feugiat dictum. |
@ -0,0 +1,7 @@ |
|||
Title: About this Module |
|||
Date: 2020-08-25 12:00 |
|||
Slug: about-this-module |
|||
|
|||
|
|||
This is the online module Bots as Digital Infrapuncture, commissioned by the University of Utrecht |
|||
|
@ -0,0 +1,38 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding: utf-8 -*- # |
|||
|
|||
AUTHOR = 'Cristina Cochior & Manetta Berends' |
|||
SITENAME = 'Bots as Digital Infrapuncture' |
|||
SITEURL = '' |
|||
|
|||
PATH = 'content' |
|||
USE_FOLDER_AS_CATEGORY = True |
|||
|
|||
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 = (('Pelican', 'https://getpelican.com/'), |
|||
# ('Python.org', 'https://www.python.org/'), |
|||
# ('Jinja2', 'https://palletsprojects.com/p/jinja/'), |
|||
# ('You can modify those links in your config file', '#'),) |
|||
|
|||
# Social widget |
|||
# SOCIAL = (('You can add links in your config file', '#'), |
|||
# ('Another social link', '#'),) |
|||
|
|||
DEFAULT_PAGINATION = False |
|||
|
|||
# Uncomment following line if you want document-relative URLs when developing |
|||
#RELATIVE_URLS = True |
|||
|
|||
STATIC_PATHS = ['extra/favicon.ico', 'images', 'pdfs', 'stream'] |
|||
|
@ -0,0 +1,24 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding: utf-8 -*- # |
|||
|
|||
# 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 = '' |
|||
RELATIVE_URLS = False |
|||
|
|||
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 = "" |
@ -0,0 +1,118 @@ |
|||
# -*- 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 |
|||
|
|||
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) |
|||
|
|||
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 |
|||
build(c) |
|||
server = Server() |
|||
# Watch the base settings file |
|||
server.watch(CONFIG['settings_base'], lambda: build(c)) |
|||
# Watch content source files |
|||
content_file_extensions = ['.md', '.rst'] |
|||
for extension in content_file_extensions: |
|||
content_blob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension) |
|||
server.watch(content_blob, lambda: build(c)) |
|||
# Watch the theme's templates and static assets |
|||
theme_path = SETTINGS['THEME'] |
|||
server.watch('{}/templates/*.html'.format(theme_path), lambda: build(c)) |
|||
static_file_extensions = ['.css', '.js'] |
|||
for extension in static_file_extensions: |
|||
static_file = '{0}/static/**/*{1}'.format(theme_path, extension) |
|||
server.watch(static_file, lambda: build(c)) |
|||
# Serve output path on configured host and port |
|||
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)) |
Loading…
Reference in new issue