commit 858423f373e63f640a332564944a476940d402bb Author: cinnaboot Date: Thu Jun 29 12:18:56 2023 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95fab66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +output/ +__pycache__/ +venv/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f071905 --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +PY?= +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 devserver-global regenerate and serve on 0.0.0.0 ' + @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 \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..1b4d612 --- /dev/null +++ b/README @@ -0,0 +1,2 @@ + +Homepage for bxxa.cc diff --git a/content/test_article.md b/content/test_article.md new file mode 100644 index 0000000..3157d23 --- /dev/null +++ b/content/test_article.md @@ -0,0 +1,8 @@ +Title: Test Article +Date: 2023-06-27 +Category: Posts + +Test +---- + +Hello! diff --git a/content/tkey_passage.md b/content/tkey_passage.md new file mode 100644 index 0000000..593adb0 --- /dev/null +++ b/content/tkey_passage.md @@ -0,0 +1,101 @@ +Title: Tillitis TKey with passage password store +Date: 2023-06-27 +Category: Posts +Tags: Tutorial, Security, Hardware + +The [Tillitis TKey](https://www.tillitis.se/tkey/) is a recently released open hardware security key that you load with custom applications. One useful application is encrypting passwords for the [pass](https://www.passwordstore.org/) utility. + +Even more details about the TKey in this ~20 minute [video](https://www.youtube.com/watch?v=X7IllDLFKRk) + +Most of the existing libraries and utilities for the tkey are made with golang. Unfortunately, the official golang [package](https://pkg.go.dev/golang.org/x/crypto/openpgp) for OpenPGP is deprecated, and I haven't found any implementations of a [gpg-agent](https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html) or [scdaemon](https://www.gnupg.org/documentation/manuals/gnupg/Invoking-SCDAEMON.html) in golang. + +Fortunately, one of the Tillitis developers has started work on a [plugin](https://github.com/quite/age-plugin-tkey) for the [age](https://github.com/FiloSottile/age) encryption tool which we can use with a fork of the pass utility called [passage](https://github.com/FiloSottile/passage). + + +Building the Plugin: +-------------------- + +To start, install the `age` package for your distribuition. It is available in Arch, Debian, and Fedora. + +Next we can build the tkey device application from the age-plugin-tkey repo. It's worth repeating the warning from the plugin README: + +> Note that this is work in progress. The implementation may change, and this will cause a change of identity of a TKey running this device app. This would mean that the public/private key no longer is the same, and decryption of data encrypted for the previous key pair will not be possible. + +In other words, make sure you have a working backup of your data. Ideally in an offline storage. We can also use the 'multiple recipients' feature of 'age' to encrypt with the public key from the tkey, and another backup key in case of damage or loss. + +We'll follow the recommended steps of building the plugin with podman to ensure the checksums don't change. (Note: For Arch, I needed to add a subuid, and subgid range for my user [Arch Wiki Link](https://wiki.archlinux.org/title/Podman)). + + :::sh + $ git clone https://github.com/quite/age-plugin-tkey + $ cd age-plugin-tkey/contrib + $ make + +Now we should have a binary we can use to generate a new identity file for `age`. (Note that the --touch option when generating a key will require pressing the tkey for each decrypt action) + + :::sh + $ cd .. + $ ./age-plugin-tkey -g --touch > test_keys + # recipient: age1aaf428jance6wsw28qad8878xh48jh57wy3pxxa0ettntuzhlussr8qps5 + +Finally, we need to add the plugin to our $PATH: (assuming ~/bin is in your $PATH) + + :::sh + $ ln -s $(pwd)/age-plugin-tkey ~/bin/age-plugin-tkey + + +Installing Passage +------------------ + +This section is Arch linux specific, so feel free to skip if you can install passage more easily on your distribution. Otherwise, you can install from source, or build locally like we did with the age-plugin-tkey. + +Arch has a [PKGBUILD](https://aur.archlinux.org/packages/passage-git) for passage available in the Arch User Repository, but it is not updated to latest project tag at the time of writing. That's easy enough to correct. Download the PKGBUILD, Edit the 'pkgver' to the latest [tag](https://github.com/FiloSottile/passage/tags) from the project, and install. + + $ wget https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=passage-git -O PKGBUILD + $ vim PKGBUILD + $ makepkg -si + + +Setting up the Password Store +----------------------------- + +Create a directory for our encrypted password store, and copy the identity file we made earlier. + + $ mkdir ~/.passage + $ cp test_keys ~/.passage identities + $ cd ~/.passage + +At this point we should create our backup key. I'll put mine on an external sd card. + + $ age-keygen -o /mnt/external_card/backup_key.txt + # public key: age15nqg2rlyzj2hm4ancu9g774ygv3qzzy4l0zv3mgah6lm0u35uv9s2ara7j + +Now we add the public keys from the tkey and the backup to the recipients file + + $ mkdir store + $ echo age1aaf428jance6wsw28qad8878xh48jh57wy3pxxa0ettntuzhlussr8qps5 >> store/.age-recipients + $ echo age15nqg2rlyzj2hm4ancu9g774ygv3qzzy4l0zv3mgah6lm0u35uv9s2ara7j >> store/.age-recipients + +Finally, we can actually start using the password manager! + + $ passage insert -m testing/somesite + mkdir: created directory '/home/user/.passage/store/testing' + Enter contents of testing/somesite and press Ctrl+D when finished: + + somepassword + someuser + https://some.site + +If everything has gone correctly, we should be able to decrypt with the tkey identity. + + $ passage show testing/somesite + somepassword + someuser + https://some.site + +And to double check with the backup identity: + + $ cat /mnt/external_card/backup_key.txt > identities + $ passage show testing/somesite + somepassword + someuser + https://some.site diff --git a/pelicanconf.py b/pelicanconf.py new file mode 100644 index 0000000..e07cabb --- /dev/null +++ b/pelicanconf.py @@ -0,0 +1,33 @@ +AUTHOR = 'cinnaboot' +SITENAME = 'blah' +SITEURL = 'https://bxxa.cc/homepage/output' + +PATH = 'content' + +TIMEZONE = 'US/Eastern' + +DEFAULT_LANG = 'en' + +THEME = 'themes/notmyidea-custom' + +# 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 = 10 + +# Uncomment following line if you want document-relative URLs when developing +RELATIVE_URLS = True diff --git a/publishconf.py b/publishconf.py new file mode 100644 index 0000000..01c0826 --- /dev/null +++ b/publishconf.py @@ -0,0 +1,21 @@ +# 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 = 'https://bxxa.cc/homepage' +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/tasks.py b/tasks.py new file mode 100644 index 0000000..c7c6c46 --- /dev/null +++ b/tasks.py @@ -0,0 +1,138 @@ +# -*- 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'], + # 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 diff --git a/themes/notmyidea-custom/static/css/fonts.css b/themes/notmyidea-custom/static/css/fonts.css new file mode 100644 index 0000000..5601507 --- /dev/null +++ b/themes/notmyidea-custom/static/css/fonts.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: + local('Yanone Kaffeesatz Regular'), + local('YanoneKaffeesatz-Regular'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ + url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ + url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); +} diff --git a/themes/notmyidea-custom/static/css/main.css b/themes/notmyidea-custom/static/css/main.css new file mode 100644 index 0000000..9d69a4a --- /dev/null +++ b/themes/notmyidea-custom/static/css/main.css @@ -0,0 +1,472 @@ +/* + Name: Smashing HTML5 + Date: July 2009 + Description: Sample layout for HTML5 and CSS3 goodness. + Version: 1.0 + License: MIT + Licensed by: Smashing Media GmbH + Original author: Enrique Ramírez +*/ + +/* Imports */ +@import url("reset.css"); +@import url("pygment.css"); +@import url("typogrify.css"); +@import url("fonts.css"); + +/***** Global *****/ +/* Body */ +body { + background: #F5F4EF; + color: #000305; + font-size: 87.5%; /* Base font size: 14px */ + font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + line-height: 1.429; + margin: 0; + padding: 0; + text-align: left; +} + +/* Headings */ +h1 {font-size: 2em } +h2 {font-size: 1.571em} /* 22px */ +h3 {font-size: 1.429em} /* 20px */ +h4 {font-size: 1.286em} /* 18px */ +h5 {font-size: 1.143em} /* 16px */ +h6 {font-size: 1em} /* 14px */ + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; + margin-bottom: .8em; + font-family: 'Yanone Kaffeesatz', arial, serif; +} + +h3, h4, h5, h6 { margin-top: .8em; } + +hr { border: 2px solid #EEEEEE; } + +/* Anchors */ +a {outline: 0;} +a img {border: 0px; text-decoration: none;} +a:link, a:visited { + color: #d5620a; + padding: 0 1px; + text-decoration: underline; +} +a:hover, a:active { + background-color: #d5620a; + color: #fff; + text-decoration: none; + text-shadow: 1px 1px 1px #333; +} + +h1 a:hover { + background-color: inherit +} + +/* Paragraphs */ +div.line-block, +p { margin-top: 1em; + margin-bottom: 1em;} + +strong, b {font-weight: bold;} +em, i {font-style: italic;} + +/* Lists */ +ul { + list-style: outside disc; + margin: 0em 0 0 1.5em; +} + +ol { + list-style: outside decimal; + margin: 0em 0 0 1.5em; +} + +li { margin-top: 0.5em; + margin-bottom: 1em; } + +.post-info { + float:right; + margin:10px; + padding:5px; +} + +.post-info p{ + margin-top: 1px; + margin-bottom: 1px; +} + +.readmore { float: right } + +dl {margin: 0 0 1.5em 0;} +dt {font-weight: bold;} +dd {margin-left: 1.5em;} + +pre{background-color: rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;} + +/* Quotes */ +blockquote { + margin: 20px; + font-style: italic; +} +cite {} + +q {} + +div.note { + float: right; + margin: 5px; + font-size: 85%; + max-width: 300px; +} + +/* Tables */ +table {margin: .5em auto 1.5em auto; width: 98%;} + + /* Thead */ + thead th {padding: .5em .4em; text-align: left;} + thead td {} + + /* Tbody */ + tbody td {padding: .5em .4em;} + tbody th {} + + tbody .alt td {} + tbody .alt th {} + + /* Tfoot */ + tfoot th {} + tfoot td {} + +/* HTML5 tags */ +header, section, footer, +aside, nav, article, figure { + display: block; +} + +/***** Layout *****/ +.body {clear: both; margin: 0 auto; max-width: 800px;} +img { max-width: 100%; } +img.right, figure.right, div.figure.align-right { + float: right; + margin: 0 0 2em 2em; +} +img.left, figure.left, div.figure.align-left { + float: left; + margin: 0 2em 2em 0; +} + +/* .rst support */ +div.figure img, figure img { /* to fill figure exactly */ + max-width: 100%; +} +div.figure p.caption, figure p.caption { /* margin provided by figure */ + margin-top: 0; + margin-bottom: 0; +} + +/* + Header +*****************/ +#banner { + margin: 0 auto; + padding: 0.8em 0 0 0; +} + + /* Banner */ + #banner h1 { + font-size: 3.571em; + line-height: 1.0; + margin-bottom: .3em; + } + + #banner h1 a:link, #banner h1 a:visited { + color: #000305; + display: block; + font-weight: bold; + margin: 0 0 0 .2em; + text-decoration: none; + } + #banner h1 a:hover, #banner h1 a:active { + background: none; + color: #d5620a; + text-shadow: none; + } + + #banner h1 strong {font-size: 0.36em; font-weight: normal;} + + /* Main Nav */ + #banner nav { + background: #000305; + font-size: 1.143em; + overflow: auto; + line-height: 30px; + margin: 0 auto 2em auto; + padding: 0; + text-align: center; + max-width: 800px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #banner nav ul {list-style: none; margin: 0 auto; max-width: 800px;} + #banner nav li {float: left; display: inline; margin: 0;} + + #banner nav a:link, #banner nav a:visited { + color: #fff; + display: inline-block; + height: 30px; + padding: 5px 1.5em; + text-decoration: none; + } + #banner nav a:hover, #banner nav a:active, + #banner nav .active a:link, #banner nav .active a:visited { + background: #d5620a; + color: #fff; + text-shadow: none !important; + } + + #banner nav li:first-child a { + border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + -webkit-border-top-left-radius: 5px; + + border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -webkit-border-bottom-left-radius: 5px; + } + +/* + Featured +*****************/ +#featured { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + max-width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#featured figure { + border: 2px solid #eee; + float: right; + margin: 0.786em 2em 0 5em; + max-width: 248px; +} +#featured figure img {display: block; float: right;} + +#featured h2 {color: #d5620a; font-size: 1.714em; margin-bottom: 0.333em;} +#featured h3 {font-size: 1.429em; margin-bottom: .5em;} + +#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;} +#featured h3 a:hover, #featured h3 a:active {color: #fff;} + +/* + Body +*****************/ +#content { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px 20px; + max-width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +/* + Extras +*****************/ +#extras {margin: 0 auto 3em auto; overflow: hidden;} + +#extras ul {list-style: none; margin: 0;} +#extras li {border-bottom: 1px solid #fff;} +#extras h2 { + color: #d5620a; + font-size: 1.429em; + margin-bottom: .25em; + padding: 0 3px; +} + +#extras a:link, #extras a:visited { + color: #444; + display: block; + border-bottom: 1px solid #F4E3E3; + text-decoration: none; + padding: .3em .25em; +} + +#extras a:hover, #extras a:active {color: #fff;} + + /* Blogroll */ + #extras .blogroll { + float: left; + max-width: 615px; + } + + #extras .blogroll li {float: left; margin: 0 20px 0 0; max-width: 185px;} + + /* Social */ + #extras .social { + float: right; + max-width: 175px; + } + + #extras div[class='social'] a { + background-repeat: no-repeat; + background-position: 3px 6px; + padding-left: 25px; + } + + /* Icons */ + .social a[href*='about.me'] {background-image: url('../images/icons/aboutme.png');} + .social a[href*='bitbucket.org'] {background-image: url('../images/icons/bitbucket.png');} + .social a[href*='delicious.com'] {background-image: url('../images/icons/delicious.png');} + .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} + .social a[href*='gitorious.org'] {background-image: url('../images/icons/gitorious.png');} + .social a[href*='github.com'], + .social a[href*='git.io'] { + background-image: url('../images/icons/github.png'); + background-size: 16px 16px; + } + .social a[href*='gittip.com'] {background-image: url('../images/icons/gittip.png');} + .social a[href*='plus.google.com'] {background-image: url('../images/icons/google-plus.png');} + .social a[href*='groups.google.com'] {background-image: url('../images/icons/google-groups.png');} + .social a[href*='news.ycombinator.com'], + .social a[href*='hackernewsers.com'] {background-image: url('../images/icons/hackernews.png');} + .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} + .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} + .social a[href*='reddit.com'] {background-image: url('../images/icons/reddit.png');} + .social a[type$='atom+xml'], .social a[type$='rss+xml'] {background-image: url('../images/icons/rss.png');} + .social a[href*='slideshare.net'] {background-image: url('../images/icons/slideshare.png');} + .social a[href*='speakerdeck.com'] {background-image: url('../images/icons/speakerdeck.png');} + .social a[href*='stackoverflow.com'] {background-image: url('../images/icons/stackoverflow.png');} + .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} + .social a[href*='vimeo.com'] {background-image: url('../images/icons/vimeo.png');} + .social a[href*='youtube.com'] {background-image: url('../images/icons/youtube.png');} + +/* + About +*****************/ +#about { + background: #fff; + font-style: normal; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + text-align: left; + max-width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#about .primary {float: left; max-width: 165px;} +#about .primary strong {color: #C64350; display: block; font-size: 1.286em;} +#about .photo {float: left; margin: 5px 20px;} + +#about .url:link, #about .url:visited {text-decoration: none;} + +#about .bio {float: right; max-width: 500px;} + +/* + Footer +*****************/ +#contentinfo {padding-bottom: 2em; text-align: right;} + +/***** Sections *****/ +/* Blog */ +.hentry { + display: block; + clear: both; + border-top: 1px solid #eee; + padding: 1.5em 0; +} +li:first-child .hentry, #content > .hentry {border: 0; margin: 0;} +#content > .hentry {padding: 1em 0;} +.hentry img{display : none ;} +.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;} +.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;} +.entry-title a:visited {background-color: #fff;} + +.hentry .post-info * {font-style: normal;} + + /* Content */ + .hentry footer {margin-bottom: 2em;} + .hentry footer address {display: inline;} + #posts-list footer address {display: block;} + + /* Blog Index */ + #posts-list {list-style: none; margin: 0;} + #posts-list .hentry {padding-left: 10px; position: relative;} + + #posts-list footer { + left: 10px; + position: relative; + float: left; + top: 0.5em; + max-width: 190px; + } + + /* About the Author */ + #about-author { + background: #f9f9f9; + clear: both; + font-style: normal; + margin: 2em 0; + padding: 10px 20px 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #about-author strong { + color: #C64350; + clear: both; + display: block; + font-size: 1.429em; + } + + #about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;} + + /* Comments */ + #comments-list {list-style: none; margin: 0 1em;} + #comments-list blockquote { + background: #f8f8f8; + clear: both; + font-style: normal; + margin: 0; + padding: 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + #comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;} + + #comments-list li:nth-child(2n) blockquote {background: #F5f5f5;} + + /* Add a Comment */ + #add-comment label {clear: left; float: left; text-align: left; max-width: 150px;} + #add-comment input[type='text'], + #add-comment input[type='email'], + #add-comment input[type='url'] {float: left; max-width: 200px;} + + #add-comment textarea {float: left; height: 150px; max-width: 495px;} + + #add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;} + + #add-comment input[type='submit'] {float: right; margin: 0 .5em;} + #add-comment * {margin-bottom: .5em;} diff --git a/themes/notmyidea-custom/static/css/pygment.css b/themes/notmyidea-custom/static/css/pygment.css new file mode 100644 index 0000000..fdd056f --- /dev/null +++ b/themes/notmyidea-custom/static/css/pygment.css @@ -0,0 +1,205 @@ +.hll { +background-color:#eee; +} +.c { +color:#408090; +font-style:italic; +} +.err { +border:1px solid #FF0000; +} +.k { +color:#007020; +font-weight:bold; +} +.o { +color:#666666; +} +.cm { +color:#408090; +font-style:italic; +} +.cp { +color:#007020; +} +.c1 { +color:#408090; +font-style:italic; +} +.cs { +background-color:#FFF0F0; +color:#408090; +} +.gd { +color:#A00000; +} +.ge { +font-style:italic; +} +.gr { +color:#FF0000; +} +.gh { +color:#000080; +font-weight:bold; +} +.gi { +color:#00A000; +} +.go { +color:#303030; +} +.gp { +color:#C65D09; +font-weight:bold; +} +.gs { +font-weight:bold; +} +.gu { +color:#800080; +font-weight:bold; +} +.gt { +color:#0040D0; +} +.kc { +color:#007020; +font-weight:bold; +} +.kd { +color:#007020; +font-weight:bold; +} +.kn { +color:#007020; +font-weight:bold; +} +.kp { +color:#007020; +} +.kr { +color:#007020; +font-weight:bold; +} +.kt { +color:#902000; +} +.m { +color:#208050; +} +.s { +color:#4070A0; +} +.na { +color:#4070A0; +} +.nb { +color:#007020; +} +.nc { +color:#0E84B5; +font-weight:bold; +} +.no { +color:#60ADD5; +} +.nd { +color:#555555; +font-weight:bold; +} +.ni { +color:#D55537; +font-weight:bold; +} +.ne { +color:#007020; +} +.nf { +color:#06287E; +} +.nl { +color:#002070; +font-weight:bold; +} +.nn { +color:#0E84B5; +font-weight:bold; +} +.nt { +color:#062873; +font-weight:bold; +} +.nv { +color:#BB60D5; +} +.ow { +color:#007020; +font-weight:bold; +} +.w { +color:#BBBBBB; +} +.mf { +color:#208050; +} +.mh { +color:#208050; +} +.mi { +color:#208050; +} +.mo { +color:#208050; +} +.sb { +color:#4070A0; +} +.sc { +color:#4070A0; +} +.sd { +color:#4070A0; +font-style:italic; +} +.s2 { +color:#4070A0; +} +.se { +color:#4070A0; +font-weight:bold; +} +.sh { +color:#4070A0; +} +.si { +color:#70A0D0; +font-style:italic; +} +.sx { +color:#C65D09; +} +.sr { +color:#235388; +} +.s1 { +color:#4070A0; +} +.ss { +color:#517918; +} +.bp { +color:#007020; +} +.vc { +color:#BB60D5; +} +.vg { +color:#BB60D5; +} +.vi { +color:#BB60D5; +} +.il { +color:#208050; +} diff --git a/themes/notmyidea-custom/static/css/reset.css b/themes/notmyidea-custom/static/css/reset.css new file mode 100644 index 0000000..c88e619 --- /dev/null +++ b/themes/notmyidea-custom/static/css/reset.css @@ -0,0 +1,52 @@ +/* + Name: Reset Stylesheet + Description: Resets browser's default CSS + Author: Eric Meyer + Author URI: https://meyerweb.com/eric/tools/css/reset/ +*/ + +/* v1.0 | 20080212 */ +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, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + font-size: 100%; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +body {line-height: 1;} + +ol, ul {list-style: none;} + +blockquote, q {quotes: none;} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins {text-decoration: none;} +del {text-decoration: line-through;} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/themes/notmyidea-custom/static/css/typogrify.css b/themes/notmyidea-custom/static/css/typogrify.css new file mode 100644 index 0000000..3bae497 --- /dev/null +++ b/themes/notmyidea-custom/static/css/typogrify.css @@ -0,0 +1,3 @@ +.caps {font-size:.92em;} +.amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} +.dquo {margin-left:-.38em;} diff --git a/themes/notmyidea-custom/static/css/wide.css b/themes/notmyidea-custom/static/css/wide.css new file mode 100644 index 0000000..88fd59c --- /dev/null +++ b/themes/notmyidea-custom/static/css/wide.css @@ -0,0 +1,48 @@ +@import url("main.css"); + +body { + font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; +} + +.post-info{ + display: none; +} + +#banner nav { + display: none; + -moz-border-radius: 0px; + margin-bottom: 20px; + overflow: hidden; + font-size: 1em; + background: #F5F4EF; +} + +#banner nav ul{ + padding-right: 50px; +} + +#banner nav li{ + float: right; + color: #000; +} + +#banner nav li a { + color: #000; +} + +#banner h1 { + margin-bottom: -18px; +} + +#featured, #extras { + padding: 50px; +} + +#featured { + padding-top: 20px; +} + +#extras { + padding-top: 0px; + padding-bottom: 0px; +} diff --git a/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.eot b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.eot new file mode 100644 index 0000000..b3b90db Binary files /dev/null and b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.eot differ diff --git a/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.svg b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.svg new file mode 100644 index 0000000..a69669b --- /dev/null +++ b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.svg @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.ttf b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.ttf new file mode 100644 index 0000000..6f4feb0 Binary files /dev/null and b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.ttf differ diff --git a/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff new file mode 100644 index 0000000..ddccf76 Binary files /dev/null and b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff differ diff --git a/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff2 b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff2 new file mode 100644 index 0000000..7b18f7e Binary files /dev/null and b/themes/notmyidea-custom/static/fonts/Yanone_Kaffeesatz_400.woff2 differ diff --git a/themes/notmyidea-custom/static/fonts/font.css b/themes/notmyidea-custom/static/fonts/font.css new file mode 100644 index 0000000..a9eb87e --- /dev/null +++ b/themes/notmyidea-custom/static/fonts/font.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: + local('Yanone Kaffeesatz Regular'), + local('YanoneKaffeesatz-Regular'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ + url('Yanone_Kaffeesatz_400.woff') format('woff'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ + url('Yanone_Kaffeesatz_400.woff2') format('woff2'); +} diff --git a/themes/notmyidea-custom/static/images/icons/aboutme.png b/themes/notmyidea-custom/static/images/icons/aboutme.png new file mode 100644 index 0000000..600110f Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/aboutme.png differ diff --git a/themes/notmyidea-custom/static/images/icons/bitbucket.png b/themes/notmyidea-custom/static/images/icons/bitbucket.png new file mode 100644 index 0000000..277a7df Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/bitbucket.png differ diff --git a/themes/notmyidea-custom/static/images/icons/delicious.png b/themes/notmyidea-custom/static/images/icons/delicious.png new file mode 100644 index 0000000..34868c5 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/delicious.png differ diff --git a/themes/notmyidea-custom/static/images/icons/facebook.png b/themes/notmyidea-custom/static/images/icons/facebook.png new file mode 100644 index 0000000..1d8a432 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/facebook.png differ diff --git a/themes/notmyidea-custom/static/images/icons/github.png b/themes/notmyidea-custom/static/images/icons/github.png new file mode 100644 index 0000000..5d9109d Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/github.png differ diff --git a/themes/notmyidea-custom/static/images/icons/gitorious.png b/themes/notmyidea-custom/static/images/icons/gitorious.png new file mode 100644 index 0000000..a6705d0 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/gitorious.png differ diff --git a/themes/notmyidea-custom/static/images/icons/gittip.png b/themes/notmyidea-custom/static/images/icons/gittip.png new file mode 100644 index 0000000..b9f67aa Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/gittip.png differ diff --git a/themes/notmyidea-custom/static/images/icons/google-groups.png b/themes/notmyidea-custom/static/images/icons/google-groups.png new file mode 100644 index 0000000..bbd0a0f Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/google-groups.png differ diff --git a/themes/notmyidea-custom/static/images/icons/google-plus.png b/themes/notmyidea-custom/static/images/icons/google-plus.png new file mode 100644 index 0000000..f8553d4 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/google-plus.png differ diff --git a/themes/notmyidea-custom/static/images/icons/hackernews.png b/themes/notmyidea-custom/static/images/icons/hackernews.png new file mode 100644 index 0000000..8e05e3e Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/hackernews.png differ diff --git a/themes/notmyidea-custom/static/images/icons/lastfm.png b/themes/notmyidea-custom/static/images/icons/lastfm.png new file mode 100644 index 0000000..2eedd2d Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/lastfm.png differ diff --git a/themes/notmyidea-custom/static/images/icons/linkedin.png b/themes/notmyidea-custom/static/images/icons/linkedin.png new file mode 100644 index 0000000..06a8801 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/linkedin.png differ diff --git a/themes/notmyidea-custom/static/images/icons/reddit.png b/themes/notmyidea-custom/static/images/icons/reddit.png new file mode 100644 index 0000000..d826d3e Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/reddit.png differ diff --git a/themes/notmyidea-custom/static/images/icons/rss.png b/themes/notmyidea-custom/static/images/icons/rss.png new file mode 100644 index 0000000..12448f5 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/rss.png differ diff --git a/themes/notmyidea-custom/static/images/icons/slideshare.png b/themes/notmyidea-custom/static/images/icons/slideshare.png new file mode 100644 index 0000000..9cbe858 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/slideshare.png differ diff --git a/themes/notmyidea-custom/static/images/icons/speakerdeck.png b/themes/notmyidea-custom/static/images/icons/speakerdeck.png new file mode 100644 index 0000000..7281ec4 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/speakerdeck.png differ diff --git a/themes/notmyidea-custom/static/images/icons/stackoverflow.png b/themes/notmyidea-custom/static/images/icons/stackoverflow.png new file mode 100644 index 0000000..3c6862e Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/stackoverflow.png differ diff --git a/themes/notmyidea-custom/static/images/icons/twitter.png b/themes/notmyidea-custom/static/images/icons/twitter.png new file mode 100644 index 0000000..cef1cef Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/twitter.png differ diff --git a/themes/notmyidea-custom/static/images/icons/vimeo.png b/themes/notmyidea-custom/static/images/icons/vimeo.png new file mode 100644 index 0000000..4b9d721 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/vimeo.png differ diff --git a/themes/notmyidea-custom/static/images/icons/youtube.png b/themes/notmyidea-custom/static/images/icons/youtube.png new file mode 100644 index 0000000..e334e68 Binary files /dev/null and b/themes/notmyidea-custom/static/images/icons/youtube.png differ diff --git a/themes/notmyidea-custom/templates/archives.html b/themes/notmyidea-custom/templates/archives.html new file mode 100644 index 0000000..f678494 --- /dev/null +++ b/themes/notmyidea-custom/templates/archives.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +
+

Archives for {{ SITENAME }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+
+{% endblock %} diff --git a/themes/notmyidea-custom/templates/article.html b/themes/notmyidea-custom/templates/article.html new file mode 100644 index 0000000..6abcb09 --- /dev/null +++ b/themes/notmyidea-custom/templates/article.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} +{% block html_lang %}{{ article.lang }}{% endblock %} +{% block head -%} + {{ super() -}} + {% if article.summary %} + + {% endif %} +{% endblock %} + +{% block title %}{{ article.title|striptags }}{% endblock %} + +{% block extra_head %} +{% import 'translations.html' as translations with context %} +{% if translations.entry_hreflang(article) %} + {{ translations.entry_hreflang(article) }} +{% endif %} +{% endblock %} + +{% block content %} +
+
+
+

+ {{ article.title }}

+ {% include 'twitter.html' %} +
+ +
+ {% include 'article_infos.html' %} + {{ article.content }} +
+ {% if DISQUS_SITENAME and SITEURL and article.status != "draft" %} +
+

Comments !

+
+ + +
+ {% endif %} + +
+
+{% endblock %} diff --git a/themes/notmyidea-custom/templates/article_infos.html b/themes/notmyidea-custom/templates/article_infos.html new file mode 100644 index 0000000..172ad85 --- /dev/null +++ b/themes/notmyidea-custom/templates/article_infos.html @@ -0,0 +1,23 @@ +
+ + Published: {{ article.locale_date }} + + {% if article.modified %} +
+ + Updated: {{ article.locale_modified }} + + {% endif %} + + {% if article.authors %} +
+ By {% for author in article.authors %} + {{ author }} + {% endfor %} +
+ {% endif %} +

In {{ article.category }}.

+{% include 'taglist.html' %} +{% import 'translations.html' as translations with context %} +{{ translations.translations_for(article) }} +
diff --git a/themes/notmyidea-custom/templates/author.html b/themes/notmyidea-custom/templates/author.html new file mode 100644 index 0000000..0b37290 --- /dev/null +++ b/themes/notmyidea-custom/templates/author.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ author }}{% endblock %} diff --git a/themes/notmyidea-custom/templates/authors.html b/themes/notmyidea-custom/templates/authors.html new file mode 100644 index 0000000..e61a332 --- /dev/null +++ b/themes/notmyidea-custom/templates/authors.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Authors{% endblock %} + +{% block content %} + +
+

