]> Vexing Labs - letters.git/commitdiff
Update theme, play more with content
authorAdam A.G. Shamblin <adam.shamblin@gmail.com>
Sun, 7 Apr 2019 22:53:49 +0000 (16:53 -0600)
committerAdam A.G. Shamblin <adam.shamblin@gmail.com>
Sun, 7 Apr 2019 22:53:49 +0000 (16:53 -0600)
56 files changed:
README.md
app.js [deleted file]
content/favicon.ico [new file with mode: 0644]
content/hardening_notes.md
index.html [deleted file]
pelicanconf.py
requirements.txt [new file with mode: 0644]
themes/letters/static/css/fonts.css [new file with mode: 0644]
themes/letters/static/css/main.css [new file with mode: 0644]
themes/letters/static/css/pygment.css [new file with mode: 0644]
themes/letters/static/css/reset.css [new file with mode: 0644]
themes/letters/static/css/typogrify.css [new file with mode: 0644]
themes/letters/static/css/wide.css [new file with mode: 0644]
themes/letters/static/fonts/Exo2-Bold.otf [new file with mode: 0644]
themes/letters/static/fonts/Exo2-Italic.otf [new file with mode: 0644]
themes/letters/static/fonts/Exo2-Regular.otf [new file with mode: 0644]
themes/letters/static/fonts/font.css [new file with mode: 0644]
themes/letters/static/images/icons/aboutme.png [new file with mode: 0644]
themes/letters/static/images/icons/bitbucket.png [new file with mode: 0644]
themes/letters/static/images/icons/delicious.png [new file with mode: 0644]
themes/letters/static/images/icons/facebook.png [new file with mode: 0644]
themes/letters/static/images/icons/github.png [new file with mode: 0644]
themes/letters/static/images/icons/gitorious.png [new file with mode: 0644]
themes/letters/static/images/icons/gittip.png [new file with mode: 0644]
themes/letters/static/images/icons/google-groups.png [new file with mode: 0644]
themes/letters/static/images/icons/google-plus.png [new file with mode: 0644]
themes/letters/static/images/icons/hackernews.png [new file with mode: 0644]
themes/letters/static/images/icons/lastfm.png [new file with mode: 0644]
themes/letters/static/images/icons/linkedin.png [new file with mode: 0644]
themes/letters/static/images/icons/reddit.png [new file with mode: 0644]
themes/letters/static/images/icons/rss.png [new file with mode: 0644]
themes/letters/static/images/icons/slideshare.png [new file with mode: 0644]
themes/letters/static/images/icons/speakerdeck.png [new file with mode: 0644]
themes/letters/static/images/icons/stackoverflow.png [new file with mode: 0644]
themes/letters/static/images/icons/twitter.png [new file with mode: 0644]
themes/letters/static/images/icons/vimeo.png [new file with mode: 0644]
themes/letters/static/images/icons/youtube.png [new file with mode: 0644]
themes/letters/templates/analytics.html [new file with mode: 0644]
themes/letters/templates/archives.html [new file with mode: 0644]
themes/letters/templates/article.html [new file with mode: 0644]
themes/letters/templates/article_infos.html [new file with mode: 0644]
themes/letters/templates/author.html [new file with mode: 0644]
themes/letters/templates/authors.html [new file with mode: 0644]
themes/letters/templates/base.html [new file with mode: 0644]
themes/letters/templates/category.html [new file with mode: 0644]
themes/letters/templates/comments.html [new file with mode: 0644]
themes/letters/templates/disqus_script.html [new file with mode: 0644]
themes/letters/templates/github.html [new file with mode: 0644]
themes/letters/templates/index.html [new file with mode: 0644]
themes/letters/templates/page.html [new file with mode: 0644]
themes/letters/templates/period_archives.html [new file with mode: 0644]
themes/letters/templates/tag.html [new file with mode: 0644]
themes/letters/templates/taglist.html [new file with mode: 0644]
themes/letters/templates/tags.html [new file with mode: 0644]
themes/letters/templates/translations.html [new file with mode: 0644]
themes/letters/templates/twitter.html [new file with mode: 0644]

index ab40ef34ea3419d51883d7ae22ebdc3b20ffc13e..dadc35e3df075f9ed98b5f0c9fd8787e7cb1a263 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,40 +1,14 @@
-# Letters
+# Letters from the Workshop
 
 https://letters.vexingworkshop.com
 
