diff --git a/.gitignore b/.gitignore index 5ceb386..7f93ebf 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ venv +__pycache__ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9924c42 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "conference/buruma"] + path = conference/buruma + url = https://github.com/ivanhercaz/buruma.git +[submodule "conference/plugins"] + path = conference/plugins + url = https://github.com/getpelican/pelican-plugins +[submodule "test/plugins"] + path = test/plugins + url = https://github.com/getpelican/pelican-plugins +[submodule "conference/other-plugins/pelican-redirect"] + path = conference/other-plugins/pelican-redirect + url = https://github.com/slinkp/pelican-redirect diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bf9bf73 --- /dev/null +++ b/Makefile @@ -0,0 +1,75 @@ +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) + +rsync_upload: publish + rsync -avz $(OUTPUTDIR)/ $(SSH_HOST=:$(SSH_TARGET_DIR) + +.PHONY: html help clean regenerate serve serve-global devserver publish diff --git a/content/pages/2020.md b/content/pages/2020.md new file mode 100644 index 0000000..cd51d01 --- /dev/null +++ b/content/pages/2020.md @@ -0,0 +1,35 @@ +title: Settima Conferenza Italiana - LibreItalia - 2020 +slug: 2020 +alias: / + +# La LibreItaliaConf in breve # + +
+

+Sabato 19 dicembre 2020
dalle ore 9.30 alle ore 18.00
+ +

+Online
+ +

