summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile128
-rw-r--r--pelicanconf.py60
-rw-r--r--publishconf.py7
-rw-r--r--tasks.py143
4 files changed, 222 insertions, 116 deletions
diff --git a/Makefile b/Makefile
index ece0a1b..d0f350e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-PY?=python
+PY?=
PELICAN?=pelican
PELICANOPTS=
@@ -8,104 +8,88 @@ OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
-FTP_HOST=localhost
-FTP_USER=anonymous
-FTP_TARGET_DIR=/
-
SSH_HOST=lv2plug.in
SSH_PORT=22
SSH_USER=lvtwo
-SSH_TARGET_DIR=~/lv2plug.in
-
-S3_BUCKET=my_s3_bucket
-
-CLOUDFILES_USERNAME=my_rackspace_username
-CLOUDFILES_API_KEY=my_rackspace_api_key
-CLOUDFILES_CONTAINER=my_cloudfiles_container
+SSH_TARGET_DIR=/home/lvtwo/lv2plug.in
-DROPBOX_DIR=~/Dropbox/Public/
-
-GITHUB_PAGES_BRANCH=gh-pages
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)
- rm -f pelicanconf.pyc
+ [ ! -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)
+ scp -P $(SSH_PORT) -r "$(OUTPUTDIR)"/* "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"
-rsync_upload: publish
- rsync -e "ssh -p $(SSH_PORT)" -P -rvzc $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude
+sftp_upload: publish
+ printf 'put -r $(OUTPUTDIR)/*' | sftp $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
-dropbox_upload: publish
- cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR)
-
-ftp_upload: publish
- lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit"
-
-s3_upload: publish
- s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed --guess-mime-type
-
-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)"/author/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/author/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/category/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/category/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/feeds/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/feeds/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/images/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/images/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/pages/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/pages/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"/theme/
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)"
-github: publish
- ghp-import -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR)
- git push origin $(GITHUB_PAGES_BRANCH)
-.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 publish ssh_upload rsync_upload
diff --git a/pelicanconf.py b/pelicanconf.py
index 658a05d..133d498 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -1,25 +1,23 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*- #
-from __future__ import unicode_literals
-
-AUTHOR = u'David Robillard'
-SITENAME = u'LV2'
+AUTHOR = 'David Robillard'
+SITENAME = 'LV2'
SITELOGO = 'images/logo.svg'
SITELOGO_WIDTH = '13.097287em'
SITELOGO_HEIGHT = '12.2625em'
-SITEURL = 'https://lv2plug.in'
PATH = 'content'
TIMEZONE = 'America/Toronto'
-DEFAULT_LANG = u'en'
-ARTICLE_TRANSLATION_ID = None
-PAGE_TRANSLATION_ID = None
+DEFAULT_LANG = 'en'
THEME = 'themes/lv2'
-FAVICON = 'images/favicon.png'
+# 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 = ()
@@ -27,6 +25,8 @@ LINKS = ()
# Social widget
SOCIAL = ()
+# Menu
+
MENUITEMS = [('News', '/news.html'),
('Reference', 'http://lv2plug.in/ns/'),
('Developing', '/pages/developing.html'),
@@ -39,35 +39,17 @@ DEFAULT_PAGINATION = False
SUMMARY_MAX_LENGTH = None
DIRECT_TEMPLATES = ['news']
-PAGINATED_DIRECT_TEMPLATES = ['news']
+
+PAGINATED_TEMPLATES = {
+ 'author': 10,
+ 'category': 10,
+ 'index': None,
+ 'news': 10,
+ 'tag': 10,
+}
+
ARTICLE_PATHS = ['news']
-PAGE_URL = 'pages/{slug}'
-PAGE_PATHS = ['pages']
STATIC_PATHS = ['images', 'favicon.ico']
# Uncomment following line if you want document-relative URLs when developing
-RELATIVE_URLS = True
-
-
-DISPLAY_TAGS_ON_SIDEBAR = False
-DISPLAY_RECENT_POSTS_ON_SIDEBAR = False
-DISPLAY_SERIES_ON_SIDEBAR = False
-DISPLAY_CATEGORIES_ON_SIDEBAR = False
-
-PLUGIN_PATHS = ["extra_plugins"]
-PLUGINS = []
-
-GALLERY_FOLDER = "galleries"
-GALLERY_SRC_PATH = "%s%s" % (PATH, "/images/screenshots")
-GALLERY_OUTPUT_PATH = "%s%s" % ("output/", GALLERY_FOLDER)
-GALLERY_REGENERATE_EXISTING = True
-GALLERY_PRESETS = [
- {"name": "thumb",
- "actions": [{"type": "fit", "height": 100, "width": 100, "from": (0.5, 0.5)}]},
- {"name": "slider",
- "actions" : []},
- {"name": "large",
- "actions": [{"type": "resize", "height": 640, "width": 850, "from": (0.5, 0.5)}]},
- {"name": "thumb_greyscale",
- "actions": [{"type": "fit", "height": 100, "width": 100, "from": (0.5, 0.5)},
- {"type": "greyscale"} ]}]
+#RELATIVE_URLS = True
diff --git a/publishconf.py b/publishconf.py
index 1576ef7..3e358ca 100644
--- a/publishconf.py
+++ b/publishconf.py
@@ -1,7 +1,3 @@
-#!/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.
@@ -10,11 +6,12 @@ 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://lv2plug.in'
RELATIVE_URLS = False
FEED_ALL_ATOM = 'feeds/all.atom.xml'
-CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
+CATEGORY_FEED_ATOM = 'feeds/{slug}.atom.xml'
DELETE_OUTPUT_DIRECTORY = True
diff --git a/tasks.py b/tasks.py
new file mode 100644
index 0000000..da4957b
--- /dev/null
+++ b/tasks.py
@@ -0,0 +1,143 @@
+# -*- 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'],
+ # Remote server configuration
+ 'ssh_user': 'lvtwo',
+ 'ssh_host': 'lv2plug.in',
+ 'ssh_port': '22',
+ 'ssh_path': '~/lv2plug.in',
+ # 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