-## Goals
+This is the source for my blog, [Letters from the
+Workshop](https://letters.vexingworkshop.com). The site is generated using the
+Pelican static site generator, which reduces the friction encountered when
+writing while eliminating the need to expend cycles maintaining a database. If
+the content is static, why not deliver static content?
 
-### No Frameworks!
+The theme is derived from the default 'notmyidea' theme that ships with Pelican.
 
-* Using, as much as possible, only native browser frameworks
-* Use WebComponents where practical for more involved features
-* Use ES6 as much as is practical
-
-#### How?
-
-For now, I really only care about Firefox. This is my toy, and I feel perfectly
-fine going retro-90's and saying that my site is best viewed with Firefox. That
-being said, these should also be *standard* features, so they should work on
-Firefox and webkit-derived browsers.
-
-### Offline!
-
-* Don't go blank or freak out when a device is offline
-* Queue up network interactions where they can be
-
-#### How?
-
-_Offline First_ isn't quite the right term, as web pages have to be delivered to
-an online client first, but it is my intention to build this site such that it
-will keep working when offline, or fail gracefully where it may not.
-
-### Multilingual, EN/EO
-
-* Multilingual website, hosted in both English and Esperanto
-* Navigation, etc. in both languages
-* Content in both, if practical
-* Easy to switch languages
-
-#### How?
-
-Proxy the `navigator.language` object and switch on change.
+All content on this site, unless otherwise specified, is licenced under a
+[Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/)
diff --git a/app.js b/app.js
deleted file mode 100644 (file)
index fab5851..0000000
--- a/app.js
+++ /dev/null
@@ -1,20 +0,0 @@
-class NavigatorProxyHandler {
-
-  constructor () {
-    this._language = navigator.language;
-  }
-
-  set (obj, prop, val) {
-    if (prop === 'language') {
-      this._language = val;
-    }
-  }
-
-  get (obj, prop) {
-    if (prop === 'language') {
-      return this._language;
-    }
-  }
-};
-
-let navigatorProxy = new Proxy(navigator, new NavigatorProxyHandler());
diff --git a/content/favicon.ico b/content/favicon.ico
new file mode 100644 (file)
index 0000000..f0e9478
Binary files /dev/null and b/content/favicon.ico differ
index 55fea12c66fe195b354fd0863ea8fd20873ed135..d8de92b76fe52d6689c07b45186fbeaa6d50f959 100644 (file)
@@ -1,5 +1,5 @@
 Title: Science Friday - Basic Setup and Hardening of a Linux Server
-Date: 2017-06-24
+Date: 2019-06-24
 Category: Security
 
 ## Prerequisites
diff --git a/index.html b/index.html
deleted file mode 100644 (file)
index d29f3ca..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Letters/Leteroj</title>
-    <meta charset="utf-8"/>
-  </head>
-  <body>
-    <script src="app.js"></script>
-  </body>
-</html>
index 449dc5055a54086011b5bd6f4fd0010f8725ba7e..62d3b998f79c2e80c5ef79e12a18c71edc3e79e3 100644 (file)
@@ -3,7 +3,8 @@
 from __future__ import unicode_literals
 
 AUTHOR = 'signal9'
-SITENAME = 'Leteroj'
+SITENAME = 'Letters'
+SITESUBTITLE = 'from the workshop'
 SITEURL = ''
 
 PATH = 'content'
@@ -18,16 +19,15 @@ CATEGORY_FEED_ATOM = None
 TRANSLATION_FEED_ATOM = None
 AUTHOR_FEED_ATOM = None
 AUTHOR_FEED_RSS = None
+# THEME = 'letters'
 
 # Blogroll
-LINKS = (('Pelican', 'http://getpelican.com/'),
-         ('Python.org', 'http://python.org/'),
-         ('Jinja2', 'http://jinja.pocoo.org/'),
-         ('You can modify those links in your config file', '#'),)
+LINKS = (('Electronic Frontier Foundation', 'https://www.eff.org'),)
 
 # Social widget
-SOCIAL = (('Twitter', 'https://twitter.com/AdamAGShamblin'),
-          ('GitHub', 'https://github.com/coyote240'),)
+SOCIAL = (('GitHub', 'https://github.com/coyote240'),
+          ('Twitter', 'https://twitter.com/AdamAGShamblin'),
+          ('LinkedIn', 'https://www.linkedin.com/in/adam-shamblin/'))
 
 DEFAULT_PAGINATION = 10
 
diff --git a/requirements.txt b/requirements.txt
new file mode 100644 (file)
index 0000000..3ad38bc
--- /dev/null
@@ -0,0 +1,12 @@
+blinker==1.4
+docutils==0.14
+feedgenerator==1.9
+Jinja2==2.10
+Markdown==3.1
+MarkupSafe==1.1.1
+pelican==4.0.1
+Pygments==2.3.1
+python-dateutil==2.8.0
+pytz==2018.9
+six==1.12.0
+Unidecode==1.0.23
diff --git a/themes/letters/static/css/fonts.css b/themes/letters/static/css/fonts.css
new file mode 100644 (file)
index 0000000..e0e5b20
--- /dev/null
@@ -0,0 +1,9 @@
+@font-face {
+       font-family: 'Exo 2';
+       font-style: normal;
+       font-weight: 400;
+       src:
+               url(../fonts/Exo2-Regular.otp') format('opentype'),
+               url(../fonts/Exo2-Bold.otp') format('opentype'),
+               url(../fonts/Exo2-Italic.otp') format('opentype');
+}
diff --git a/themes/letters/static/css/main.css b/themes/letters/static/css/main.css
new file mode 100644 (file)
index 0000000..3632d63
--- /dev/null
@@ -0,0 +1,456 @@
+/*
+       Name: Smashing HTML5
+       Date: July 2009
+       Description: Sample layout for HTML5 and CSS3 goodness.
+       Version: 1.0
+       License: MIT <http://opensource.org/licenses/MIT>
+       Licensed by: Smashing Media GmbH <http://www.smashingmagazine.com/>
+       Original author: Enrique Ramírez <http://enrique-ramirez.com/>
+*/
+
+/* Imports */
+@import url("reset.css");
+@import url("pygment.css");
+@import url("typogrify.css");
+@import url("fonts.css");
+
+/***** Global *****/
+/* Body */
+body {
+    background: #FFFFFF;
+    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: 'Exo 2', sans-serif;
+}
+
+h3, h4, h5, h6 { margin-top: .8em; }
+
+hr { border: 2px solid #708090; }
+
+/* Anchors */
+a {outline: 0;}
+a img {border: 0px; text-decoration: none;}
+a:link, a:visited {
+       color: #708090;
+       padding: 0 1px;
+       text-decoration: underline;
+}
+a:hover, a:active {
+       background-color: #708090;
+       color: #fff;
+       text-decoration: none;
+}
+
+h1 a:hover {
+  color: inherit;
+  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; width: 800px;}
+img.right, figure.right {float: right; margin: 0 0 2em 2em;}
+img.left, figure.left {float: left; margin: 0 2em 2em 0;}
+
+/*
+       Header
+*****************/
+#banner {
+       margin: 0 auto;
+       padding: 2em 0 0 0;
+}
+
+       /* Banner */
+       #banner h1 {
+    font-size: 4.5em;
+    margin-bottom: 0;
+  }
+       #banner h1 a:link, #banner h1 a:visited {
+               color: #000305;
+               display: block;
+               font-weight: bold;
+               margin: 0 0 .2em 0;
+               text-decoration: none;
+       }
+       #banner h1 a:hover, #banner h1 a:active {
+               background: none;
+               text-shadow: none;
+       }
+
+       #banner h1 strong {font-size: 0.36em; font-weight: normal;}
+
+       /* Main Nav */
+       #banner nav {
+               background: #000305;
+               font-size: 1.143em;
+    font-family: 'Exo 2', sans-serif;
+    text-transform: lowercase;
+               height: 40px;
+               line-height: 30px;
+               margin: 0 auto 2em auto;
+               padding: 0;
+               text-align: center;
+               width: 800px;
+       }
+
+       #banner nav ul {list-style: none; margin: 0 auto; 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: #708090;
+               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: 0 20px;
+}
+
+#featured figure {
+       border: 2px solid #eee;
+       float: right;
+       margin: 0.786em 2em 0 5em;
+       width: 248px;
+}
+#featured figure img {display: block; float: right;}
+
+#featured h2 {color: #708090; font-size: 1.714em; margin: 1em 0 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 0;
+}
+
+/*
+       Extras
+*****************/
+#extras {margin: 0 auto 3em auto; overflow: hidden;}
+
+#extras ul {list-style: none; margin: 0;}
+#extras li {
+  border-bottom: 1px solid #fff;
+  margin: 0;
+}
+#extras h2 {
+       color: #708090;
+       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;
+               width: 615px;
+       }
+
+       #extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;}
+
+       /* Social */
+       #extras .social {
+               float: right;
+               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*='digg.com'] {background-image: url('../images/icons/digg.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;
+       width: 760px;
+
+       border-radius: 10px;
+       -moz-border-radius: 10px;
+       -webkit-border-radius: 10px;
+}
+
+#about .primary {float: left; 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; width: 500px;}
+
+/*
+       Footer
+*****************/
+#contentinfo {padding-bottom: 2em; text-align: center;}
+#contentinfo a[rel="license"]:hover {
+  background-color: inherit;
+}
+
+
+/***** Sections *****/
+/* Blog */
+.hentry {
+       display: block;
+       clear: both;
+       border-bottom: 1px solid #eee;
+       padding: 1.5em 0;
+}
+li:last-child .hentry, #content > .hentry {border: 0; margin: 0;}
+#content > .hentry {padding: 1em 0;}
+.hentry img{display : none ;}
+.hentry header h1 a {
+  color: inherit;
+  text-decoration: none;
+}
+.hentry header h1 a:hover {
+  color: inherit;
+}
+.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;
+               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; width: 150px;}
+       #add-comment input[type='text'],
+       #add-comment input[type='email'],
+       #add-comment input[type='url'] {float: left; width: 200px;}
+
+       #add-comment textarea {float: left; height: 150px; 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/letters/static/css/pygment.css b/themes/letters/static/css/pygment.css
new file mode 100644 (file)
index 0000000..fdd056f
--- /dev/null
@@ -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/letters/static/css/reset.css b/themes/letters/static/css/reset.css
new file mode 100644 (file)
index 0000000..1e21756
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+       Name: Reset Stylesheet
+       Description: Resets browser's default CSS
+       Author: Eric Meyer
+       Author URI: http://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/letters/static/css/typogrify.css b/themes/letters/static/css/typogrify.css
new file mode 100644 (file)
index 0000000..3bae497
--- /dev/null
@@ -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/letters/static/css/wide.css b/themes/letters/static/css/wide.css
new file mode 100644 (file)
index 0000000..88fd59c
--- /dev/null
@@ -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/letters/static/fonts/Exo2-Bold.otf b/themes/letters/static/fonts/Exo2-Bold.otf
new file mode 100644 (file)
index 0000000..3609640
Binary files /dev/null and b/themes/letters/static/fonts/Exo2-Bold.otf differ
diff --git a/themes/letters/static/fonts/Exo2-Italic.otf b/themes/letters/static/fonts/Exo2-Italic.otf
new file mode 100644 (file)
index 0000000..79fe3e0
Binary files /dev/null and b/themes/letters/static/fonts/Exo2-Italic.otf differ
diff --git a/themes/letters/static/fonts/Exo2-Regular.otf b/themes/letters/static/fonts/Exo2-Regular.otf
new file mode 100644 (file)
index 0000000..ee1fe70
Binary files /dev/null and b/themes/letters/static/fonts/Exo2-Regular.otf differ
diff --git a/themes/letters/static/fonts/font.css b/themes/letters/static/fonts/font.css
new file mode 100644 (file)
index 0000000..e545cee
--- /dev/null
@@ -0,0 +1,9 @@
+@font-face {
+       font-family: 'Exo 2';
+       font-style: normal;
+       font-weight: 400;
+       src:
+               url(Exo2-Regular.otp') format('opentype'),
+               url(Exo2-Bold.otp') format('opentype'),
+               url(Exo2-Italic.otp') format('opentype');
+}
diff --git a/themes/letters/static/images/icons/aboutme.png b/themes/letters/static/images/icons/aboutme.png
new file mode 100644 (file)
index 0000000..600110f
Binary files /dev/null and b/themes/letters/static/images/icons/aboutme.png differ
diff --git a/themes/letters/static/images/icons/bitbucket.png b/themes/letters/static/images/icons/bitbucket.png
new file mode 100644 (file)
index 0000000..277a7df
Binary files /dev/null and b/themes/letters/static/images/icons/bitbucket.png differ
diff --git a/themes/letters/static/images/icons/delicious.png b/themes/letters/static/images/icons/delicious.png
new file mode 100644 (file)
index 0000000..34868c5
Binary files /dev/null and b/themes/letters/static/images/icons/delicious.png differ
diff --git a/themes/letters/static/images/icons/facebook.png b/themes/letters/static/images/icons/facebook.png
new file mode 100644 (file)
index 0000000..1d8a432
Binary files /dev/null and b/themes/letters/static/images/icons/facebook.png differ
diff --git a/themes/letters/static/images/icons/github.png b/themes/letters/static/images/icons/github.png
new file mode 100644 (file)
index 0000000..5d9109d
Binary files /dev/null and b/themes/letters/static/images/icons/github.png differ
diff --git a/themes/letters/static/images/icons/gitorious.png b/themes/letters/static/images/icons/gitorious.png
new file mode 100644 (file)
index 0000000..a6705d0
Binary files /dev/null and b/themes/letters/static/images/icons/gitorious.png differ
diff --git a/themes/letters/static/images/icons/gittip.png b/themes/letters/static/images/icons/gittip.png
new file mode 100644 (file)
index 0000000..b9f67aa
Binary files /dev/null and b/themes/letters/static/images/icons/gittip.png differ
diff --git a/themes/letters/static/images/icons/google-groups.png b/themes/letters/static/images/icons/google-groups.png
new file mode 100644 (file)
index 0000000..bbd0a0f
Binary files /dev/null and b/themes/letters/static/images/icons/google-groups.png differ
diff --git a/themes/letters/static/images/icons/google-plus.png b/themes/letters/static/images/icons/google-plus.png
new file mode 100644 (file)
index 0000000..f8553d4
Binary files /dev/null and b/themes/letters/static/images/icons/google-plus.png differ
diff --git a/themes/letters/static/images/icons/hackernews.png b/themes/letters/static/images/icons/hackernews.png
new file mode 100644 (file)
index 0000000..8e05e3e
Binary files /dev/null and b/themes/letters/static/images/icons/hackernews.png differ
diff --git a/themes/letters/static/images/icons/lastfm.png b/themes/letters/static/images/icons/lastfm.png
new file mode 100644 (file)
index 0000000..2eedd2d
Binary files /dev/null and b/themes/letters/static/images/icons/lastfm.png differ
diff --git a/themes/letters/static/images/icons/linkedin.png b/themes/letters/static/images/icons/linkedin.png
new file mode 100644 (file)
index 0000000..06a8801
Binary files /dev/null and b/themes/letters/static/images/icons/linkedin.png differ
diff --git a/themes/letters/static/images/icons/reddit.png b/themes/letters/static/images/icons/reddit.png
new file mode 100644 (file)
index 0000000..d826d3e
Binary files /dev/null and b/themes/letters/static/images/icons/reddit.png differ
diff --git a/themes/letters/static/images/icons/rss.png b/themes/letters/static/images/icons/rss.png
new file mode 100644 (file)
index 0000000..12448f5
Binary files /dev/null and b/themes/letters/static/images/icons/rss.png differ
diff --git a/themes/letters/static/images/icons/slideshare.png b/themes/letters/static/images/icons/slideshare.png
new file mode 100644 (file)
index 0000000..9cbe858
Binary files /dev/null and b/themes/letters/static/images/icons/slideshare.png differ
diff --git a/themes/letters/static/images/icons/speakerdeck.png b/themes/letters/static/images/icons/speakerdeck.png
new file mode 100644 (file)
index 0000000..7281ec4
Binary files /dev/null and b/themes/letters/static/images/icons/speakerdeck.png differ
diff --git a/themes/letters/static/images/icons/stackoverflow.png b/themes/letters/static/images/icons/stackoverflow.png
new file mode 100644 (file)
index 0000000..3c6862e
Binary files /dev/null and b/themes/letters/static/images/icons/stackoverflow.png differ
diff --git a/themes/letters/static/images/icons/twitter.png b/themes/letters/static/images/icons/twitter.png
new file mode 100644 (file)
index 0000000..cef1cef
Binary files /dev/null and b/themes/letters/static/images/icons/twitter.png differ
diff --git a/themes/letters/static/images/icons/vimeo.png b/themes/letters/static/images/icons/vimeo.png
new file mode 100644 (file)
index 0000000..4b9d721
Binary files /dev/null and b/themes/letters/static/images/icons/vimeo.png differ
diff --git a/themes/letters/static/images/icons/youtube.png b/themes/letters/static/images/icons/youtube.png
new file mode 100644 (file)
index 0000000..e334e68
Binary files /dev/null and b/themes/letters/static/images/icons/youtube.png differ
diff --git a/themes/letters/templates/analytics.html b/themes/letters/templates/analytics.html
new file mode 100644 (file)
index 0000000..a966c4c
--- /dev/null
@@ -0,0 +1,45 @@
+{% if GOOGLE_ANALYTICS %}
+    <script type="text/javascript">
+    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+    ga('create', '{{GOOGLE_ANALYTICS}}', '{{GA_COOKIE_DOMAIN if GA_COOKIE_DOMAIN else 'auto'}}');
+    ga('send', 'pageview');
+    </script>
+{% endif %}
+{% if GAUGES %}
+    <script type="text/javascript">
+    var _gauges = _gauges || [];
+    (function() {
+        var t   = document.createElement('script');
+        t.type  = 'text/javascript';
+        t.async = true;
+        t.id    = 'gauges-tracker';
+        t.setAttribute('data-site-id', '{{GAUGES}}');
+        t.src = '//secure.gaug.es/track.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(t, s);
+    })();
+    </script>
+{% endif %}
+{% if PIWIK_URL and PIWIK_SITE_ID %}
+    <script type="text/javascript">
+    {% if PIWIK_SSL_URL %}
+        var pkBaseURL = "{{ PIWIK_SSL_URL }}";
+    {% else %}
+        var pkBaseURL = "{{ PIWIK_URL }}";
+    {% endif %}
+    var _paq = _paq || [];
+    _paq.push(["trackPageView"]);
+    _paq.push(["enableLinkTracking"]);
+    (function() {
+        var u=(("https:" == document.location.protocol) ? "https" : "http")+"://"+pkBaseURL+"/";
+        _paq.push(["setTrackerUrl", u+"piwik.php"]);
+        _paq.push(["setSiteId", "{{ PIWIK_SITE_ID }}"]);
+        var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
+        g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
+    })();
+    </script>
+{% endif %}
diff --git a/themes/letters/templates/archives.html b/themes/letters/templates/archives.html
new file mode 100644 (file)
index 0000000..f678494
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+{% block content %}
+<section id="content" class="body">
+<h1>Archives for {{ SITENAME }}</h1>
+
+<dl>
+{% for article in dates %}
+    <dt>{{ article.locale_date }}</dt>
+    <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
+{% endfor %}
+</dl>
+</section>
+{% endblock %}
diff --git a/themes/letters/templates/article.html b/themes/letters/templates/article.html
new file mode 100644 (file)
index 0000000..98c91bb
--- /dev/null
@@ -0,0 +1,46 @@
+{% extends "base.html" %}
+{% block html_lang %}{{ article.lang }}{% 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 %}
+<section id="content" class="body">
+  <article>
+    <header>
+      <h1 class="entry-title">
+        <a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
+           title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
+      {% include 'twitter.html' %}
+    </header>
+
+    <div class="entry-content">
+      {% include 'article_infos.html' %}
+      {{ article.content }}
+    </div><!-- /.entry-content -->
+    {% if DISQUS_SITENAME and SITEURL and article.status != "draft" %}
+    <div class="comments">
+      <h2>Comments !</h2>
+      <div id="disqus_thread"></div>
+      <script type="text/javascript">
+        var disqus_shortname = '{{ DISQUS_SITENAME }}';
+        var disqus_identifier = '{{ article.url }}';
+        var disqus_url = '{{ SITEURL }}/{{ article.url }}';
+        (function() {
+        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+        dsq.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
+        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+        })();
+      </script>
+      <noscript>Please enable JavaScript to view the comments.</noscript>
+    </div>
+    {% endif %}
+
+  </article>
+</section>
+{% endblock %}
diff --git a/themes/letters/templates/article_infos.html b/themes/letters/templates/article_infos.html
new file mode 100644 (file)
index 0000000..172ad85
--- /dev/null
@@ -0,0 +1,23 @@
+<footer class="post-info">
+        <abbr class="published" title="{{ article.date.isoformat() }}">
+                Published: {{ article.locale_date }}
+        </abbr>
+        {% if article.modified %}
+               <br />
+        <abbr class="modified" title="{{ article.modified.isoformat() }}">
+                Updated: {{ article.locale_modified }}
+        </abbr>
+        {% endif %}
+
+        {% if article.authors %}
+        <address class="vcard author">
+                By {% for author in article.authors %}
+                        <a class="url fn" href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>
+                {% endfor %}
+        </address>
+        {% endif %}
+<p>In <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>.</p>
+{% include 'taglist.html' %}
+{% import 'translations.html' as translations with context %}
+{{ translations.translations_for(article) }}
+</footer><!-- /.post-info -->
diff --git a/themes/letters/templates/author.html b/themes/letters/templates/author.html
new file mode 100644 (file)
index 0000000..0b37290
--- /dev/null
@@ -0,0 +1,2 @@
+{% extends "index.html" %}
+{% block title %}{{ SITENAME }} - {{ author }}{% endblock %}
diff --git a/themes/letters/templates/authors.html b/themes/letters/templates/authors.html
new file mode 100644 (file)
index 0000000..e61a332
--- /dev/null
@@ -0,0 +1,16 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITENAME }} - Authors{% endblock %}
+
+{% block content %}
+
+<section id="content" class="body">
+    <h1>Authors on {{ SITENAME }}</h1>
+    <ul>
+    {% for author, articles in authors|sort %}
+        <li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
+    {% endfor %}
+    </ul>
+</section>
+
+{% endblock %}
diff --git a/themes/letters/templates/base.html b/themes/letters/templates/base.html
new file mode 100644 (file)
index 0000000..73b3b7d
--- /dev/null
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
+<head>
+        <meta charset="utf-8" />
+        <title>{% block title %}{{ SITENAME }}{%endblock%}</title>
+        <link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" />
+        {% if FEED_ALL_ATOM %}
+        <link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
+        {% endif %}
+        {% if FEED_ALL_RSS %}
+        <link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
+        {% endif %}
+        {% block extra_head %}{% endblock extra_head %}
+</head>
+
+<body id="index" class="home">
+{% include 'github.html' %}
+        <header id="banner" class="body">
+                <h1><a href="{{ SITEURL }}/">{{ SITENAME }} {% if SITESUBTITLE %}<strong>{{ SITESUBTITLE }}</strong>{% endif %}</a></h1>
+                <nav><ul>
+                {% for title, link in MENUITEMS %}
+                    <li><a href="{{ link }}">{{ title }}</a></li>
+                {% endfor %}
+                {% if DISPLAY_PAGES_ON_MENU -%}
+                {% for pg in pages %}
+                    <li{% if pg == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ pg.url }}">{{ pg.title }}</a></li>
+                {% endfor %}
+                {% endif %}
+                {% if DISPLAY_CATEGORIES_ON_MENU -%}
+                {% for cat, null in categories %}
+                    <li{% if cat == category %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ cat.url }}">{{ cat }}</a></li>
+                {% endfor %}
+                {% endif %}
+                </ul></nav>
+        </header><!-- /#banner -->
+        {% block content %}
+        {% endblock %}
+        <section id="extras" class="body">
+        {% if LINKS %}
+                <div class="blogroll">
+                        <h2>{{ LINKS_WIDGET_NAME | default('links') }}</h2>
+                        <ul>
+                        {% for name, link in LINKS %}
+                            <li><a href="{{ link }}">{{ name }}</a></li>
+                        {% endfor %}
+                        </ul>
+                </div><!-- /.blogroll -->
+        {% endif %}
+        {% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %}
+                <div class="social">
+                        <h2>{{ SOCIAL_WIDGET_NAME | default('social') }}</h2>
+                        <ul>
+                            {% if FEED_ALL_ATOM %}
+                            <li><a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate">atom feed</a></li>
+                            {% endif %}
+                            {% if FEED_ALL_RSS %}
+                            <li><a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate">rss feed</a></li>
+                            {% endif %}
+
+                        {% for name, link in SOCIAL %}
+                            <li><a href="{{ link }}">{{ name }}</a></li>
+                        {% endfor %}
+                        </ul>
+                </div><!-- /.social -->
+        {% endif %}
+        </section><!-- /#extras -->
+
+        <footer id="contentinfo" class="body">
+          <p>
+            <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">
+              <img alt="Creative Commons License"
+                   src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png"/>
+            </a>
+          </p>
+          <p>
+            <a href="{{ SITEURL }}/">{{ SITENAME }}</a> is licensed
+            <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">
+              CC-BY-SA
+            </a>.
+          </p>
+        </footer><!-- /#contentinfo -->
+
+{% include 'analytics.html' %}
+{% include 'disqus_script.html' %}
+</body>
+</html>
diff --git a/themes/letters/templates/category.html b/themes/letters/templates/category.html
new file mode 100644 (file)
index 0000000..56f8e93
--- /dev/null
@@ -0,0 +1,2 @@
+{% extends "index.html" %}
+{% block title %}{{ SITENAME }} - {{ category }}{% endblock %}
diff --git a/themes/letters/templates/comments.html b/themes/letters/templates/comments.html
new file mode 100644 (file)
index 0000000..bb033c0
--- /dev/null
@@ -0,0 +1 @@
+{% if DISQUS_SITENAME %}<p>There are <a href="{{ SITEURL }}/{{ article.url }}#disqus_thread">comments</a>.</p>{% endif %}
diff --git a/themes/letters/templates/disqus_script.html b/themes/letters/templates/disqus_script.html
new file mode 100644 (file)
index 0000000..23ec532
--- /dev/null
@@ -0,0 +1,11 @@
+{% if DISQUS_SITENAME %}
+<script type="text/javascript">
+    var disqus_shortname = '{{ DISQUS_SITENAME }}';
+    (function () {
+        var s = document.createElement('script'); s.async = true;
+        s.type = 'text/javascript';
+        s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';
+        (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
+    }());
+</script>
+{% endif %}
diff --git a/themes/letters/templates/github.html b/themes/letters/templates/github.html
new file mode 100644 (file)
index 0000000..ccc401f
--- /dev/null
@@ -0,0 +1,9 @@
+{% if GITHUB_URL %}
+<a href="{{ GITHUB_URL }}">
+{% if GITHUB_POSITION != "left" %}
+<img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub" />
+{% else %}
+<img style="position: absolute; top: 0; left: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_left_white_ffffff.png" alt="Fork me on GitHub" />
+{% endif %}
+</a>
+{% endif %}
diff --git a/themes/letters/templates/index.html b/themes/letters/templates/index.html
new file mode 100644 (file)
index 0000000..20ca7ee
--- /dev/null
@@ -0,0 +1,59 @@
+{% 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() %}
+            <aside id="featured" class="body">
+                <article>
+                    <h1 class="entry-title"><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></h1>
+                    {% include 'article_infos.html' %}{{ article.content }}{% include 'comments.html' %}
+                </article>
+            </aside><!-- /#featured -->
+            {% if loop.length > 1 %}
+                <section id="content" class="body">
+                    <h1>Other articles</h1>
+                    <hr />
+                    <ol id="posts-list" class="hfeed">
+            {% endif %}
+        {# other items #}
+        {% else %}
+            {% if loop.first %}
+                <section id="content" class="body">
+                    <ol id="posts-list" class="hfeed" start="{{ articles_paginator.per_page -1 }}">
+            {% endif %}
+            <li><article class="hentry">
+                <header>
+                    <h1><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
+                           title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
+                </header>
+
+                <div class="entry-content">
+                {% include 'article_infos.html' %}
+                {{ article.summary }}
+                <a class="readmore" href="{{ SITEURL }}/{{ article.url }}">read more</a>
+                {% include 'comments.html' %}
+                </div><!-- /.entry-content -->
+            </article></li>
+        {% endif %}
+        {% if loop.last %}
+            {% if loop.length > 1 or articles_page.has_other_pages() %}
+                </ol><!-- /#posts-list -->
+                {% if articles_page.has_other_pages() %}
+                    {% include 'pagination.html' %}
+                {% endif %}
+                </section><!-- /#content -->
+            {% endif %}
+        {% endif %}
+    {% endfor %}
+{% else %}
+<section id="content" class="body">
+<h2>Pages</h2>
+    {% for page in pages %}
+        <li><a href="{{ SITEURL }}/{{ page.url }}">{{ page.title }}</a></li>
+    {% endfor %}
+</section>
+{% endif %}
+{% endblock content %}
diff --git a/themes/letters/templates/page.html b/themes/letters/templates/page.html
new file mode 100644 (file)
index 0000000..7e50c1f
--- /dev/null
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+{% block html_lang %}{{ page.lang }}{% endblock %}
+{% block title %}{{ page.title }}{% endblock %}
+
+{% block extra_head %}
+{% import 'translations.html' as translations with context %}
+{% if translations.entry_hreflang(page) %}
+  {{ translations.entry_hreflang(page) }}
+{% endif %}
+{% endblock %}
+
+{% block content %}
+<section id="content" class="body">
+    <h1 class="entry-title">{{ page.title }}</h1>
+    {% import 'translations.html' as translations with context %}
+    {{ translations.translations_for(page) }}
+    {{ page.content }}
+</section>
+{% endblock %}
diff --git a/themes/letters/templates/period_archives.html b/themes/letters/templates/period_archives.html
new file mode 100644 (file)
index 0000000..252e002
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+{% block content %}
+<section id="content" class="body">
+<h1>Archives for {{ period | reverse | join(' ') }}</h1>
+
+<dl>
+{% for article in dates %}
+    <dt>{{ article.locale_date }}</dt>
+    <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
+{% endfor %}
+</dl>
+</section>
+{% endblock %}
diff --git a/themes/letters/templates/tag.html b/themes/letters/templates/tag.html
new file mode 100644 (file)
index 0000000..68cdcba
--- /dev/null
@@ -0,0 +1,2 @@
+{% extends "index.html" %}
+{% block title %}{{ SITENAME }} - {{ tag }}{% endblock %}
diff --git a/themes/letters/templates/taglist.html b/themes/letters/templates/taglist.html
new file mode 100644 (file)
index 0000000..58f3557
--- /dev/null
@@ -0,0 +1 @@
+{% if article.tags %}<p>tags: {% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag | escape }}</a> {% endfor %}</p>{% endif %}
diff --git a/themes/letters/templates/tags.html b/themes/letters/templates/tags.html
new file mode 100644 (file)
index 0000000..fb09955
--- /dev/null
@@ -0,0 +1,16 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITENAME }} - Tags{% endblock %}
+
+{% block content %}
+
+<section id="content" class="body">
+    <h1>Tags for {{ SITENAME }}</h1>
+    <ul>
+    {% for tag, articles in tags|sort %}
+        <li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
+    {% endfor %}
+    </ul>
+</section>
+
+{% endblock %}
diff --git a/themes/letters/templates/translations.html b/themes/letters/templates/translations.html
new file mode 100644 (file)
index 0000000..1eec7c4
--- /dev/null
@@ -0,0 +1,16 @@
+{% macro translations_for(article) %}
+{% if article.translations %}
+Translations:
+    {% for translation in article.translations %}
+        <a href="{{ SITEURL }}/{{ translation.url }}" hreflang="{{ translation.lang }}">{{ translation.lang }}</a>
+    {% endfor %}
+{% endif %}
+{% endmacro %}
+
+{% macro entry_hreflang(entry) %}
+{% if entry.translations %}
+  {% for translation in entry.translations %}
+    <link rel="alternate" hreflang="{{ translation.lang }}" href="{{ SITEURL }}/{{ translation.url }}">
+  {% endfor %}
+{% endif %}
+{% endmacro %}
diff --git a/themes/letters/templates/twitter.html b/themes/letters/templates/twitter.html
new file mode 100644 (file)
index 0000000..bf78c32
--- /dev/null
@@ -0,0 +1,3 @@
+{% if TWITTER_USERNAME %}
+<a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="{{TWITTER_USERNAME}}">Tweet</a><script type="text/javascript" src="https://platform.twitter.com/widgets.js"></script>
+{% endif %}