+È aperta al pubblico
+
+ +# Programma ufficiale # + +**NOTA BENE**: il programma definitivo della giornata non è ancora stato +definito. Questa pagina sarà aggiornata quando il programma definitivo sarà +disponibile. + +Per il momento, ecco il programma di massima: + +||| +|:-:|:-| +|| **Mattina** | +| 09:30 - 10:00 | Introduzione, accoglienza, *caffè digitale* | +| 10:00 - 10:30 | Saluti, rendicontazione, prospettive - LibreItalia | +| 10:30 - 13:00 | Interventi | +|| **Pomeriggio** | +| 14:00 - 16:30 | Tavola rotonda - Prima Parte | +| 16:30 - 17:00 | *Tè digitale* | +| 17:00 - 18:00 | Tavola rotonda - Seconda Parte | diff --git a/content/pages/live.md b/content/pages/live.md new file mode 100644 index 0000000..a7d5109 --- /dev/null +++ b/content/pages/live.md @@ -0,0 +1,8 @@ +title: Live - Conferenza Italiana LibreItalia +slug: live +template: large + +# Live - Settima Conferenza Italiana LibreItalia 2020 # + + + diff --git a/pelicanconf.py b/pelicanconf.py new file mode 100644 index 0000000..3fb4771 --- /dev/null +++ b/pelicanconf.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- # +# vim:sts=4:sw=4 + +AUTHOR = 'LibreItalia' +SITENAME = 'Conferenze - LibreItalia' +SITEURL = '' + +PATH = 'content' + +TIMEZONE = 'Europe/Rome' + +DEFAULT_LANG = 'it' + +PLUGIN_PATHS = [ "plugins", ] +PLUGINS = [ "pelican_alias", ] + +DEFAULT_PAGINATION = False + +PAGE_URL = '{slug}/' +PAGE_SAVE_AS = '{slug}/index.html' + +MENUITEMS = ( ("2020", "/2020/"), ) +DISPLAY_PAGES_ON_MENU = False +DISPLAY_CATEGORIES_ON_MENU = False + +# Blue Penguin theme +THEME = 'themes/blue-penguin' +DISPLAY_FOOTER = False +DISPLAY_HOME = False + +# Gum theme +#THEME = 'themes/gum' + +# Foundation theme +#THEME = 'themes/foundation' +#FOUNDATION_FOOTER_TEXT = " " + +# Buruma theme +#THEME = 'themes/buruma' +#JINJA_ENVIRONMENT = { +# "extensions": ["jinja2.ext.i18n"], +#} +#PLUGINS = ["i18n_subsites", "pelican_alias", ] +#CATS_NOT_DROPDOWN = True +#MENUITEMS_NAVBAR = ( ("2020", "/2020/"), ) +#FOOTER = () + +# 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', '#'),) + +# Uncomment following line if you want document-relative URLs when developing +RELATIVE_URLS = True + +# Deploy +SSH_HOST = "ciccio" +SSH_TARGET_DIR = "/var/lib/nethserver/vhost/conference" diff --git a/publishconf.py b/publishconf.py new file mode 100644 index 0000000..5fdc7d2 --- /dev/null +++ b/publishconf.py @@ -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 = "" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..09c38c3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +blinker==1.4 +docutils==0.16 +feedgenerator==1.9.1 +Jinja2==2.11.2 +Markdown==3.3.3 +MarkupSafe==1.1.1 +pelican==4.5.1 +pelican-alias==1.1 +Pygments==2.6.1 +python-dateutil==2.8.1 +pytz==2020.4 +six==1.15.0 +Unidecode==1.1.1 diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..f517267 --- /dev/null +++ b/tasks.py @@ -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)) \ No newline at end of file diff --git a/themes/blue-penguin/CONTRIBUTORS.md b/themes/blue-penguin/CONTRIBUTORS.md new file mode 100644 index 0000000..e6f7da7 --- /dev/null +++ b/themes/blue-penguin/CONTRIBUTORS.md @@ -0,0 +1,19 @@ +# Contributors + +* [Nevan Scott](https://github.com/nevanscott/Mockingbird) (original author) +* [wrl](https://github.com/wrl/pelican-mockingbird) (port to pelican, pelican-mockingbird) +* [Jody Frankowski](http://github.com/jody-frankowski) (Blue Penguin) +* [Grimbox](https://github.com/Grimbox) +* [ix5](https://github.com/ix5) +* [dn0](https://github.com/dn0) +* [anhtuann](https://github.com/anhtuann) +* [aperep](https://github.com/aperep) +* [iranzo](https://github.com/iranzo) +* [thetlk](https://github.com/thetlk) +* [SnorlaxYum](https://github.com/SnorlaxYum) +* [guikcd](https://github.com/guikcd) +* [jorgesumle](https://github.com/jorgesumle) +* [crxxn](https://github.com/crxxn) +* [gavinzbq](https://github.com/gavinzbq) +* [sylvainmetayer](https://github.com/sylvainmetayer) +* [wbob](https://github.com/wbob) diff --git a/themes/blue-penguin/README.md b/themes/blue-penguin/README.md new file mode 100644 index 0000000..7eca0b7 --- /dev/null +++ b/themes/blue-penguin/README.md @@ -0,0 +1,60 @@ +![screenshot](screenshot.png) + +# Blue Penguin for pelican +A simple theme for pelican. Solarized pygments. Feeds support. + +## Settings +```python +# all the following settings are *optional* + +# HTML metadata +SITEDESCRIPTION = '' + +# all defaults to True. +DISPLAY_HEADER = True +DISPLAY_FOOTER = True +DISPLAY_HOME = True +DISPLAY_MENU = True + +# provided as examples, they make ‘clean’ urls. used by MENU_INTERNAL_PAGES. +TAGS_URL = 'tags' +TAGS_SAVE_AS = 'tags/index.html' +AUTHORS_URL = 'authors' +AUTHORS_SAVE_AS = 'authors/index.html' +CATEGORIES_URL = 'categories' +CATEGORIES_SAVE_AS = 'categories/index.html' +ARCHIVES_URL = 'archives' +ARCHIVES_SAVE_AS = 'archives/index.html' + +# use those if you want pelican standard pages to appear in your menu +MENU_INTERNAL_PAGES = ( + ('Tags', TAGS_URL, TAGS_SAVE_AS), + ('Authors', AUTHORS_URL, AUTHORS_SAVE_AS), + ('Categories', CATEGORIES_URL, CATEGORIES_SAVE_AS), + ('Archives', ARCHIVES_URL, ARCHIVES_SAVE_AS), +) +# additional menu items +MENUITEMS = ( + ('GitHub', 'https://github.com/'), + ('Linux Kernel', 'https://www.kernel.org/'), +) + +# example pagination pattern +PAGINATION_PATTERNS = ( + (1, '{url}', '{save_as}'), + (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'), +) + +``` + +## How to contribute +Contributions are very welcome. Keep in mind that this theme goal is to be +minimalistic/simple. Contributions will be accepted through Github Pull +Requests. If you don’t have a Github account you can suggest me your +changes by email. + +## Contributors +See [CONTRIBUTORS.md](CONTRIBUTORS.md). + +## License +Public domain. diff --git a/themes/blue-penguin/screenshot.png b/themes/blue-penguin/screenshot.png new file mode 100644 index 0000000..fc5c406 Binary files /dev/null and b/themes/blue-penguin/screenshot.png differ diff --git a/themes/blue-penguin/static/css/large.css b/themes/blue-penguin/static/css/large.css new file mode 100644 index 0000000..9d405ba --- /dev/null +++ b/themes/blue-penguin/static/css/large.css @@ -0,0 +1,418 @@ +/* http://meyerweb.com/eric/tools/css/reset/ +v2.0 | 20110126 +License: none (public domain) + */ +/* Mockingbird Theme by Nevan Scott nevanscott.com */ +/* Modified by Jody Frankowski */ +/* Modified by ix5 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +em { + font-style: italic; +} +strong { + font-weight: bold; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +body { + font-family: sans-serif; + font-size: 16px; + line-height: 1.5em; +} + +header, #wrapper { + padding: 0 0px; + margin: auto; +} + +a { + text-decoration: none; + color: #3a7c78; +} + +ul { + list-style: outside disc; +} + +ol { + list-style: outside decimal; +} + +h1, h2, h3, h4, h5, h6 { + font-family: sans-serif; + font-weight: bold; +} +h1, h2, h3 { + font-size: 1.5em; + line-height: 1em; + margin: 1em 0; +} + +img, p, .post > .highlight, .highlighttable, h4, h5, h6 { + margin-top: 1.2em; +} +img + em { + font-size: .8em; +} + +blockquote { + margin: 1.5em 1.5em 1.5em .75em; + padding-left: .75em; + border-left: 1px solid #EEE; +} + +table { + width: 100%; + margin: 1em 0; +} +thead { + border-bottom: 1px solid black; +} + +.date { + color: #CCC; + float: left; + clear: both; + width: 130px; + font-size: 1.5em; + line-height: 1em; + margin: 0 20px 1em 0; +} + +.info { + margin-top: 1.3em; + font-family: sans-serif; + text-align: right; + color: #BBB; +} +.info a { + color: inherit; +} +.info a.tags { + background: #CCC; + color: #FFF; + display: inline-block; + padding: 0 .3em; + border: 1px transparent solid; + border-radius: 5px; + margin: 0 0 0.3em 0; +} +.info a.tags:hover { + background: inherit; + color: inherit; +} +.info a.tags.selected { + border: 1px #999 solid; +} + +.post { + margin: 0 0 1em 150px; +} +.post.archives { + margin-bottom: 1.5em; + margin-left: 160px; +} +.post p { + text-align: justify; +} + +.page { + margin: 0 90px; +} + +.highlight { + border-radius: 3px; +} +.code > .highlight { + border-radius: 0px 3px 3px 0px; +} +.linenos { + border-radius: 3px 0px 0px 3px; + background-color: #073642; + border-right: 1px solid #00232C; + color: #586E75; + text-shadow: 0px -1px #021014; +} +td.code { + width: 100%; + max-width: 100px; +} +.linenos a { + color: #586E75; +} + +img { + box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.15); + border-radius: 0.3em; + max-width: 100%; + display: block; + margin-left: auto; + margin-right: auto; +} + +/*sub and sup stolen from Twitter bootstrap.*/ +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +.post pre, .page pre { + padding: .8em; + font-size: 12px; + font-family: Monospace; + line-height: 1.1em; + overflow: auto; +} + +form.inline_edit { + clear: both; + margin: 1em 0; + background-color: #DDD; + color: #000; + padding: 20px; + border-radius: 5px; +} +.inline_edit .sub { + color: #888; + white-space: nowrap; +} +.inline_edit label { + float: left; + clear: both; + width: 140px; + margin-right: 20px; +} +.inline_edit .buttons { + display: block; + text-align: right; +} + +nav ul { + float: right; + list-style: none; + margin: 0 0 0 3em; + padding: 0; +} +nav li { + float: left; +} +nav a { + display: block; + padding: 1em 10px 10px 10px; +} +nav a:hover { + background-color: #3a7c78; + color: #FFF; +} +nav li.selected a { + background-color: #15A9DB; + color: #FFF; +} + +header .header_box { + padding-top: 1em; +} +header h1 { + font-size: 1.5em; + line-height: 1em; + margin: 0; +} +header h2 { + font-size: 1em; + margin: .3em 0; + color: #DDD; +} + +#content { + margin-top: 3em; +} + +#embedded-chat { + width: 300px; +} + +.pages { + font-family: sans-serif; + line-height: 2.5em; + margin: 1em 0 3em; + background-color: #F9F9F9; + border-radius: 5px; +} +.pages a.next_page { + float: right; + width: 140px; + text-align: center; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #EEE; +} +.pages a.prev_page { + float: left; + width: 140px; + text-align: center; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + background-color: #EEE; +} +.pages a { + color: inherit; + border: none; +} +.pages a:hover { + background-color: #DDD; +} +.pages span { + display: block; + margin: 0 160px; + text-align: center; +} + +code { + background-color: #F9F2F4; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + box-sizing: border-box; + color: #C7254E; + font-family: Monaco,Menlo,Consolas,"Courier New",monospace; + font-size: 12.6px; + line-height: 18px; + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + white-space: nowrap; +} + +footer { + font-family: sans-serif; + line-height: 2.5em; + text-align: center; + color: #BBB; + margin: 3em 0; + border: 1px solid #EEE; + border-radius: 5px; +} +footer p { margin: 0; } + +.right { float: right; } + +.clear { clear: both; } + +@media screen and (max-width: 1024px) { + #wrapper { + margin-left: 2.6em; + padding:1em; + } +} + +@media screen and (max-width: 800px), print { + #wrapper { + margin: 0; + padding: 1em; + } + .date { + width: 100%; + margin: 0 0 .5em 0; + } + .post { + margin: 0 0 1em 0; + } + .post pre, + .post code { + white-space: pre-wrap; + } + .archives { + margin: 0 0 1.5em 0 !important; + } + nav ul { + margin: 0 0 1em 0; + } +} +@media print { + * { + background: #fff; + } + #wrapper, #content { + margin: 0; + padding: 0; + } + header, footer, nav { + display: none; + } + img { + break-inside: avoid; + } + p, table, pre { + widows: 3; + orphans: 3; + } + h1, h2, h3, h4, h5, h6 { + break-after: avoid; + } + h1, h2 { + font-size: 14pt; + } + h3, h4, h4.date { + font-size: 12pt; + } + .post p, .post ul li, .post ol li, .post table { + font-size: 11pt; + } +} +@page { + margin: 1.5cm; +} diff --git a/themes/blue-penguin/static/css/main.css b/themes/blue-penguin/static/css/main.css new file mode 100644 index 0000000..abbe88a --- /dev/null +++ b/themes/blue-penguin/static/css/main.css @@ -0,0 +1,415 @@ +/* http://meyerweb.com/eric/tools/css/reset/ +v2.0 | 20110126 +License: none (public domain) + */ +/* Mockingbird Theme by Nevan Scott nevanscott.com */ +/* Modified by Jody Frankowski */ +/* Modified by ix5 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +em { + font-style: italic; +} +strong { + font-weight: bold; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +body { + font-family: sans-serif; + font-size: 16px; + line-height: 1.5em; +} + +header, #wrapper { + padding: 0 0px; + max-width: 1080px; + margin: auto; +} + +a { + text-decoration: none; + color: #3a7c78; +} + +ul { + list-style: outside disc; +} + +ol { + list-style: outside decimal; +} + +h1, h2, h3, h4, h5, h6 { + font-family: sans-serif; + font-weight: bold; +} +h1, h2, h3 { + font-size: 1.5em; + line-height: 1em; + margin: 1em 0; +} + +img, p, .post > .highlight, .highlighttable, h4, h5, h6 { + margin-top: 1.2em; +} +img + em { + font-size: .8em; +} + +blockquote { + margin: 1.5em 1.5em 1.5em .75em; + padding-left: .75em; + border-left: 1px solid #EEE; +} + +table { + width: 100%; + margin: 1em 0; +} +thead { + border-bottom: 1px solid black; +} + +.date { + color: #CCC; + float: left; + clear: both; + width: 130px; + font-size: 1.5em; + line-height: 1em; + margin: 0 20px 1em 0; +} + +.info { + margin-top: 1.3em; + font-family: sans-serif; + text-align: right; + color: #BBB; +} +.info a { + color: inherit; +} +.info a.tags { + background: #CCC; + color: #FFF; + display: inline-block; + padding: 0 .3em; + border: 1px transparent solid; + border-radius: 5px; + margin: 0 0 0.3em 0; +} +.info a.tags:hover { + background: inherit; + color: inherit; +} +.info a.tags.selected { + border: 1px #999 solid; +} + +.post { + margin: 0 0 1em 150px; +} +.post.archives { + margin-bottom: 1.5em; + margin-left: 160px; +} +.post p { + text-align: justify; +} + +.page { + margin: 0 90px; +} + +.highlight { + border-radius: 3px; +} +.code > .highlight { + border-radius: 0px 3px 3px 0px; +} +.linenos { + border-radius: 3px 0px 0px 3px; + background-color: #073642; + border-right: 1px solid #00232C; + color: #586E75; + text-shadow: 0px -1px #021014; +} +td.code { + width: 100%; + max-width: 100px; +} +.linenos a { + color: #586E75; +} + +img { + box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.15); + border-radius: 0.3em; + max-width: 100%; + display: block; + margin-left: auto; + margin-right: auto; +} + +/*sub and sup stolen from Twitter bootstrap.*/ +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +.post pre, .page pre { + padding: .8em; + font-size: 12px; + font-family: Monospace; + line-height: 1.1em; + overflow: auto; +} + +form.inline_edit { + clear: both; + margin: 1em 0; + background-color: #DDD; + color: #000; + padding: 20px; + border-radius: 5px; +} +.inline_edit .sub { + color: #888; + white-space: nowrap; +} +.inline_edit label { + float: left; + clear: both; + width: 140px; + margin-right: 20px; +} +.inline_edit .buttons { + display: block; + text-align: right; +} + +nav ul { + float: right; + list-style: none; + margin: 0 0 0 3em; + padding: 0; +} +nav li { + float: left; +} +nav a { + display: block; + padding: 1em 10px 10px 10px; +} +nav a:hover { + background-color: #3a7c78; + color: #FFF; +} +nav li.selected a { + background-color: #15A9DB; + color: #FFF; +} + +header .header_box { + padding-top: 1em; +} +header h1 { + font-size: 1.5em; + line-height: 1em; + margin: 0; +} +header h2 { + font-size: 1em; + margin: .3em 0; + color: #DDD; +} + +#content { + margin-top: 3em; +} + +.pages { + font-family: sans-serif; + line-height: 2.5em; + margin: 1em 0 3em; + background-color: #F9F9F9; + border-radius: 5px; +} +.pages a.next_page { + float: right; + width: 140px; + text-align: center; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #EEE; +} +.pages a.prev_page { + float: left; + width: 140px; + text-align: center; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + background-color: #EEE; +} +.pages a { + color: inherit; + border: none; +} +.pages a:hover { + background-color: #DDD; +} +.pages span { + display: block; + margin: 0 160px; + text-align: center; +} + +code { + background-color: #F9F2F4; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + box-sizing: border-box; + color: #C7254E; + font-family: Monaco,Menlo,Consolas,"Courier New",monospace; + font-size: 12.6px; + line-height: 18px; + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + white-space: nowrap; +} + +footer { + font-family: sans-serif; + line-height: 2.5em; + text-align: center; + color: #BBB; + margin: 3em 0; + border: 1px solid #EEE; + border-radius: 5px; +} +footer p { margin: 0; } + +.right { float: right; } + +.clear { clear: both; } + +@media screen and (max-width: 1024px) { + #wrapper { + margin-left: 2.6em; + padding:1em; + } +} + +@media screen and (max-width: 800px), print { + #wrapper { + margin: 0; + padding: 1em; + } + .date { + width: 100%; + margin: 0 0 .5em 0; + } + .post { + margin: 0 0 1em 0; + } + .post pre, + .post code { + white-space: pre-wrap; + } + .archives { + margin: 0 0 1.5em 0 !important; + } + nav ul { + margin: 0 0 1em 0; + } +} +@media print { + * { + background: #fff; + } + #wrapper, #content { + margin: 0; + padding: 0; + } + header, footer, nav { + display: none; + } + img { + break-inside: avoid; + } + p, table, pre { + widows: 3; + orphans: 3; + } + h1, h2, h3, h4, h5, h6 { + break-after: avoid; + } + h1, h2 { + font-size: 14pt; + } + h3, h4, h4.date { + font-size: 12pt; + } + .post p, .post ul li, .post ol li, .post table { + font-size: 11pt; + } +} +@page { + margin: 1.5cm; +} diff --git a/themes/blue-penguin/static/css/pygments.css b/themes/blue-penguin/static/css/pygments.css new file mode 100644 index 0000000..91ae326 --- /dev/null +++ b/themes/blue-penguin/static/css/pygments.css @@ -0,0 +1,87 @@ +/* Solarized Dark + +For use with Jekyll and Pygments + +http://ethanschoonover.com/solarized + +SOLARIZED HEX ROLE +--------- -------- ------------------------------------------ +base03 #002b36 background +base01 #586e75 comments / secondary content +base1 #93a1a1 body text / default code / primary content +orange #cb4b16 constants +red #dc322f regex, special keywords +blue #268bd2 reserved keywords +cyan #2aa198 strings, numbers +green #859900 operators, other keywords +*/ + +.highlight { background-color: #002b36; color: #93a1a1 } +.highlight .c { color: #586e75 } /* Comment */ +.highlight .err { color: #93a1a1 } /* Error */ +.highlight .g { color: #93a1a1 } /* Generic */ +.highlight .k { color: #859900 } /* Keyword */ +.highlight .l { color: #93a1a1 } /* Literal */ +.highlight .n { color: #93a1a1 } /* Name */ +.highlight .o { color: #859900 } /* Operator */ +.highlight .x { color: #cb4b16 } /* Other */ +.highlight .p { color: #93a1a1 } /* Punctuation */ +.highlight .cm { color: #586e75 } /* Comment.Multiline */ +.highlight .cp { color: #859900 } /* Comment.Preproc */ +.highlight .c1 { color: #586e75 } /* Comment.Single */ +.highlight .cs { color: #859900 } /* Comment.Special */ +.highlight .gd { color: #2aa198 } /* Generic.Deleted */ +.highlight .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #dc322f } /* Generic.Error */ +.highlight .gh { color: #cb4b16 } /* Generic.Heading */ +.highlight .gi { color: #859900 } /* Generic.Inserted */ +.highlight .go { color: #93a1a1 } /* Generic.Output */ +.highlight .gp { color: #93a1a1 } /* Generic.Prompt */ +.highlight .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #cb4b16 } /* Generic.Subheading */ +.highlight .gt { color: #93a1a1 } /* Generic.Traceback */ +.highlight .kc { color: #cb4b16 } /* Keyword.Constant */ +.highlight .kd { color: #268bd2 } /* Keyword.Declaration */ +.highlight .kn { color: #859900 } /* Keyword.Namespace */ +.highlight .kp { color: #859900 } /* Keyword.Pseudo */ +.highlight .kr { color: #268bd2 } /* Keyword.Reserved */ +.highlight .kt { color: #dc322f } /* Keyword.Type */ +.highlight .ld { color: #93a1a1 } /* Literal.Date */ +.highlight .m { color: #2aa198 } /* Literal.Number */ +.highlight .s { color: #2aa198 } /* Literal.String */ +.highlight .na { color: #93a1a1 } /* Name.Attribute */ +.highlight .nb { color: #B58900 } /* Name.Builtin */ +.highlight .nc { color: #268bd2 } /* Name.Class */ +.highlight .no { color: #cb4b16 } /* Name.Constant */ +.highlight .nd { color: #268bd2 } /* Name.Decorator */ +.highlight .ni { color: #cb4b16 } /* Name.Entity */ +.highlight .ne { color: #cb4b16 } /* Name.Exception */ +.highlight .nf { color: #268bd2 } /* Name.Function */ +.highlight .nl { color: #93a1a1 } /* Name.Label */ +.highlight .nn { color: #93a1a1 } /* Name.Namespace */ +.highlight .nx { color: #93a1a1 } /* Name.Other */ +.highlight .py { color: #93a1a1 } /* Name.Property */ +.highlight .nt { color: #268bd2 } /* Name.Tag */ +.highlight .nv { color: #268bd2 } /* Name.Variable */ +.highlight .ow { color: #859900 } /* Operator.Word */ +.highlight .w { color: #93a1a1 } /* Text.Whitespace */ +.highlight .mf { color: #2aa198 } /* Literal.Number.Float */ +.highlight .mh { color: #2aa198 } /* Literal.Number.Hex */ +.highlight .mi { color: #2aa198 } /* Literal.Number.Integer */ +.highlight .mo { color: #2aa198 } /* Literal.Number.Oct */ +.highlight .sb { color: #586e75 } /* Literal.String.Backtick */ +.highlight .sc { color: #2aa198 } /* Literal.String.Char */ +.highlight .sd { color: #93a1a1 } /* Literal.String.Doc */ +.highlight .s2 { color: #2aa198 } /* Literal.String.Double */ +.highlight .se { color: #cb4b16 } /* Literal.String.Escape */ +.highlight .sh { color: #93a1a1 } /* Literal.String.Heredoc */ +.highlight .si { color: #2aa198 } /* Literal.String.Interpol */ +.highlight .sx { color: #2aa198 } /* Literal.String.Other */ +.highlight .sr { color: #dc322f } /* Literal.String.Regex */ +.highlight .s1 { color: #2aa198 } /* Literal.String.Single */ +.highlight .ss { color: #2aa198 } /* Literal.String.Symbol */ +.highlight .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #268bd2 } /* Name.Variable.Class */ +.highlight .vg { color: #268bd2 } /* Name.Variable.Global */ +.highlight .vi { color: #268bd2 } /* Name.Variable.Instance */ +.highlight .il { color: #2aa198 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/themes/blue-penguin/templates/analytics.html b/themes/blue-penguin/templates/analytics.html new file mode 100644 index 0000000..ba174fc --- /dev/null +++ b/themes/blue-penguin/templates/analytics.html @@ -0,0 +1,11 @@ +{% if GOOGLE_ANALYTICS %} + + +{% endif %} \ No newline at end of file diff --git a/themes/blue-penguin/templates/archives.html b/themes/blue-penguin/templates/archives.html new file mode 100644 index 0000000..73c53ba --- /dev/null +++ b/themes/blue-penguin/templates/archives.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} | Archives{% endblock %} +{% block content %} + +

