pelican-subtle-giggi: update release v1
diff --git a/theme/static/css/pygments.css b/theme/static/css/pygments.css
new file mode 100644
index 0000000..ffc1611
--- /dev/null
+++ b/theme/static/css/pygments.css
@@ -0,0 +1,94 @@
+@charset "UTF-8";
+
+/* See available classes at https://bitbucket.org/birkenfeld/pygments-main/src/default/pygments/token.py */
+
+.hll { background-color: #ffd800; display: block;}
+.w { color: #bbbbbb; }
+/* .esc (Escape) */
+.err { color: #a61717; background-color: #e3d2d2; }
+/* .x (Other) */
+
+/* Keyword */
+.k { font-weight: bold; }
+.kc { font-weight: bold; }
+.kd { font-weight: bold; }
+.kn { font-weight: bold; }
+.kp { font-weight: bold; }
+.kr { font-weight: bold; }
+.kt { color: #445588; font-weight: bold; }
+
+/* Name */
+.n { color: #333333; }
+.na { color: teal; }
+.nb { color: #0086b3; }
+.bp { color: #1d3e81 }
+.nc { color: #445588; font-weight: bold; }
+.no { color: teal; }
+.nd { color: #3c5d5d; font-weight: bold }
+.ni { color: purple; }
+.ne { color: #990000; font-weight: bold; }
+.nf { color: #990000; font-weight: bold; }
+/* .py (Name.Property) */
+.nl { color: #990000; font-weight: bold }
+.nn { color: #555555; }
+/* .nx (Name.Other) */
+.nt { color: navy; }
+.nv { color: teal; }
+.vc { color: teal; }
+.vg { color: teal; }
+.vi { color: teal; }
+
+/* Literal */
+/* .l (Literal) */
+/* .ld (Literal.Date) */
+
+/* String */
+.s { color: #dd1144; }
+.sb { color: #dd1144; }
+.sc { color: #dd1144; }
+.sd { color: #dd1144; }
+.s2 { color: #dd1144; }
+.se { color: #dd1144; }
+.sh { color: #dd1144; }
+.si { color: #dd1144; }
+.sx { color: #dd1144; }
+.sr { color: #009926; }
+.s1 { color: #dd1144; }
+.ss { color: #990073; }
+
+/* Number */
+.m { color: #009999; }
+/* .mb (Number.Bin) */
+.mf { color: #009999; }
+.mh { color: #009999; }
+.mi { color: #009999; }
+.il { color: #009999; }
+.mo { color: #009999; }
+
+/* Operator */
+.o { font-weight: bold; }
+.ow { font-weight: bold; }
+
+/* .p (Punctuation) */
+
+/* Comment */
+.c { color: #999988; font-style: italic; }
+.cm { color: #999988; font-style: italic; }
+.cp { color: #999999; font-weight: bold; font-style: italic; }
+.c1 { color: #999988; font-style: italic; }
+.cs { color: #999999; font-weight: bold; font-style: italic; }
+
+/* Generic */
+/* .g (Generic) */
+.gd { color: #000000; background-color: #ffdddd; }
+.gd .x { color: #000000; background-color: #ffaaaa; }
+.ge { font-style: italic; }
+.gr { color: #aa0000; }
+.gh { color: #999999; }
+.gi { color: #000000; background-color: #ddffdd; }
+.gi .x { color: #000000; background-color: #aaffaa; }
+.go { color: #888888; }
+.gp { color: #555555; }
+.gs { font-weight: bold; }
+.gu { color: #800080; font-weight: bold; }
+.gt { color: #aa0000; }
diff --git a/theme/static/css/style.scss b/theme/static/css/style.scss
new file mode 100644
index 0000000..21212cb
--- /dev/null
+++ b/theme/static/css/style.scss
@@ -0,0 +1,374 @@
+@charset "UTF-8";
+
+$black: #000000;
+$white: #ffffff;
+$light-grey: #eeeeee;
+$med-grey: #5f5f5f;
+$dark-grey: #202020;
+$bg-grey: #FAFAFA;
+
+$code-border: #c7c7c7;
+$code-background: #f6f6f6;
+$code-linebg: #dddddd;
+
+$accent: #0e94ec;
+$danger: red;
+
+$sans: -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif;
+$mono: monospace;
+
+$border_color: #c2c2c2;
+$pag_label_size: 60px;
+$logo_size: 150px;
+
+$content_size: 640px;
+$horiz_pad: 40px;
+
+$main_font_size: 1rem;
+$nav_font_size: 1rem;
+$subtitle_font_size: 0.9rem;
+$code_font_size: 1rem;
+$article_meta_font_size: 0.8rem;
+$pagination_font_size: 0.9rem;
+$footer_font_size: 0.7rem;
+
+//The minimum size the screen can be without scaling the main content
+$min_screen: floor((($content_size + $horiz_pad * 2) * 1.33));
+
+body {
+ margin: 0;
+ padding: 0;
+ background-color: $bg-grey;
+ color: $dark-grey;
+ font-family: $sans;
+ font-size: $main_font_size;
+ min-width: 300px;
+}
+
+a {
+ color: $black;
+ text-decoration: none;
+}
+
+a[href]:not(.nohover) {
+ &:hover{
+ color: $accent;
+ }
+}
+
+hr {
+ background-color: $border_color;
+ height: 1px;
+ border: none;
+}
+
+img {
+ max-width: 100%;
+}
+
+aside {
+ div#user_meta {
+ padding: $horiz_pad 20px $horiz_pad 20px;
+ text-align: center;
+
+ img#logo {
+ width: $logo_size;
+ height: $logo_size;
+ border-radius: 50%;
+ border: 5px solid $black;
+ background-color: $black;
+ box-shadow: 0px 0px 1px $black;
+ }
+
+ h2 {
+ margin: 15px 0 5px 0;
+ }
+
+ p {
+ margin: 0px;
+ font-size: $subtitle_font_size;
+ }
+
+ i {
+ width: 30px;
+ text-align: center;
+ vertical-align: middle;
+ }
+
+ div.social {
+ margin-top:15px;
+
+ a {
+ display: inline-block;
+ height: 30px;
+ }
+ }
+
+ ul {
+ margin: 0px;
+ padding-left: 0px;
+ list-style-type: none;
+
+ li {
+ line-height: 2em;
+
+ a {
+ i {
+ padding-left: 5px;
+ }
+ }
+ }
+ }
+ }
+}
+
+main {
+ position: relative;
+ width: 100%;
+ margin: auto;
+
+ header {
+ padding: 0px $horiz_pad 0px $horiz_pad;
+ border-top: $border_color 1px solid;
+ border-bottom: $border_color 1px solid;
+ text-align: center;
+ color: $med-grey;
+
+ p {
+ font-weight: bold;
+ font-size: $nav_font_size;
+ text-transform: uppercase;
+ }
+
+ p#header {
+ color: $black;
+ }
+
+ p:not(#header){
+ a {
+ color: $med-grey;
+ &:hover{
+ color: $accent;
+ }
+ }
+ }
+ }
+
+ article {
+ padding: 10px $horiz_pad 10px $horiz_pad;
+ max-width: $content_size;
+ margin: auto;
+
+ div.article_title {
+ }
+
+ div.article_text {
+ line-height: 1.375em;
+ a {
+ text-decoration: underline;
+ }
+
+ @mixin codeformat {
+ color: black;
+ font-size: $code_font_size;
+ font-family: $mono;
+ }
+
+ code {
+ @include codeformat;
+ padding: 1px 3px;
+ background: $light-grey;
+ }
+
+ pre {
+ @include codeformat;
+ line-height: 1.25;
+ margin-bottom: 0px;
+ margin-top: 0px;
+ padding-top: 5px;
+ padding-bottom: 10px;
+ }
+
+ div.highlight {
+ overflow: auto;
+ }
+
+ div.highlight pre {
+ display: inline-block;
+ padding-left: 10px;
+ overflow-x: auto;
+ border: 1px solid $code-border;
+ border-left: 3px solid $accent;
+ background: $code-background;
+ }
+
+ /* Line numbers are enabled */
+ table.highlighttable {
+ table-layout: fixed;
+ width: 100%;
+ border: 1px solid $code-border;
+ border-collapse: collapse;
+
+ pre {
+ border: none;
+ }
+
+ td {
+ padding: 0px;
+ }
+
+ td.linenos {
+ width: 30px;
+ overflow: hidden;
+ text-align: right;
+ border-left: 3px solid $accent;
+ border-right: 1px solid $code-border;
+ background: $code-linebg;
+ vertical-align:top;
+
+ div.linenodiv pre {
+ padding-right: 4px;
+ float: right;
+ }
+ }
+ }
+
+ div.admonition {
+
+ border-width: 1px 1px 1px 7px;
+ border-radius: 10px;
+ border-style: solid;
+ border-color: $code-border;
+ border-left-color: $dark-grey;
+ background-color: $code-background;
+
+ &.update, &.hint, &.important, &.note, &.tip {
+ border-left-color: $accent;
+ }
+
+ &.warning, &.attention, &.caution, &.danger {
+ border-left-color: $danger;
+ }
+
+ p {
+ margin: 0px;
+ padding: 10px 15px;
+ }
+
+ p.admonition-title{
+ text-transform: uppercase;
+ font-weight: bold;
+ padding: 5px 15px;
+ border-bottom: 1px solid $code-border;
+ }
+ }
+
+ blockquote {
+ margin: 22px 2px 22px 2px;
+ padding-left: $horiz_pad;
+ color: $med-grey;
+ font-style: italic;
+ }
+ }
+
+ div.article_meta {
+ font-size: $article_meta_font_size;
+ color: $med-grey;
+ }
+
+ div#article_comments{
+ padding-top: 10px;
+ padding-bottom: 10px;
+
+ i {
+ padding-right: 10px;
+ }
+ }
+ }
+
+ footer {
+ border-top: $border_color 1px solid;
+ padding: 30px $horiz_pad 30px $horiz_pad;
+
+ div#paginator {
+ font-weight: bold;
+ font-size: $pagination_font_size;
+ text-transform: uppercase;
+ overflow: auto;
+ text-align: center;
+
+ div{
+ display: inline-block;
+ }
+
+ span {
+ width: $pag_label_size;
+ }
+
+ span#left {
+ float: left;
+ text-align: left;
+ }
+
+ span#right {
+ float: right;
+ text-align: right;
+ }
+ }
+ }
+
+ div#ending_message {
+ border-top: $border_color 1px solid;
+ padding: 0 $horiz_pad 0 $horiz_pad;
+ color: $med-grey;
+ font-size: $footer_font_size;
+ }
+}
+
+@media screen and (min-width: $min_screen) {
+ aside {
+ width: 25%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+
+ h2 {
+ margin: 10px 0 0 0;
+ }
+
+ div#user_meta {
+ max-width: 192px;
+ text-align: right;
+ margin: 0 20px 0 auto;
+ }
+ }
+
+ main {
+ position: absolute;
+ top: 0;
+ left: 25%;
+ width: 75%;
+ margin-left: -1px;
+ border-left: $border_color 1px solid;
+ overflow-x: hidden;
+ overflow-y: hidden;
+
+ header {
+ padding: 10px $horiz_pad 10px $horiz_pad;
+ border-top: 0;
+ text-align: left;
+ }
+
+ article {
+ width: $content_size;
+ margin: 0;
+ }
+
+ footer{
+ div#paginator {
+ width: $content_size;
+ }
+ }
+ }
+}
diff --git a/theme/static/js/email.js b/theme/static/js/email.js
new file mode 100644
index 0000000..90b736e
--- /dev/null
+++ b/theme/static/js/email.js
@@ -0,0 +1,21 @@
+// Unmangle email addresses on page load
+
+function unmangleEmail(){
+ var e = document.querySelectorAll(".email");
+ for (var i = 0; i < e.length; i++) {
+ var email = e[i].getAttribute("data-email")
+ var title = e[i].getAttribute("data-title")
+ if (email){
+ e[i].href = email.split("").reverse().join("");
+ e[i].removeAttribute("data-email");
+ e[i].removeAttribute("data-title");
+ e[i].removeAttribute("class");
+ if (title){
+ e[i].setAttribute("title", title);
+ }
+ else{
+ e[i].removeAttribute("title");
+ }
+ }
+ }
+}
diff --git a/theme/static/js/lw-timeago/README.md b/theme/static/js/lw-timeago/README.md
new file mode 100644
index 0000000..7d9a9eb
--- /dev/null
+++ b/theme/static/js/lw-timeago/README.md
@@ -0,0 +1,60 @@
+lw-timeago
+==========
+
+A lightweight implementation of the [Timeago jQuery plugin](http://timeago.yarp.com/), allowing fuzzy timestamps to be dynamically generated and displayed.
+
+Example
+-------
+
+#### Original
+```html
+<time datetime="2012-02-11T22:05:00-05:00">Feb 11, 2012</time>
+```
+
+#### Outputs
+```html
+<time title="Feb 11, 2012" datetime="2012-02-11T22:05:00-05:00">3 years ago</time>
+<time title="2/11/2012, 10:05:00 PM" datetime="2012-02-11T22:05:00-05:00">3 years ago on Feb 11, 2012</time>
+```
+
+Configuration
+-------------
+In the `config` section of the script there are a few options that can be configured.
+- `whitelist`: Only process `<time>` tags with this attribute. Setting it to `null` disables whitelisting (all `<time>` tags are processed).
+- `keepDate`: If `true`, don't replace the date in the `<time>` tags, prepend the fuzzy time to it (see the second example above).
+
+Additionally, the text can all be customized.
+
+Usage
+-----
+Step 2 can be skipped if `whitelist` is set to `null` in the config.
+
+1. Markup times in the HTML source with `<time>` tags, making sure they have a `datetime` attribute. The datetime attribute *MUST* be ISO 8601 formatted.
+2. For all `<time>` tags that should be converted to fuzzy times, add `data-timeago` attributes to them.
+3. Include the `lw-timeago.js` file in the html head (`<script src="lw-timeago.js" type="text/javascript"></script>`).
+4. Call the `lw_timeago()` function when the page loads (`<script type="text/javascript">window.addEventListener("load", lw_timeago);</script>`).
+
+License
+-------
+```
+Copyright (c) 2008-2015, Ryan McGeary
+Copyright (c) 2015 Carey Metcalfe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+```
diff --git a/theme/static/js/lw-timeago/lw-timeago.js b/theme/static/js/lw-timeago/lw-timeago.js
new file mode 100644
index 0000000..04a5c12
--- /dev/null
+++ b/theme/static/js/lw-timeago/lw-timeago.js
@@ -0,0 +1,91 @@
+var lw_timeago = function() {
+
+ var config = {
+ whitelist: "data-timeago", // Set to null to disable whitelisting
+
+ keepDate: true, // If true, appends the original date after the fuzzy one
+
+ suffixAgo: "ago",
+ suffixFromNow: "from now",
+ on: "on",
+
+ seconds: "less than a minute",
+ minute: "about a minute",
+ minutes: "%d minutes",
+ hour: "about an hour",
+ hours: "%d hours",
+ day: "about a day",
+ days: "%d days",
+ month: "about a month",
+ months: "%d months",
+ year: "about a year",
+ years: "%d years",
+ }
+
+ function inWords(distanceMillis) {
+ // Produce a string representing the milliseconds in a human-readable way
+
+ var suffix = distanceMillis < 0 ? config.suffixFromNow : config.suffixAgo;
+ var seconds = Math.abs(distanceMillis) / 1000;
+ var minutes = seconds / 60;
+ var hours = minutes / 60;
+ var days = hours / 24;
+ var years = days / 365;
+
+ function substitute(string, number) {
+ return string.replace(/%d/i, number);
+ }
+
+ var words =
+ seconds < 45 && substitute(config.seconds, Math.round(seconds)) ||
+ seconds < 90 && substitute(config.minute, 1) ||
+ minutes < 45 && substitute(config.minutes, Math.round(minutes)) ||
+ minutes < 90 && substitute(config.hour, 1) ||
+ hours < 24 && substitute(config.hours, Math.round(hours)) ||
+ hours < 42 && substitute(config.day, 1) ||
+ days < 30 && substitute(config.days, Math.round(days)) ||
+ days < 45 && substitute(config.month, 1) ||
+ days < 365 && substitute(config.months, Math.round(days / 30)) ||
+ years < 1.5 && substitute(config.year, 1) ||
+ substitute(config.years, Math.round(years));
+
+ return words + " " + suffix;
+ }
+
+ function diff(timestamp) {
+ // Get the number of milliseconds distance from the current time
+ return Date.now() - timestamp;
+ }
+
+ function doReplace(){
+ // Go over all <time> elements, grab the datetime attribute, then calculate
+ // and display a fuzzy representation of it.
+
+ var times = document.getElementsByTagName("time")
+ for (var i = 0; i < times.length; i++){
+
+ if (config.whitelist && !times[i].hasAttribute(config.whitelist))
+ break;
+
+ var datetime = times[i].getAttribute("datetime");
+ if (!datetime)
+ break;
+
+ var parsed = new Date(datetime);
+ if (!parsed)
+ break;
+
+ var words = inWords(diff(parsed.getTime()));
+ var title = times[i].innerHTML;
+ if (config.keepDate){
+ words += " " + config.on + " " + times[i].innerHTML;
+ title = parsed.toLocaleString()
+ }
+
+ times[i].title = title;
+ times[i].innerHTML = words;
+ }
+ }
+
+ return doReplace;
+}();
diff --git a/theme/static/js/scroll.js b/theme/static/js/scroll.js
new file mode 100644
index 0000000..6ec5f38
--- /dev/null
+++ b/theme/static/js/scroll.js
@@ -0,0 +1,8 @@
+// Scroll past header on smaller screens
+
+function skipHeader(){
+ if (window.location.pathname != '/' && window.location.pathname != '/index.html'){
+ window.scroll(0, document.getElementById('main').offsetTop);
+ }
+}
+