Authors on {{ SITENAME }}

+
    + {% for author, articles in authors|sort %} +
  • {{ author }} ({{ articles|count }})
  • + {% endfor %} +
+
+ +{% endblock %} diff --git a/themes/notmyidea-custom/templates/base.html b/themes/notmyidea-custom/templates/base.html new file mode 100644 index 0000000..0f05a61 --- /dev/null +++ b/themes/notmyidea-custom/templates/base.html @@ -0,0 +1,85 @@ + + + + {% block head %} + + + + {% block title %}{{ SITENAME }}{%endblock%} + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% block extra_head %}{% endblock extra_head %} + {% endblock head %} + + + +{% include 'github.html' %} +
+ +
+ + {% block content %} + {% endblock %} +
+ {% if LINKS %} +
+

{{ LINKS_WIDGET_NAME | default('links') }}

+
    + {% for name, link in LINKS %} +
  • {{ name }}
  • + {% endfor %} +
+
+ {% endif %} + {% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %} + + {% endif %} +
+ + + + diff --git a/themes/notmyidea-custom/templates/categories.html b/themes/notmyidea-custom/templates/categories.html new file mode 100644 index 0000000..07f6290 --- /dev/null +++ b/themes/notmyidea-custom/templates/categories.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Categories{% endblock %} + +{% block content %} + +
+