Archives

+ + {# based on http://stackoverflow.com/questions/12764291/jinja2-group-by-month-year #} + + {% for year, year_group in dates|groupby('date.year')|reverse %} + {% for month, month_group in year_group|groupby('date.month')|reverse %} +

{{ (month_group|first).date|strftime('%b %Y') }}

+
+ +
+ {% endfor %} + {% endfor %} +{% endblock %} diff --git a/themes/blue-penguin/templates/article.html b/themes/blue-penguin/templates/article.html new file mode 100644 index 0000000..40c60b1 --- /dev/null +++ b/themes/blue-penguin/templates/article.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block head %} + {{ super() }} + {% if article.tags %} + + {% endif %} + {% if article.description %} + + {% endif %} +{% endblock %} + +{% block title %}{{ SITENAME }} | {{ article.title|striptags }}{% endblock %} + +{% block content %} +{% include "article_stub.html" %} +{% endblock %} diff --git a/themes/blue-penguin/templates/article_stub.html b/themes/blue-penguin/templates/article_stub.html new file mode 100644 index 0000000..ce7dc98 --- /dev/null +++ b/themes/blue-penguin/templates/article_stub.html @@ -0,0 +1,37 @@ + {% if not articles_page or first_article_of_day %} +

{{ article.date.strftime("%b %d, %Y") }}