Categories for {{ SITENAME }}

+
    + {% for category, articles in categories|sort %} +
  • {{ category }} ({{ articles|count }})
  • + {% endfor %} +
+
+ +{% endblock %} diff --git a/themes/notmyidea-custom/templates/category.html b/themes/notmyidea-custom/templates/category.html new file mode 100644 index 0000000..56f8e93 --- /dev/null +++ b/themes/notmyidea-custom/templates/category.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ category }}{% endblock %} diff --git a/themes/notmyidea-custom/templates/comments.html b/themes/notmyidea-custom/templates/comments.html new file mode 100644 index 0000000..bb033c0 --- /dev/null +++ b/themes/notmyidea-custom/templates/comments.html @@ -0,0 +1 @@ +{% if DISQUS_SITENAME %}

There are comments.

{% endif %} diff --git a/themes/notmyidea-custom/templates/github.html b/themes/notmyidea-custom/templates/github.html new file mode 100644 index 0000000..ccc401f --- /dev/null +++ b/themes/notmyidea-custom/templates/github.html @@ -0,0 +1,9 @@ +{% if GITHUB_URL %} + +{% if GITHUB_POSITION != "left" %} +Fork me on GitHub +{% else %} +Fork me on GitHub +{% endif %} + +{% endif %} diff --git a/themes/notmyidea-custom/templates/index.html b/themes/notmyidea-custom/templates/index.html new file mode 100644 index 0000000..14e9c14 --- /dev/null +++ b/themes/notmyidea-custom/templates/index.html @@ -0,0 +1,65 @@ +{% extends "base.html" %} +{% block content_title %}{% endblock %} +{% block content %} +{% if articles %} + {% for article in articles_page.object_list %} + + {# First item #} + {% if loop.first and not articles_page.has_previous() %} + + {% if loop.length > 1 %} +
+

Other articles

+
+
    + {% endif %} + {# other items #} + {% else %} + {% if loop.first %} +
    +
      + {% endif %} +
    1. +
      +

      {{ article.title }}

      +
      + +
      + {% include 'article_infos.html' %} + {{ article.summary }} + read more + {% include 'comments.html' %} +
      +
    2. + {% endif %} + {% if loop.last %} + {% if loop.length > 1 or articles_page.has_other_pages() %} +
    + {% if articles_page.has_other_pages() %} + {% include 'pagination.html' %} + {% endif %} +
    + {% endif %} + {% endif %} + {% endfor %} +{% else %} +
    + {% if pages %} +

    Pages

    + + {% else %} +

    This site currently has no content.

    + {% endif %} +
    +{% endif %} +{% endblock content %} diff --git a/themes/notmyidea-custom/templates/page.html b/themes/notmyidea-custom/templates/page.html new file mode 100644 index 0000000..428c47f --- /dev/null +++ b/themes/notmyidea-custom/templates/page.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block html_lang %}{{ page.lang }}{% endblock %} +{% block title %}{{ page.title|striptags }}{% endblock %} + +{% block extra_head %} +{% import 'translations.html' as translations with context %} +{% if translations.entry_hreflang(page) %} + {{ translations.entry_hreflang(page) }} +{% endif %} +{% endblock %} + +{% block content %} +
    +

    {{ page.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + {{ page.content }} +
    +{% endblock %} diff --git a/themes/notmyidea-custom/templates/period_archives.html b/themes/notmyidea-custom/templates/period_archives.html new file mode 100644 index 0000000..252e002 --- /dev/null +++ b/themes/notmyidea-custom/templates/period_archives.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +
    +

    Archives for {{ period | reverse | join(' ') }}

    + +
    +{% for article in dates %} +
    {{ article.locale_date }}
    +
    {{ article.title }}
    +{% endfor %} +
    +
    +{% endblock %} diff --git a/themes/notmyidea-custom/templates/tag.html b/themes/notmyidea-custom/templates/tag.html new file mode 100644 index 0000000..68cdcba --- /dev/null +++ b/themes/notmyidea-custom/templates/tag.html @@ -0,0 +1,2 @@ +{% extends "index.html" %} +{% block title %}{{ SITENAME }} - {{ tag }}{% endblock %} diff --git a/themes/notmyidea-custom/templates/taglist.html b/themes/notmyidea-custom/templates/taglist.html new file mode 100644 index 0000000..58f3557 --- /dev/null +++ b/themes/notmyidea-custom/templates/taglist.html @@ -0,0 +1 @@ +{% if article.tags %}

    tags: {% for tag in article.tags %}{{ tag | escape }} {% endfor %}

    {% endif %} diff --git a/themes/notmyidea-custom/templates/tags.html b/themes/notmyidea-custom/templates/tags.html new file mode 100644 index 0000000..fb09955 --- /dev/null +++ b/themes/notmyidea-custom/templates/tags.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Tags{% endblock %} + +{% block content %} + +
    +

    Tags for {{ SITENAME }}

    +
      + {% for tag, articles in tags|sort %} +
    • {{ tag }} ({{ articles|count }})
    • + {% endfor %} +
    +
    + +{% endblock %} diff --git a/themes/notmyidea-custom/templates/translations.html b/themes/notmyidea-custom/templates/translations.html new file mode 100644 index 0000000..1eec7c4 --- /dev/null +++ b/themes/notmyidea-custom/templates/translations.html @@ -0,0 +1,16 @@ +{% macro translations_for(article) %} +{% if article.translations %} +Translations: + {% for translation in article.translations %} + {{ translation.lang }} + {% endfor %} +{% endif %} +{% endmacro %} + +{% macro entry_hreflang(entry) %} +{% if entry.translations %} + {% for translation in entry.translations %} + + {% endfor %} +{% endif %} +{% endmacro %} diff --git a/themes/notmyidea-custom/templates/twitter.html b/themes/notmyidea-custom/templates/twitter.html new file mode 100644 index 0000000..bf78c32 --- /dev/null +++ b/themes/notmyidea-custom/templates/twitter.html @@ -0,0 +1,3 @@ +{% if TWITTER_USERNAME %} + +{% endif %} diff --git a/themes/simple/templates/archives.html b/themes/simple/templates/archives.html new file mode 100644 index 0000000..cd12950 --- /dev/null +++ b/themes/simple/templates/archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Archives{% endblock %} + +{% block content %} +

    Archives for {{ SITENAME }}

    + +
    +{% for article in dates %} +
    {{ article.locale_date }}
    +
    {{ article.title }}
    +{% endfor %} +
    +{% endblock %} diff --git a/themes/simple/templates/article.html b/themes/simple/templates/article.html new file mode 100644 index 0000000..c8c9a4f --- /dev/null +++ b/themes/simple/templates/article.html @@ -0,0 +1,67 @@ +{% extends "base.html" %} +{% block html_lang %}{{ article.lang }}{% endblock %} + +{% block title %}{{ SITENAME }} - {{ article.title|striptags }}{% endblock %} + +{% block head %} + {{ super() }} + + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(article) %} + {{ translations.entry_hreflang(article) }} + {% endif %} + + {% if article.description %} + + {% endif %} + + {% for tag in article.tags %} + + {% endfor %} + +{% endblock %} + +{% block content %} +
    +
    +

    + {{ article.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(article) }} +
    +
    + + {% if article.modified %} + + {% endif %} + {% if article.authors %} +
    + By {% for author in article.authors %} + {{ author }} + {% endfor %} +
    + {% endif %} + {% if article.category %} +
    + Category: {{ article.category }} +
    + {% endif %} + {% if article.tags %} +
    + Tags: + {% for tag in article.tags %} + {{ tag }} + {% endfor %} +
    + {% endif %} +
    +
    + {{ article.content }} +
    +
    +{% endblock %} diff --git a/themes/simple/templates/author.html b/themes/simple/templates/author.html new file mode 100644 index 0000000..a190194 --- /dev/null +++ b/themes/simple/templates/author.html @@ -0,0 +1,8 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - Articles by {{ author }}{% endblock %} + +{% block content_title %} +

    Articles by {{ author }}

    +{% endblock %} + diff --git a/themes/simple/templates/authors.html b/themes/simple/templates/authors.html new file mode 100644 index 0000000..9aee5db --- /dev/null +++ b/themes/simple/templates/authors.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Authors{% endblock %} + +{% block content %} +

    Authors on {{ SITENAME }}

    +
      + {% for author, articles in authors|sort %} +
    • {{ author }} ({{ articles|count }})
    • + {% endfor %} +
    +{% endblock %} diff --git a/themes/simple/templates/base.html b/themes/simple/templates/base.html new file mode 100644 index 0000000..2c17dbf --- /dev/null +++ b/themes/simple/templates/base.html @@ -0,0 +1,63 @@ + + + + {% block head %} + {% block title %}{{ SITENAME }}{% endblock title %} + + + {% 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 %} + + + + + + {% block content %} + {% endblock %} +
    +
    + Proudly powered by Pelican, + which takes great advantage of Python. +
    +
    + + diff --git a/themes/simple/templates/categories.html b/themes/simple/templates/categories.html new file mode 100644 index 0000000..7999de4 --- /dev/null +++ b/themes/simple/templates/categories.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Categories{% endblock %} + +{% block content %} +

    Categories on {{ SITENAME }}

    +
      + {% for category, articles in categories|sort %} +
    • {{ category }} ({{ articles|count }})
    • + {% endfor %} +
    +{% endblock %} diff --git a/themes/simple/templates/category.html b/themes/simple/templates/category.html new file mode 100644 index 0000000..14d7ff0 --- /dev/null +++ b/themes/simple/templates/category.html @@ -0,0 +1,8 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - {{ category }} category{% endblock %} + +{% block content_title %} +

    Articles in the {{ category }} category

    +{% endblock %} + diff --git a/themes/simple/templates/gosquared.html b/themes/simple/templates/gosquared.html new file mode 100644 index 0000000..49ccbbe --- /dev/null +++ b/themes/simple/templates/gosquared.html @@ -0,0 +1,14 @@ +{% if GOSQUARED_SITENAME %} + +{% endif %} diff --git a/themes/simple/templates/index.html b/themes/simple/templates/index.html new file mode 100644 index 0000000..ab4bc34 --- /dev/null +++ b/themes/simple/templates/index.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% block content %} +
    +{% block content_title %} +

    All articles

    +{% endblock %} + +
      +{% for article in articles_page.object_list %} +
    1. +

      {{ article.title }}

      +
      + +
      By + {% for author in article.authors %} + {{ author }} + {% endfor %} +
      +
      +
      {{ article.summary }}
      +
    2. +{% endfor %} +
    +{% if articles_page.has_other_pages() %} + {% include 'pagination.html' %} +{% endif %} +
    +{% endblock content %} diff --git a/themes/simple/templates/page.html b/themes/simple/templates/page.html new file mode 100644 index 0000000..33344ea --- /dev/null +++ b/themes/simple/templates/page.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} +{% block html_lang %}{{ page.lang }}{% endblock %} + +{% block title %}{{ SITENAME }} - {{ page.title|striptags }}{%endblock%} + +{% block head %} + {{ super() }} + + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(page) %} + {{ translations.entry_hreflang(page) }} + {% endif %} +{% endblock %} + +{% block content %} +

    {{ page.title }}

    + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + + {{ page.content }} + + {% if page.modified %} +

    + Last updated: {{ page.locale_modified }} +

    + {% endif %} +{% endblock %} diff --git a/themes/simple/templates/pagination.html b/themes/simple/templates/pagination.html new file mode 100644 index 0000000..588f130 --- /dev/null +++ b/themes/simple/templates/pagination.html @@ -0,0 +1,15 @@ +{% if DEFAULT_PAGINATION %} +{% set first_page = articles_paginator.page(1) %} +{% set last_page = articles_paginator.page(articles_paginator.num_pages) %} +

    + {% if articles_page.has_previous() %} + + « + {% endif %} + Page {{ articles_page.number }} / {{ articles_paginator.num_pages }} + {% if articles_page.has_next() %} + » + + {% endif %} +

    +{% endif %} diff --git a/themes/simple/templates/period_archives.html b/themes/simple/templates/period_archives.html new file mode 100644 index 0000000..e1ddf62 --- /dev/null +++ b/themes/simple/templates/period_archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - {{ period | reverse | join(' ') }} archives{% endblock %} + +{% block content %} +

    Archives for {{ period | reverse | join(' ') }}

    + +
    +{% for article in dates %} +
    {{ article.locale_date }}
    +
    {{ article.title }}
    +{% endfor %} +
    +{% endblock %} diff --git a/themes/simple/templates/tag.html b/themes/simple/templates/tag.html new file mode 100644 index 0000000..9c95803 --- /dev/null +++ b/themes/simple/templates/tag.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - {{ tag }} tag{% endblock %} + +{% block content_title %} +

    Articles tagged with {{ tag }}

    +{% endblock %} diff --git a/themes/simple/templates/tags.html b/themes/simple/templates/tags.html new file mode 100644 index 0000000..b90b0ac --- /dev/null +++ b/themes/simple/templates/tags.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Tags{% endblock %} + +{% block content %} +

    Tags for {{ SITENAME }}

    +
      + {% for tag, articles in tags|sort %} +
    • {{ tag }} ({{ articles|count }})
    • + {% endfor %} +
    +{% endblock %} diff --git a/themes/simple/templates/translations.html b/themes/simple/templates/translations.html new file mode 100644 index 0000000..f0e2478 --- /dev/null +++ b/themes/simple/templates/translations.html @@ -0,0 +1,16 @@ +{% macro translations_for(article) %} +{% if article.translations %} +Translations: +{% for translation in article.translations %} +{{ translation.lang }} +{% endfor %} +{% endif %} +{% endmacro %} + +{% macro entry_hreflang(entry) %} +{% if entry.translations %} + {% for translation in entry.translations %} + + {% endfor %} +{% endif %} +{% endmacro %}