+ {% endif %} + +
+ {% if article.title %} +

+ {{ article.title }} +

+ {% endif %} + + {% if not articles_page %} + {% include "translations.html" %} + {% endif %} + + + {{ article.content }} +
+ +
+ posted at {{ article.date.strftime("%H:%M") }} + {% if article.category.name != "misc" %} +  ·  + {% endif %} + {% if article.tags %} +  · + {% for t in article.tags %} +  {{ t }} + {% endfor %} + {% endif %} +
+ {% if articles_page and DISQUS_SITENAME %} + Click to read and post comments + {% else %} + {% include "disqus.html" %} + {% endif %} +
diff --git a/themes/blue-penguin/templates/author.html b/themes/blue-penguin/templates/author.html new file mode 100644 index 0000000..b9ff61e --- /dev/null +++ b/themes/blue-penguin/templates/author.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} | Articles by {{ author }}{% endblock %} +{% block ephemeral_nav %} + + {{ ephemeral_nav_link(author, output_file, True) }} +{% endblock %} diff --git a/themes/blue-penguin/templates/base.html b/themes/blue-penguin/templates/base.html new file mode 100644 index 0000000..57ce1b0 --- /dev/null +++ b/themes/blue-penguin/templates/base.html @@ -0,0 +1,105 @@ +{% macro ephemeral_nav_link(what, where, selected=False) -%} +
  • {{what}}
  • +{%- endmacro -%} + + + + + {% block head %} + + + {% block title %}{{ SITENAME }}{% endblock title %} + {# favicon #} + + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% if FEED_ATOM %} + + {% endif %} + {% if FEED_RSS %} + + {% endif %} + {% if CATEGORY_FEED_ATOM and category %} + + {% endif %} + {% if CATEGORY_FEED_RSS and category %} + + {% endif %} + {% if TAG_FEED_ATOM and tag %} + + {% endif %} + {% if TAG_FEED_RSS and tag %} + + {% endif %} + + + + + + {% endblock head %} + + + + {% if DISPLAY_HEADER or DISPLAY_HEADER is not defined %} +
    + {% if DISPLAY_MENU or DISPLAY_MENU is not defined %} + + {% endif %} +
    +

    {{ SITENAME }}

    + {% if SITESUBTITLE %} +

    {{ SITESUBTITLE }}

    + {% endif %} +
    +
    + {% endif %} +
    +
    + {%- block content -%}{%- endblock %} + + {% if DISPLAY_FOOTER or DISPLAY_FOOTER is not defined %} +
    + + {% endif %} +
    +
    +
    +{% include 'analytics.html' %} + + diff --git a/themes/blue-penguin/templates/category.html b/themes/blue-penguin/templates/category.html new file mode 100644 index 0000000..6587d98 --- /dev/null +++ b/themes/blue-penguin/templates/category.html @@ -0,0 +1,6 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} | articles in the "{{ category }}" category{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %} +{% block ephemeral_nav %} + + {{ ephemeral_nav_link(category, output_file, True) }} +{% endblock %} diff --git a/themes/blue-penguin/templates/disqus.html b/themes/blue-penguin/templates/disqus.html new file mode 100644 index 0000000..b4093e5 --- /dev/null +++ b/themes/blue-penguin/templates/disqus.html @@ -0,0 +1,12 @@ +{% if DISQUS_SITENAME %} +
    + + +{% endif %} diff --git a/themes/blue-penguin/templates/index.html b/themes/blue-penguin/templates/index.html new file mode 100644 index 0000000..b8b40f4 --- /dev/null +++ b/themes/blue-penguin/templates/index.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }}{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %} +{% block content %} +{% set date = None %} +{% for article in articles_page.object_list %} +{% if date != article.date.date() %} +{% set first_article_of_day = True %} +{% else %} +{% set first_article_of_day = False %} +{% endif %} +{% set date = article.date.date() %} +{% include "article_stub.html" %} +{% endfor %} + +{% include "pagination.html" %} +{% endblock %} diff --git a/themes/blue-penguin/templates/large.html b/themes/blue-penguin/templates/large.html new file mode 100644 index 0000000..d352d7c --- /dev/null +++ b/themes/blue-penguin/templates/large.html @@ -0,0 +1,105 @@ +{% macro ephemeral_nav_link(what, where, selected=False) -%} +
  • {{what}}
  • +{%- endmacro -%} + + + + + {% block head %} + + + {% block title %}{{ SITENAME }}{% endblock title %} + {# favicon #} + + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% if FEED_ATOM %} + + {% endif %} + {% if FEED_RSS %} + + {% endif %} + {% if CATEGORY_FEED_ATOM and category %} + + {% endif %} + {% if CATEGORY_FEED_RSS and category %} + + {% endif %} + {% if TAG_FEED_ATOM and tag %} + + {% endif %} + {% if TAG_FEED_RSS and tag %} + + {% endif %} + + + + + + {% endblock head %} + + + + {% if DISPLAY_HEADER or DISPLAY_HEADER is not defined %} +
    + {% if DISPLAY_MENU or DISPLAY_MENU is not defined %} + + {% endif %} +
    +

    {{ SITENAME }}

    + {% if SITESUBTITLE %} +

    {{ SITESUBTITLE }}

    + {% endif %} +
    +
    + {% endif %} +
    +
    + {%- block content -%}{%- endblock %} + + {% if DISPLAY_FOOTER or DISPLAY_FOOTER is not defined %} +
    + + {% endif %} +
    +
    +
    +{% include 'analytics.html' %} + + diff --git a/themes/blue-penguin/templates/page.html b/themes/blue-penguin/templates/page.html new file mode 100644 index 0000000..c285678 --- /dev/null +++ b/themes/blue-penguin/templates/page.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} | {{ page.title }}{% endblock %} + +{% block content %} + +
    +

    {{ page.title }}

    + {{ page.content }} +
    +{% endblock %} diff --git a/themes/blue-penguin/templates/pagination.html b/themes/blue-penguin/templates/pagination.html new file mode 100644 index 0000000..6562444 --- /dev/null +++ b/themes/blue-penguin/templates/pagination.html @@ -0,0 +1,17 @@ +{# Use PAGINATION_PATTERNS or pagination may break #} +{% if DEFAULT_PAGINATION and (articles_page.has_previous() or articles_page.has_next()) %} + +
    +
    + + {% if articles_page.has_previous() %} + ← Previous + {% endif %} + + {% if articles_page.has_next() %} + Next → + {% endif %} + + Page {{ articles_page.number }} of {{ articles_paginator.num_pages }} +
    +{% endif %} diff --git a/themes/blue-penguin/templates/tag.html b/themes/blue-penguin/templates/tag.html new file mode 100644 index 0000000..92c3439 --- /dev/null +++ b/themes/blue-penguin/templates/tag.html @@ -0,0 +1,5 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} | articles tagged "{{ tag }}"{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %} +{% block ephemeral_nav %} + {{ ephemeral_nav_link(tag, output_file, True) }} +{% endblock %} diff --git a/themes/blue-penguin/templates/tags.html b/themes/blue-penguin/templates/tags.html new file mode 100644 index 0000000..ac65722 --- /dev/null +++ b/themes/blue-penguin/templates/tags.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block content %} + +{% endblock %} diff --git a/themes/blue-penguin/templates/translations.html b/themes/blue-penguin/templates/translations.html new file mode 100644 index 0000000..f0a0fa2 --- /dev/null +++ b/themes/blue-penguin/templates/translations.html @@ -0,0 +1,6 @@ +{% if article.translations %} +Translations: + {% for translation in article.translations %} + {{ translation.lang }} + {% endfor %} +{% endif %} \ No newline at end of file