init
This commit is contained in:
commit
c828a45aa8
30 changed files with 1204 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
output/
|
||||
.claude/
|
||||
__pycache__/
|
||||
20
blue-penguin-dark/CONTRIBUTORS.md
Normal file
20
blue-penguin-dark/CONTRIBUTORS.md
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Contributors
|
||||
|
||||
* [Nevan Scott](https://github.com/nevanscott/Mockingbird) (original author)
|
||||
* [wrl](https://github.com/wrl/pelican-mockingbird) (port to pelican, pelican-mockingbird)
|
||||
* [Jody Frankowski](http://github.com/jody-frankowski) (Blue Penguin)
|
||||
* [Grimbox](https://github.com/Grimbox)
|
||||
* [ix5](https://github.com/ix5)
|
||||
* [dn0](https://github.com/dn0)
|
||||
* [anhtuann](https://github.com/anhtuann)
|
||||
* [aperep](https://github.com/aperep)
|
||||
* [iranzo](https://github.com/iranzo)
|
||||
* [thetlk](https://github.com/thetlk)
|
||||
* [SnorlaxYum](https://github.com/SnorlaxYum)
|
||||
* [guikcd](https://github.com/guikcd)
|
||||
* [jorgesumle](https://github.com/jorgesumle)
|
||||
* [crxxn](https://github.com/crxxn)
|
||||
* [gavinzbq](https://github.com/gavinzbq)
|
||||
* [sylvainmetayer](https://github.com/sylvainmetayer)
|
||||
* [wbob](https://github.com/wbob)
|
||||
* [Tyler Carr](https://github.com/tcarwash)
|
||||
24
blue-penguin-dark/LICENSE
Normal file
24
blue-penguin-dark/LICENSE
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
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 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.
|
||||
|
||||
For more information, please refer to <https://unlicense.org>
|
||||
70
blue-penguin-dark/README.md
Normal file
70
blue-penguin-dark/README.md
Normal file
|
|
@ -0,0 +1,70 @@
|
|||

|
||||
|
||||
# Blue Penguin Dark for pelican
|
||||
A simple dark theme for pelican, with light/dark mode support using media queries available. Solarized pygments. Feeds support.
|
||||
|
||||
This theme has been adapted from the original [Blue Penguin Theme](https://github.com/jody-frankowski/blue-penguin) for use on [my website](https://tyler-carr.com), all changes are generic and this theme can be used interchangeably with the original.
|
||||
|
||||
## Settings
|
||||
```python
|
||||
# all the following settings are *optional*
|
||||
|
||||
# Site Logo
|
||||
SITELOGO = ''
|
||||
|
||||
# HTML metadata
|
||||
SITEDESCRIPTION = ''
|
||||
|
||||
# all defaults to True.
|
||||
DISPLAY_HEADER = True
|
||||
DISPLAY_FOOTER = True
|
||||
DISPLAY_HOME = True
|
||||
DISPLAY_MENU = True
|
||||
DARK_LIGHT_SWITCHING_OFF = True
|
||||
|
||||
# provided as examples, they make ‘clean’ urls. used by MENU_INTERNAL_PAGES.
|
||||
TAGS_URL = 'tags'
|
||||
TAGS_SAVE_AS = 'tags/index.html'
|
||||
AUTHORS_URL = 'authors'
|
||||
AUTHORS_SAVE_AS = 'authors/index.html'
|
||||
CATEGORIES_URL = 'categories'
|
||||
CATEGORIES_SAVE_AS = 'categories/index.html'
|
||||
ARCHIVES_URL = 'archives'
|
||||
ARCHIVES_SAVE_AS = 'archives/index.html'
|
||||
|
||||
# use those if you want pelican standard pages to appear in your menu
|
||||
MENU_INTERNAL_PAGES = (
|
||||
('Tags', TAGS_URL, TAGS_SAVE_AS),
|
||||
('Authors', AUTHORS_URL, AUTHORS_SAVE_AS),
|
||||
('Categories', CATEGORIES_URL, CATEGORIES_SAVE_AS),
|
||||
('Archives', ARCHIVES_URL, ARCHIVES_SAVE_AS),
|
||||
)
|
||||
# additional menu items
|
||||
MENUITEMS = (
|
||||
('GitHub', 'https://github.com/'),
|
||||
('Linux Kernel', 'https://www.kernel.org/'),
|
||||
)
|
||||
|
||||
# example pagination pattern
|
||||
PAGINATION_PATTERNS = (
|
||||
(1, '{url}', '{save_as}'),
|
||||
(2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'),
|
||||
)
|
||||
|
||||
```
|
||||
|
||||
Dark/Light switching is disabled by default, but can be enabled in the config file by adding:
|
||||
|
||||
```
|
||||
DARK_LIGHT_SWITCHING_OFF = FALSE
|
||||
```
|
||||
|
||||
|
||||
## How to contribute
|
||||
Contributions are very welcome. Keep in mind that this theme goal is to be
|
||||
minimalistic/simple. Contributions will be accepted through Github Pull
|
||||
Requests. If you don’t have a Github account you can suggest me your
|
||||
changes by email.
|
||||
|
||||
## Contributors
|
||||
See [CONTRIBUTORS.md](CONTRIBUTORS.md).
|
||||
13
blue-penguin-dark/sample/content/code.md
Normal file
13
blue-penguin-dark/sample/content/code.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
Title: Solarized Pygments
|
||||
Date: 2022-6-28 12:00
|
||||
Category: Python
|
||||
Tags: pelican, publishing
|
||||
Authors: Alexis Metaireau, Conan Doyle
|
||||
Summary: Short version for index and feeds
|
||||
|
||||
```
|
||||
#!/usr/bin/python3
|
||||
|
||||
while True:
|
||||
print("Pelican is neat!")
|
||||
```
|
||||
8
blue-penguin-dark/sample/content/post.md
Normal file
8
blue-penguin-dark/sample/content/post.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
Title: Blue Penguin Dark
|
||||
Date: 2022-6-28 13:00
|
||||
Category: Python
|
||||
Tags: pelican, publishing
|
||||
Authors: Alexis Metaireau, Conan Doyle
|
||||
Summary: Short version for index and feeds
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
22
blue-penguin-dark/sample/settings.py
Normal file
22
blue-penguin-dark/sample/settings.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
|
||||
AUTHOR = 'Tyler Carr'
|
||||
SITENAME = 'Blue Penguin Dark'
|
||||
SITEURL = 'http://localhost:8000'
|
||||
SITELOGO = 'https://www.gravatar.com/avatar/de3ba847c89c8cab9dd7080abebf9df1'
|
||||
DEFAULT_METADATE = {
|
||||
'status': 'draft',
|
||||
}
|
||||
|
||||
|
||||
PATH = 'content'
|
||||
|
||||
TIMEZONE = 'America/Los_Angeles'
|
||||
|
||||
DEFAULT_LANG = 'en'
|
||||
|
||||
|
||||
MENUITEMS = (
|
||||
('About', '/'),
|
||||
)
|
||||
465
blue-penguin-dark/static/css/main.css
Normal file
465
blue-penguin-dark/static/css/main.css
Normal file
|
|
@ -0,0 +1,465 @@
|
|||
@import url('https://fonts.cdnfonts.com/css/bitwise');
|
||||
|
||||
/* http://meyerweb.com/eric/tools/css/reset/
|
||||
v2.0 | 20110126
|
||||
License: none (public domain)
|
||||
*/
|
||||
/* Mockingbird Theme by Nevan Scott nevanscott.com */
|
||||
/* Modified by Jody Frankowski */
|
||||
/* Modified by ix5 */
|
||||
/* Modified by Tyler Carr */
|
||||
|
||||
:root {
|
||||
/* Catppuccin Mocha */
|
||||
--main-bg-color: #1e1e2e; /* Base */
|
||||
--code-bg-color: #181825; /* Mantle */
|
||||
--accent-color: #94e2d5; /* Teal */
|
||||
--tab-bg-hover: var(--code-bg-color);
|
||||
--info-bg-color: #313244; /* Surface0 */
|
||||
}
|
||||
|
||||
|
||||
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, svg, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
color: #cdd6f4; /* Mocha Text */
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
em {
|
||||
font-style: italic;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
background-color: var(--main-bg-color);
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Georgia, serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
header, #wrapper {
|
||||
padding: 0 10px;
|
||||
max-width: 910px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #94e2d5; /* Mocha Teal */
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: outside disc;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style: outside decimal;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
dd > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
h1, h2, h3 {
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
img, svg, p, .post > .highlight, .highlighttable, h4, h5, h6, dl {
|
||||
margin-top: 1.2em;
|
||||
}
|
||||
img + em {
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 1.5em 1.5em 1.5em .75em;
|
||||
padding-left: .75em;
|
||||
border-left: 1px solid #45475a; /* Mocha Surface1 */
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
margin: 1em 0;
|
||||
}
|
||||
thead {
|
||||
border-bottom: 1px solid #45475a; /* Mocha Surface1 */
|
||||
}
|
||||
|
||||
.avatar {
|
||||
border-radius: 50%;
|
||||
-mox-border-radius: 50%;
|
||||
-webkit-border-radius: 50%;
|
||||
position: relative;
|
||||
bottom: 0;
|
||||
top: 0;
|
||||
margin: auto;
|
||||
display: inline;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #bac2de; /* Mocha Subtext1 */
|
||||
float: left;
|
||||
clear: both;
|
||||
width: 130px;
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
margin: 0 20px 1em 0;
|
||||
}
|
||||
|
||||
.info {
|
||||
margin-top: 1.3em;
|
||||
font-family: sans-serif;
|
||||
text-align: right;
|
||||
color: #cdd6f4; /* Mocha Text */
|
||||
}
|
||||
.info a {
|
||||
color: inherit;
|
||||
}
|
||||
.info a.tags {
|
||||
background: var(--info-bg-color);
|
||||
color: #FFF;
|
||||
display: inline-block;
|
||||
padding: 0 .3em;
|
||||
border: 1px transparent solid;
|
||||
border-radius: 5px;
|
||||
margin: 0 0 0.3em 0;
|
||||
}
|
||||
.info a.tags:hover {
|
||||
background: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
.info a.tags.selected {
|
||||
border: 1px #6c7086 solid; /* Mocha Overlay0 */
|
||||
}
|
||||
|
||||
.post {
|
||||
margin: 0 0 4.5em 150px;
|
||||
}
|
||||
.post.archives {
|
||||
margin-bottom: 1.5em;
|
||||
margin-left: 160px;
|
||||
}
|
||||
.post p {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.page {
|
||||
margin: 0 90px;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
border-radius: 3px;
|
||||
}
|
||||
.code > .highlight {
|
||||
border-radius: 0px 3px 3px 0px;
|
||||
background-color: var(--code-bg-color);
|
||||
}
|
||||
.linenos {
|
||||
border-radius: 3px 0px 0px 3px;
|
||||
background-color: var(--code-bg-color);
|
||||
border-right: 1px solid #11111b; /* Mocha Crust */
|
||||
color: #6c7086; /* Mocha Overlay0 */
|
||||
text-shadow: 0px -1px #11111b; /* Mocha Crust */
|
||||
font-size: 12.6px;
|
||||
}
|
||||
td.code {
|
||||
width: 100%;
|
||||
max-width: 100px;
|
||||
}
|
||||
.linenos a {
|
||||
color: #6c7086; /* Mocha Overlay0 */
|
||||
}
|
||||
|
||||
img, svg {
|
||||
box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.15);
|
||||
border-radius: 0.3em;
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/*sub and sup stolen from Twitter bootstrap.*/
|
||||
sub, sup {
|
||||
position: relative;
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
.post pre, .page pre {
|
||||
padding: .8em;
|
||||
font-size: 12.6px;
|
||||
font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
|
||||
line-height: 18px;
|
||||
overflow: auto;
|
||||
background-color: var(--code-bg-color);
|
||||
}
|
||||
|
||||
form.inline_edit {
|
||||
clear: both;
|
||||
margin: 4.5em 0;
|
||||
background-color: #313244; /* Mocha Surface0 */
|
||||
color: #cdd6f4; /* Mocha Text */
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.inline_edit .sub {
|
||||
color: #6c7086; /* Mocha Overlay0 */
|
||||
white-space: nowrap;
|
||||
}
|
||||
.inline_edit label {
|
||||
float: left;
|
||||
clear: both;
|
||||
width: 140px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
.inline_edit .buttons {
|
||||
display: block;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
float: right;
|
||||
list-style: none;
|
||||
margin: 0 0 0 3em;
|
||||
padding: 0;
|
||||
}
|
||||
nav li {
|
||||
float: left;
|
||||
}
|
||||
nav a {
|
||||
display: block;
|
||||
padding: 4.5em 10px 10px 10px;
|
||||
}
|
||||
nav a:hover {
|
||||
background-color: var(--tab-bg-hover);
|
||||
color: var(--accent-color);
|
||||
}
|
||||
nav li.selected a {
|
||||
background-color: #94e2d5; /* Mocha Teal */
|
||||
color: #1e1e2e; /* Mocha Base */
|
||||
}
|
||||
|
||||
header .header_box {
|
||||
/* padding-top: 4.5em; */
|
||||
|
||||
}
|
||||
.site_title {
|
||||
position: relative;
|
||||
bottom: 15px;
|
||||
color: #94e2d5; /* Mocha Teal */
|
||||
font-family: 'Bitwise', monospace;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
margin: 0;
|
||||
}
|
||||
header h2 {
|
||||
font-size: 1em;
|
||||
margin: .3em 0;
|
||||
color: #a6adc8; /* Mocha Subtext0 */
|
||||
}
|
||||
|
||||
#content {
|
||||
margin-top: 3em;
|
||||
}
|
||||
|
||||
.pages {
|
||||
font-family: sans-serif;
|
||||
line-height: 2.5em;
|
||||
margin: 4.5em 0 3em;
|
||||
background-color: #313244; /* Mocha Surface0 */
|
||||
border-radius: 5px;
|
||||
}
|
||||
.pages a.next_page {
|
||||
float: right;
|
||||
width: 140px;
|
||||
text-align: center;
|
||||
border-top-right-radius: 5px;
|
||||
border-bottom-right-radius: 5px;
|
||||
background-color: #45475a; /* Mocha Surface1 */
|
||||
}
|
||||
.pages a.prev_page {
|
||||
float: left;
|
||||
width: 140px;
|
||||
text-align: center;
|
||||
border-top-left-radius: 5px;
|
||||
border-bottom-left-radius: 5px;
|
||||
background-color: #45475a; /* Mocha Surface1 */
|
||||
}
|
||||
.pages a {
|
||||
color: inherit;
|
||||
border: none;
|
||||
}
|
||||
.pages a:hover {
|
||||
background-color: #585b70; /* Mocha Surface2 */
|
||||
}
|
||||
.pages span {
|
||||
display: block;
|
||||
margin: 0 160px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
code {
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
box-sizing: border-box;
|
||||
background-color: #181825; /* Mocha Mantle */
|
||||
color: #89dceb; /* Mocha Sky */
|
||||
font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
|
||||
font-size: 12.6px;
|
||||
line-height: 18px;
|
||||
padding-bottom: 2px;
|
||||
padding-left: 0px;
|
||||
padding-right: 4px;
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-family: sans-serif;
|
||||
line-height: 2.5em;
|
||||
text-align: center;
|
||||
color: #cdd6f4; /* Mocha Text */
|
||||
margin: 3em 0;
|
||||
border: 1px solid #45475a; /* Mocha Surface1 */
|
||||
border-radius: 5px;
|
||||
}
|
||||
footer p { margin: 0; }
|
||||
|
||||
.right { float: right; }
|
||||
|
||||
.clear { clear: both; }
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
#wrapper {
|
||||
margin-left: 2.6em;
|
||||
padding:1em;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 800px), print {
|
||||
#wrapper {
|
||||
margin: 0;
|
||||
padding: 1em;
|
||||
}
|
||||
.date {
|
||||
width: 100%;
|
||||
margin: 0 0 .5em 0;
|
||||
}
|
||||
.post {
|
||||
margin: 0 0 4.5em 0;
|
||||
}
|
||||
.post pre,
|
||||
.post code {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.archives {
|
||||
margin: 0 0 1.5em 0 !important;
|
||||
}
|
||||
nav ul {
|
||||
margin: 0 0 1em 0;
|
||||
}
|
||||
}
|
||||
@media print {
|
||||
* {
|
||||
background: #fff;
|
||||
}
|
||||
#wrapper, #content {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
header, footer, nav {
|
||||
display: none;
|
||||
}
|
||||
img, svg {
|
||||
break-inside: avoid;
|
||||
}
|
||||
p, table, pre {
|
||||
widows: 3;
|
||||
orphans: 3;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
break-after: avoid;
|
||||
}
|
||||
h1, h2 {
|
||||
font-size: 14pt;
|
||||
}
|
||||
h3, h4, h4.date {
|
||||
font-size: 12pt;
|
||||
}
|
||||
.post p, .post ul li, .post ol li, .post table {
|
||||
font-size: 11pt;
|
||||
}
|
||||
}
|
||||
@page {
|
||||
margin: 1.5cm;
|
||||
}
|
||||
87
blue-penguin-dark/static/css/pygments.css
Normal file
87
blue-penguin-dark/static/css/pygments.css
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/* Solarized Dark
|
||||
|
||||
For use with Jekyll and Pygments
|
||||
|
||||
http://ethanschoonover.com/solarized
|
||||
|
||||
SOLARIZED HEX ROLE
|
||||
--------- -------- ------------------------------------------
|
||||
base03 #002b36 background
|
||||
base01 #586e75 comments / secondary content
|
||||
base1 #93a1a1 body text / default code / primary content
|
||||
orange #cb4b16 constants
|
||||
red #dc322f regex, special keywords
|
||||
blue #268bd2 reserved keywords
|
||||
cyan #2aa198 strings, numbers
|
||||
green #859900 operators, other keywords
|
||||
*/
|
||||
|
||||
.highlight { color: #93a1a1; background-color: #17202a;}
|
||||
.highlight .c { color: #586e75 } /* Comment */
|
||||
.highlight .err { color: #93a1a1 } /* Error */
|
||||
.highlight .g { color: #93a1a1 } /* Generic */
|
||||
.highlight .k { color: #859900 } /* Keyword */
|
||||
.highlight .l { color: #93a1a1 } /* Literal */
|
||||
.highlight .n { color: #93a1a1 } /* Name */
|
||||
.highlight .o { color: #859900 } /* Operator */
|
||||
.highlight .x { color: #cb4b16 } /* Other */
|
||||
.highlight .p { color: #93a1a1 } /* Punctuation */
|
||||
.highlight .cm { color: #586e75 } /* Comment.Multiline */
|
||||
.highlight .cp { color: #859900 } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #586e75 } /* Comment.Single */
|
||||
.highlight .cs { color: #859900 } /* Comment.Special */
|
||||
.highlight .gd { color: #2aa198 } /* Generic.Deleted */
|
||||
.highlight .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #dc322f } /* Generic.Error */
|
||||
.highlight .gh { color: #cb4b16 } /* Generic.Heading */
|
||||
.highlight .gi { color: #859900 } /* Generic.Inserted */
|
||||
.highlight .go { color: #93a1a1 } /* Generic.Output */
|
||||
.highlight .gp { color: #93a1a1 } /* Generic.Prompt */
|
||||
.highlight .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #cb4b16 } /* Generic.Subheading */
|
||||
.highlight .gt { color: #93a1a1 } /* Generic.Traceback */
|
||||
.highlight .kc { color: #cb4b16 } /* Keyword.Constant */
|
||||
.highlight .kd { color: #268bd2 } /* Keyword.Declaration */
|
||||
.highlight .kn { color: #859900 } /* Keyword.Namespace */
|
||||
.highlight .kp { color: #859900 } /* Keyword.Pseudo */
|
||||
.highlight .kr { color: #268bd2 } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #dc322f } /* Keyword.Type */
|
||||
.highlight .ld { color: #93a1a1 } /* Literal.Date */
|
||||
.highlight .m { color: #2aa198 } /* Literal.Number */
|
||||
.highlight .s { color: #2aa198 } /* Literal.String */
|
||||
.highlight .na { color: #93a1a1 } /* Name.Attribute */
|
||||
.highlight .nb { color: #B58900 } /* Name.Builtin */
|
||||
.highlight .nc { color: #268bd2 } /* Name.Class */
|
||||
.highlight .no { color: #cb4b16 } /* Name.Constant */
|
||||
.highlight .nd { color: #268bd2 } /* Name.Decorator */
|
||||
.highlight .ni { color: #cb4b16 } /* Name.Entity */
|
||||
.highlight .ne { color: #cb4b16 } /* Name.Exception */
|
||||
.highlight .nf { color: #268bd2 } /* Name.Function */
|
||||
.highlight .nl { color: #93a1a1 } /* Name.Label */
|
||||
.highlight .nn { color: #93a1a1 } /* Name.Namespace */
|
||||
.highlight .nx { color: #93a1a1 } /* Name.Other */
|
||||
.highlight .py { color: #93a1a1 } /* Name.Property */
|
||||
.highlight .nt { color: #268bd2 } /* Name.Tag */
|
||||
.highlight .nv { color: #268bd2 } /* Name.Variable */
|
||||
.highlight .ow { color: #859900 } /* Operator.Word */
|
||||
.highlight .w { color: #93a1a1 } /* Text.Whitespace */
|
||||
.highlight .mf { color: #2aa198 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #2aa198 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #2aa198 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #2aa198 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #586e75 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #2aa198 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #93a1a1 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #2aa198 } /* Literal.String.Double */
|
||||
.highlight .se { color: #cb4b16 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #93a1a1 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #2aa198 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #2aa198 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #dc322f } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #2aa198 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #2aa198 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #268bd2 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #268bd2 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #268bd2 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #268bd2 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #2aa198 } /* Literal.Number.Integer.Long */
|
||||
11
blue-penguin-dark/templates/analytics.html
Normal file
11
blue-penguin-dark/templates/analytics.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{% if GOOGLE_ANALYTICS %}
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-74711B8E5H"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', '{{GOOGLE_ANALYTICS}}');
|
||||
</script>
|
||||
{% endif %}
|
||||
22
blue-penguin-dark/templates/archives.html
Normal file
22
blue-penguin-dark/templates/archives.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | Archives{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>Archives</h1>
|
||||
|
||||
{# based on http://stackoverflow.com/questions/12764291/jinja2-group-by-month-year #}
|
||||
|
||||
{% for year, year_group in dates|groupby('date.year')|reverse %}
|
||||
{% for month, month_group in year_group|groupby('date.month')|reverse %}
|
||||
<h4 class="date">{{ (month_group|first).date|strftime('%b %Y') }}</h4>
|
||||
<div class="post archives">
|
||||
<ul>
|
||||
{% for article in month_group %}
|
||||
<li><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
17
blue-penguin-dark/templates/article.html
Normal file
17
blue-penguin-dark/templates/article.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
{% if article.tags %}
|
||||
<meta name="keywords" content="{{ article.tags|join(",") }}" />
|
||||
{% endif %}
|
||||
{% if article.description %}
|
||||
<meta name="description" content="{{ article.description }}" />
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | {{ article.title|striptags }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% include "article_stub.html" %}
|
||||
{% endblock %}
|
||||
46
blue-penguin-dark/templates/article_stub.html
Normal file
46
blue-penguin-dark/templates/article_stub.html
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
{% if not articles_page or first_article_of_day %}
|
||||
<h4 class="date">{{ article.era }}</h4>
|
||||
{% endif %}
|
||||
|
||||
<article class="post">
|
||||
{% if article.title %}
|
||||
<h2 class="title">
|
||||
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permanent Link to "{{ article.title|striptags }}"">{{ article.title }}</a>
|
||||
</h2>
|
||||
{% endif %}
|
||||
|
||||
{% if not articles_page %}
|
||||
{% include "translations.html" %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if articles_page %}
|
||||
{% if '<!-- more -->' in article.content %}
|
||||
{{ article.content.split('<!-- more -->')[0] }}
|
||||
<p><a href="{{ SITEURL }}/{{ article.url }}">{{ article.read_more if article.read_more is defined else 'Read more →' }}</a></p>
|
||||
{% else %}
|
||||
{{ article.summary }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{ article.content }}
|
||||
{% endif %}
|
||||
<div class="clear"></div>
|
||||
|
||||
<div class="info">
|
||||
<a href="{{ SITEURL }}/{{ article.url }}">posted on {{ article.date.strftime("%b %d, %Y") }}</a>
|
||||
{% if article.category.name != "misc" %}
|
||||
· <a href="{{ SITEURL }}/{{ article.category.url }}" rel="tag">{{ article.category }}</a>
|
||||
{% endif %}
|
||||
{% if article.tags %}
|
||||
·
|
||||
{% for t in article.tags %}
|
||||
<a href="{{ SITEURL }}/{{ t.url }}" class="tags{% if tag and tag.name == t.name %} selected{% endif %}">{{ t }}</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if articles_page and DISQUS_SITENAME %}
|
||||
<a href="{{ SITEURL }}/{{ article.url }}#disqus_thread">Click to read and post comments</a>
|
||||
{% else %}
|
||||
{% include "disqus.html" %}
|
||||
{% endif %}
|
||||
</article>
|
||||
7
blue-penguin-dark/templates/author.html
Normal file
7
blue-penguin-dark/templates/author.html
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{% extends "index.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | Articles by {{ author }}{% endblock %}
|
||||
{% block ephemeral_nav %}
|
||||
|
||||
{{ ephemeral_nav_link(author, output_file, True) }}
|
||||
{% endblock %}
|
||||
119
blue-penguin-dark/templates/base.html
Normal file
119
blue-penguin-dark/templates/base.html
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
{% macro ephemeral_nav_link(what, where, selected=False) -%}
|
||||
<li class="ephemeral{% if selected %} selected{% endif %}"><a href="{{ SITEURL }}/{{ where }}">{{what}}</a></li>
|
||||
{%- endmacro -%}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ DEFAULT_LANG }}">
|
||||
<head>
|
||||
{% block head %}
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>{% block title %}{{ SITENAME }}{% endblock title %}</title>
|
||||
{# favicon #}
|
||||
<link rel="shortcut icon" type="image/png" href="{{ SITEURL }}/favicon.png">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="{{ SITEURL }}/favicon.ico">
|
||||
{% if FEED_ALL_ATOM %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Full Atom Feed" />
|
||||
{% endif %}
|
||||
{% if FEED_ALL_RSS %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Full RSS Feed" />
|
||||
{% endif %}
|
||||
{% if FEED_ATOM %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_ATOM }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
|
||||
{% endif %}
|
||||
{% if FEED_RSS %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_RSS }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
|
||||
{% endif %}
|
||||
{% if CATEGORY_FEED_ATOM and category %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_ATOM.format(slug=category.slug) }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Categories Atom Feed" />
|
||||
{% endif %}
|
||||
{% if CATEGORY_FEED_RSS and category %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_RSS.format(slug=category.slug) }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Categories RSS Feed" />
|
||||
{% endif %}
|
||||
{% if TAG_FEED_ATOM and tag %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_ATOM.format(slug=tag.slug) }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Tags Atom Feed" />
|
||||
{% endif %}
|
||||
{% if TAG_FEED_RSS and tag %}
|
||||
<link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_RSS.format(slug=tag.slug) }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Tags RSS Feed" />
|
||||
{% endif %}
|
||||
<link rel="stylesheet" href="{{ SITEURL }}/theme/css/main.css" type="text/css" />
|
||||
<link rel="stylesheet" href="{{ SITEURL }}/theme/css/pygments.css" type="text/css" />
|
||||
{% if DARK_LIGHT_SWITCHING_OFF == False %}
|
||||
<style>
|
||||
@media (prefers-color-scheme: light) {
|
||||
/* Catppuccin Latte */
|
||||
:root {
|
||||
--main-bg-color: #eff1f5; /* Latte Base */
|
||||
--accent-color: #8839ef; /* Latte Mauve */
|
||||
--tab-bg-hover: #ccd0da; /* Latte Surface0 */
|
||||
--info-bg-color: #bcc0cc; /* Latte Surface1 */
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endif %}
|
||||
<meta name="generator" content="Pelican" />
|
||||
<meta name="description" content="{{ SITEDESCRIPTION }}" />
|
||||
<meta name="author" content="{{ AUTHOR }}" />
|
||||
{% include 'analytics.html' %}
|
||||
{% endblock head %}
|
||||
</head>
|
||||
<body>
|
||||
{% if DISPLAY_HEADER or DISPLAY_HEADER is not defined %}
|
||||
<header>
|
||||
{% if DISPLAY_MENU or DISPLAY_MENU is not defined %}
|
||||
<nav style="overflow: hidden;">
|
||||
<ul>
|
||||
{% block ephemeral_nav %}{% endblock %}
|
||||
{% if DISPLAY_HOME or DISPLAY_HOME is not defined %}
|
||||
<li{% if output_file == "index.html" %} class="selected"{% endif %}><a href="{{ SITEURL }}/">Home</a></li>
|
||||
{% endif %}
|
||||
{% if DISPLAY_PAGES_ON_MENU %}
|
||||
{% for p in pages %}
|
||||
<li{% if p == page %} class="selected"{% endif %}><a href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% for title, link in MENUITEMS %}
|
||||
<li><a href="{{ link }}">{{ title }}</a></li>
|
||||
{% endfor %}
|
||||
{% for name, link, file in MENU_INTERNAL_PAGES %}
|
||||
<li{% if output_file == file %} class="selected"{% endif %}><a href="{{ SITEURL }}/{{ link }}">{{ name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
<div class="header_box" style="height: 50px">
|
||||
<h1><a href="{{ SITEURL }}/">
|
||||
<image src='{{ SITELOGO }}' class="avatar" width="50px" /><span class="site_title">{{ SITENAME }}</span>
|
||||
</a></h1></div>
|
||||
{% if SITE_SUBTITLE %}
|
||||
<h2>{{ SITE_SUBTITLE }}</h2>
|
||||
{% endif %}
|
||||
</div>
|
||||
</header>
|
||||
{% endif %}
|
||||
<div id="wrapper">
|
||||
<div id="content">
|
||||
{%- block content -%}{%- endblock %}
|
||||
|
||||
{% if DISPLAY_FOOTER or DISPLAY_FOOTER is not defined %}
|
||||
<div class="clear"></div>
|
||||
<footer>
|
||||
<p>
|
||||
<a href="https://github.com/tcarwash/blue-penguin-dark">Blue Penguin Dark</a> Theme
|
||||
·
|
||||
Powered by <a href="http://getpelican.com">Pelican</a>
|
||||
{% if FEED_ALL_ATOM %}
|
||||
·
|
||||
<a href="{{ SITEURL }}/{{ FEED_ALL_ATOM }}" rel="alternate">Atom Feed</a>
|
||||
{% endif %}
|
||||
{% if FEED_ALL_RSS %}
|
||||
·
|
||||
<a href="{{ SITEURL }}/{{ FEED_ALL_RSS }}" rel="alternate">Rss Feed</a>
|
||||
{% endif %}
|
||||
</footer>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
6
blue-penguin-dark/templates/category.html
Normal file
6
blue-penguin-dark/templates/category.html
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} | articles in the "{{ category }}" category{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %}
|
||||
{% block ephemeral_nav %}
|
||||
|
||||
{{ ephemeral_nav_link(category, output_file, True) }}
|
||||
{% endblock %}
|
||||
12
blue-penguin-dark/templates/disqus.html
Normal file
12
blue-penguin-dark/templates/disqus.html
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{% if DISQUS_SITENAME %}
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
var disqus_shortname = '{{ DISQUS_SITENAME }}';
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
|
||||
{% endif %}
|
||||
17
blue-penguin-dark/templates/index.html
Normal file
17
blue-penguin-dark/templates/index.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }}{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %}
|
||||
{% block content %}
|
||||
{% set date = None %}
|
||||
{% for article in articles_page.object_list %}
|
||||
{% if date != article.date.date() %}
|
||||
{% set first_article_of_day = True %}
|
||||
{% else %}
|
||||
{% set first_article_of_day = False %}
|
||||
{% endif %}
|
||||
{% set date = article.date.date() %}
|
||||
{% include "article_stub.html" %}
|
||||
{% endfor %}
|
||||
|
||||
{% include "pagination.html" %}
|
||||
{% endblock %}
|
||||
11
blue-penguin-dark/templates/page.html
Normal file
11
blue-penguin-dark/templates/page.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | {{ page.title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<article class="post">
|
||||
<h2 class="title">{{ page.title }}</h2>
|
||||
{{ page.content }}
|
||||
</article>
|
||||
{% endblock %}
|
||||
17
blue-penguin-dark/templates/pagination.html
Normal file
17
blue-penguin-dark/templates/pagination.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{# Use PAGINATION_PATTERNS or pagination may break #}
|
||||
{% if DEFAULT_PAGINATION and (articles_page.has_previous() or articles_page.has_next()) %}
|
||||
|
||||
<div class="clear"></div>
|
||||
<div class="pages">
|
||||
|
||||
{% if articles_page.has_previous() %}
|
||||
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}" class="prev_page">← Previous</a>
|
||||
{% endif %}
|
||||
|
||||
{% if articles_page.has_next() %}
|
||||
<a href="{{ SITEURL }}/{{ articles_next_page.url }}" class="next_page">Next →</a>
|
||||
{% endif %}
|
||||
|
||||
<span>Page {{ articles_page.number }} of {{ articles_paginator.num_pages }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
5
blue-penguin-dark/templates/tag.html
Normal file
5
blue-penguin-dark/templates/tag.html
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} | articles tagged "{{ tag }}"{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %}
|
||||
{% block ephemeral_nav %}
|
||||
{{ ephemeral_nav_link(tag, output_file, True) }}
|
||||
{% endblock %}
|
||||
8
blue-penguin-dark/templates/tags.html
Normal file
8
blue-penguin-dark/templates/tags.html
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for tag, articles in tags %}
|
||||
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
6
blue-penguin-dark/templates/translations.html
Normal file
6
blue-penguin-dark/templates/translations.html
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{% if article.translations %}
|
||||
Translations:
|
||||
{% for translation in article.translations %}
|
||||
<a href="{{ SITEURL }}/{{ translation.url }}">{{ translation.lang }}</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
16
content/20260516_dune.md
Normal file
16
content/20260516_dune.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
title: Overcome
|
||||
date: 2026-05-16 21:00
|
||||
author: T. F.
|
||||
tags: beach, walkman, music, melancholia, fuerteventura
|
||||
slug: overcome
|
||||
era: 1997/98
|
||||
location: 28.094147518771056, -14.278849105269098
|
||||
read_more: Zone out →
|
||||
|
||||
I clambered up the dune, the hardened surface layer crumbling underfoot and slowly sloughing downhill in cascades of warm desert sand. At the top, I followed a narrow sandy path between patches of sharp black volcanic cinders and dried thorny scrub until I reached my favourite spot right at the edge of the pitch-black lava cliff that contrasted so sharply with the white sand below.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
From up there, I could see my parents and sister at the foot of the bluff, stretched out on their beach sheet, basking in the sun, absorbed in their reading. As always, the whole scene looked almost unreal: the bright blue sky, the turquoise Atlantic stretching endlessly to the horizon, and below, the endless white beach set in stark contrast against the black volcanic landscape. God, how I have always loved this place.
|
||||
|
||||
I hit play on my Walkman and let the low-slung trip-hop beat of [Tricky’s "Overcome"](https://www.youtube.com/watch?v=J_r2HZqw06E) lumber into my consciousness, its ghostly string loop drenching me in seductive melancholia. Steeped in indefinable teenage emotions, I took in the whole moment, my mind gently drifting in that liminal space between all the childhood memories tied to this place, the beauty of the here and now, and the endless possibilities of what was still to come. It felt like a timeless moment, both eternal and already slipping away, as if some part of me understood that even something which had once seemed infinite could come to an end: the age of blissful childhood holidays with the family.
|
||||
16
content/20260516_flotsam.md
Normal file
16
content/20260516_flotsam.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
title: Flotsam
|
||||
date: 2026-05-16 22:46
|
||||
author: T. F.
|
||||
tags: beach, treasure, fuerteventura
|
||||
slug: flotsam
|
||||
era: 1990/91
|
||||
location: 28.213833449836425, -14.224199803299483
|
||||
read_more: Find more →
|
||||
|
||||
I focused on scanning the boundary between the warm, anthracite-colored dry sand and the pitch-black wet sand, where seagrass, sticks, plant debris, bird feathers, frayed pieces of rope, and plastic objects of every shape and color formed a meandering line along the beach. I enjoyed finding all kinds of treasures: oddly shaped driftwood or curious objects of unknown origin, always hoping to find a message in a bottle or real pirate loot. The surf here on the west coast of the island was raging loudly and sometimes waves would lap around my feet. I remembered to watch out for the black lumps of washed-up tar that looked like smooth pebbles, because stepping on one barefoot was a nasty surprise.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
Mom, dad an my sister were still behind, running playfully along the black beach of this empty and forsaken coast that reminded me of pirate books or the shoreline from the Goonies movie. I looked up ahead where the bay gave way to a towering, jagged black cliff, with massive volcanic rock outcrops jutting from the sand and the sea, battered by the incoming waves. Next to one of the large rocks on the beach I spotted something strange. It was a large object, definitely bigger then me, and although as black as the surrounding lava rock it looked artificial. Excited I started running towards it.
|
||||
|
||||
The closer I got the more details emerged. It seemed to be a large metallic sphere. What on earth could it be? I shouted over the noise of the waves, frantically gesturing for my parents to hurry and pointing toward the mysterious object. I was a bit scared but my curiosity was stronger. As I approached the thing I could see that it was broken. A gaping hole in one side revealed the orb's hollow interior. Strange protrusions covered its outer shell making it look like some giant sea urchin. I heard my dad shouting for me to be careful and not touch it. The shere was encrusted with barnacles, shells, and strands of seagrass and I thought it looked unbelievably cool. Then I realized I had seen something like it in one of my books about ships and submarines. It had to be one of those old naval contact mines from the war. Definitely the coolest beach treasure I had ever found but unfortunately not one I could take home.
|
||||
26
content/20260516_fm_surfing.md
Normal file
26
content/20260516_fm_surfing.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
title: Freq Surfing
|
||||
date: 2026-05-16 16:00
|
||||
author: T. F.
|
||||
tags: radio, mystery, sci-fi, music
|
||||
slug: freq-surfing
|
||||
era: 1989-96
|
||||
location: 49.3827205081448, 8.69198937287534
|
||||
read_more: Tune in →
|
||||
|
||||
Early bedtime was not a problem for me. At least not on Sundays and Mondays. I was looking forward to indulging in my secret evening pastime: surfing the radio waves. The white plastic clock radio right next to my bed had a mono jack, so only the blue in-ear piece of my GameBoy headphones worked but it seemed like a practical feature because it allowed me to hear when parents would potentially come upstairs to bust me.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
On Sundays I usually enjoyed the last minutes of the SWF3 Top 20 music charts and as a consequence a lot of the pop hits from that time have been burnt into my core memory. Then at 9pm sharp the news came on, which I usually followed with curiosity despite not understanding much of the complex world of grown-ups. But it was through that little radio that I lived through the weeks leading up to the fall of the Berlin Wall and the slow collapse of the Eastern Bloc. Once the weather gave way to the traffic report, I knew it was time to turn the tuner dial.
|
||||
|
||||
Each Sunday and Monday after the news, I tuned in to SWF1 for the part of the evening I looked forward to most: the radio drama. I recall countless evenings in my bed listening to suspenseful nail-biters, from detective stories, murder mysteries to science fiction tales. The sci-fi nights were my favorites! The intro music was already so terrifying I could barely listen to it.
|
||||
|
||||
My vivid imagination turned those radio plays into thrillers far more vivid and intense than TV shows could ever depict (not that I would have been allowed to watch those anyway). Many of the plots and scenes stayed with me for weeks, sometimes years, and even today I still find myself researching the titles of stories I remember from my radio days. My favourite voice actor was, and still is, Christian Brückner, the German dubbing voice of Robert De Niro, Robert Redford, Dennis Hopper, and others, who lent his intimate, smoky, weathered baritone to many of my favourite detective characters.
|
||||
|
||||
Through the sci-fi dramas I encountered authors I would cherish years later when I read their books, such as Stanislaw Lem or Isaac Asimov, and while I mostly enjoyed the otherworldly adventures, some of the darker stories absolutely terrified me. One especially troubling one revolved around a group of criminals sabotaging self-driving cars in a futuristic city to kidnap the passengers for harvesting their organs. I was barely able to sleep afterwards and the idea haunted me for years.
|
||||
|
||||
The radio dramas were usually an hour long, and depending on my levels of tiredness and terror, I sometimes felt the need to lighten the mood before surrendering to sleep. My usual routine was tuning over to AFN to listen to the syndicated Dr. Demento Show, a whimsical comedy program that introduced me to artists like Frank Zappa or Weird Al Yankovic.
|
||||
|
||||
On other nights I'd just sweep the whole FM band and get hooked on interesting music tracks or weird radio shows. When I felt very adventurous, I'd even switch over to AM and went exploring there. Stations in the late 1980s, early 1990s experimented a lot with the medium. I remember curious radio formats, like a live fantasy role-playing game with call-in adventurers and moderator dungeon masters, or late-night programs devoted to all kinds of arcane themes, explored through music and conversations with invited guests and callers.
|
||||
|
||||
One thing I often came back to was dialing the tuner down to the lowest setting, around 87 MHz, where I'd find a strange, repetitive series of warbling and beeping tones. I found them mysterious and fascinating, and that would send my imagination racing with theories about what they might be. Decades later, I remembered those strange sounds and even tried to recreate the experience, but there was nothing to hear around that frequency anymore. Some research eventually revealed that the transmission was from some kind of early one-way pager system called Eurosignal that broadcast between 1974 and 1997.
|
||||
38
content/20260517_voyage.md
Normal file
38
content/20260517_voyage.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
title: Voyage, voyage
|
||||
date: 2026-05-17 12:00
|
||||
author: T. F.
|
||||
tags: radio, music, journey, pandemic
|
||||
slug: voyage
|
||||
era: 2020
|
||||
location: 28.213833449836425, -14.224199803299483
|
||||
read_more: Keep driving →
|
||||
|
||||
After dropping my wife and daughter off at Seville airport around dawn, kissing them goodbye and hoping they would be fine, I drove to a nearby petrol station, filled up our Ford Transit escape vehicle, and continued toward Huelva in the morning sun. My head was full of racing thoughts and worries. It had been a difficult morning. My wife had suffered a crisis of confidence. The plan had been for her and our daughter to fly ahead to Tenerife while I followed a few days later with the van on the ferry, sparing her the crossing because we knew how prone she was to seasickness. But the thought of being separated for almost a week, amid the chaos of constantly shifting travel restrictions, had suddenly become unbearable to her. We had talked through every alternative, but in the end decided to stick to the plan. It really did feel like some kind of escape.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
I could hardly believe we had made it this far. After what had felt like half an eternity of endless preparations, weeks spent renovating the van, getting rid of clutter, sorting and packing our belongings, preparing our apartment for a sublet, we had finally hit the road. All our anxieties about roadblocks and checkpoints in fully locked-down France, and about unpredictable regional travel restrictions in Spain, had turned out to be just that: mere rumours.
|
||||
|
||||
It had taken us a day and a half to drive across Germany to the French border, which we passed without encountering any of the feared controls. After a stop in St. Girons in Occitania, where friends welcomed us with good food, wine, great conversation, and the luxury of a real bed, we continued west toward the Atlantic, the Pyrenees always to our left. Only the changed road signs told us we had entered Spain. Again: no borders, no police, nobody stopping us. After a dizzying drive through the tunnels and viaducts of the Spanish Basque Country, the landscape suddenly opened into the vast rolling plains of Castile y León beneath an overwhelming expanse of blue sky. It felt like freedom made landscape. That evening we camped on a small hill between Palencia and Valladolid under an orange-tinted sky, the wind carrying the scent of pine and thyme. The final stretch south into Andalusia had also gone smoothly, and we had reached Seville, where we spent the night parked in the middle of the city.
|
||||
|
||||
I exited the A-49 onto the A-483, taking a detour along the Andalusian coastline. I don’t remember exactly where I was when the next song came on the radio, but it was *David Bowie*’s epic track [Heroes](https://www.youtube.com/watch?v=lXgkuM2NhYI). I had never really been a Bowie fan, but I sang along, feeling my body relax and my worries begin to fade. Then, somewhere in the second or third verse, when the reverb in Bowie’s vocals kicked in...
|
||||
|
||||
...out of the blue, I burst into tears. Not just a little, I hadn’t cried like that in years. Tears streamed down my face as I all but yelled the lyrics while the blurry landscape rushed pas me:
|
||||
|
||||
>We can beat them, forever and ever. Oh, we can be Heroes, just for one day.
|
||||
|
||||
It was a profound moment - a true *hero’s journey* moment. I felt somehow physically relieved and, at the same time, utterly overcome by despair and an almost unbearable feeling of nostalgia and grief.
|
||||
|
||||
As the song faded out, it gave way to the French 80s hit [Voyage, Voyage](https://www.youtube.com/watch?v=6PDmZnG8KsM) by *Desireless*. The last time I had heard it was as a child, when it [had been a hit on the radio](/freq-surfing.html) decades earlier. It held no particular meaning for me, and yet the nostalgia and the strange synchronicity of that very moment was so overwhelming that my tears kept flowing.
|
||||
|
||||
>Au dessus des vieux volcans, Glissent des ailes sous les tapis du vent, Voyage, voyage. Éternellement.
|
||||
|
||||
>De nuages en marécages, De vent d'Espagne en pluie d'équateur. Voyage, voyage.
|
||||
|
||||
>Vole dans les hauteurs, Au dessus des capitales, Des idées fatales, Regardent l'océan.
|
||||
|
||||
I almost had to pull the car over. Tears blurred the road ahead until I could barely see. My whole body shook, and I sobbed like a child. At the time, I couldn’t understand what was happening to me.
|
||||
|
||||
Only in retrospect do I see it clearly: some deeper part of me had already recognized what lay ahead. This was our turning point, the point of no return, the moment every hero's journey ultimately arrives at. An era was ending. A world was ending. After this, nothing would ever be the same.
|
||||
|
||||
What had begun as a temporary escape plan: to spend the winter months on Tenerife until the chaos of the Covid-19 pandemic subsided, eventually became a two-year residency as expats. And true to what some part of me had sensed on that drive, nothing was ever the same again. We never returned to our old life in Berlin. Instead, our journey carried us onward to Israel, where we would live for several more years.
|
||||
9
content/pages/about.md
Normal file
9
content/pages/about.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
title: About
|
||||
slug: about
|
||||
|
||||
My first attempt at writing some kind of memoir was during my daily train commute to university in the early new millennium. I was 21 and felt ridiculous, having my whole life still ahead of me and all. Now I regret I didn't write down more.
|
||||
|
||||
Today my memories of the past are hazy and scattered and this blog is an attempt to piece together these random fragments that feel like from different timelines in faraway places I revisit during walks on the beach or early morning drives.
|
||||
|
||||
[Zonetoast](glossary.html) is an ongoing [chronotopological](glossary.html) endeavor of a xennial slacker, a cartography of half-remembered places, former selves, and the strange elasticity of lived time.
|
||||
|
||||
12
content/pages/glossary.md
Normal file
12
content/pages/glossary.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
title: Glossary
|
||||
slug: glossary
|
||||
|
||||
**Chronotope** */ˈkrɒn.əˌtoʊp/ (noun)*: a concept, especially in literary theory, referring to the intrinsic interconnectedness of time and space within a narrative—how temporal and spatial relationships shape the structure, meaning, and unfolding of events; from Greek chronos (“time”) + topos (“place”).
|
||||
|
||||
**Chronotopology** */ˌkrɒnətoʊˈpɒlədʒi/ (noun)*: the study of chronotopes and the ways time-space relations are structured, perceived, and mentally inhabited, examining how temporal and spatial dimensions jointly shape experience, cognition, and meaning within narratives, conceptual frameworks, or lived consciousness.
|
||||
|
||||
**Toast** */toʊst/ (noun)*: a state of subjective psychic depletion, overexposure, or being gently but decisively done for; in chronotopological usage, the condition of having lingered too long in memory, mood, or altered perception, ranging from pleasantly warmed to completely finished.
|
||||
|
||||
**Zone** */zoʊn/ (noun)*: a bounded or semi-bounded field of perception, memory, or habitation; in chronotopological usage, a mentally inhabited region where place, mood, and subjective time gather into a distinct experiential atmosphere.
|
||||
|
||||
**Zonetoast** */ˈzoʊnˌtoʊst/* *(noun)*: chronotopological term for a liminal psychic atmosphere where memory, place, and affect converge into a spatiotemporal mental zone, gently warmed and altered by nostalgia, sometimes scorched beyond recognition.
|
||||
71
pelicanconf.py
Normal file
71
pelicanconf.py
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
|
||||
AUTHOR = u'T.F.'
|
||||
SITENAME = u'ZONETOAST'
|
||||
SITE_SUBTITLE = u'A Chronotopology of Unfinished Timelines'
|
||||
# SITEURL = '//sublunar.space'
|
||||
|
||||
THEME = 'blue-penguin-dark'
|
||||
PATH = 'content'
|
||||
|
||||
DEFAULT_DATE = 'fs'
|
||||
|
||||
SUMMARY_MAX_LENGTH = 100
|
||||
|
||||
DEFAULT_DATE_FORMAT = '%d %b %Y'
|
||||
|
||||
TIMEZONE = 'Europe/Berlin'
|
||||
|
||||
DEFAULT_LANG = u'en'
|
||||
|
||||
STATIC_PATHS = ['assets']
|
||||
|
||||
# Feed generation is usually not desired when developing
|
||||
FEED_ALL_ATOM = 'feeds/all.atom.xml'
|
||||
FEED_ALL_RSS = 'feeds/all.rss.xml'
|
||||
CATEGORY_FEED_ATOM = None
|
||||
TRANSLATION_FEED_ATOM = None
|
||||
AUTHOR_FEED_ATOM = None
|
||||
AUTHOR_FEED_RSS = None
|
||||
|
||||
# HTML metadata
|
||||
SITEDESCRIPTION = SITE_SUBTITLE
|
||||
|
||||
# all defaults to True.
|
||||
DISPLAY_HEADER = True
|
||||
DISPLAY_FOOTER = True
|
||||
DISPLAY_HOME = True
|
||||
DISPLAY_MENU = True
|
||||
DISPLAY_PAGES_ON_MENU = True
|
||||
DARK_LIGHT_SWITCHING_OFF = False
|
||||
|
||||
# provided as examples, they make ‘clean’ urls. used by MENU_INTERNAL_PAGES.
|
||||
TAGS_URL = 'tags'
|
||||
TAGS_SAVE_AS = 'tags/index.html'
|
||||
AUTHORS_URL = 'authors'
|
||||
AUTHORS_SAVE_AS = 'authors/index.html'
|
||||
CATEGORIES_URL = 'categories'
|
||||
CATEGORIES_SAVE_AS = 'categories/index.html'
|
||||
ARCHIVES_URL = 'archives'
|
||||
ARCHIVES_SAVE_AS = 'archives/index.html'
|
||||
|
||||
# use those if you want pelican standard pages to appear in your menu
|
||||
MENU_INTERNAL_PAGES = (
|
||||
# ('Tags', TAGS_URL, TAGS_SAVE_AS),
|
||||
# ('Authors', AUTHORS_URL, AUTHORS_SAVE_AS),
|
||||
# ('Categories', CATEGORIES_URL, CATEGORIES_SAVE_AS),
|
||||
# ('Archives', ARCHIVES_URL, ARCHIVES_SAVE_AS),
|
||||
)
|
||||
# additional menu items
|
||||
MENUITEMS = (
|
||||
# ('GitHub', 'https://github.com/'),
|
||||
# ('Linux Kernel', 'https://www.kernel.org/'),
|
||||
)
|
||||
|
||||
# example pagination pattern
|
||||
PAGINATION_PATTERNS = (
|
||||
(1, '{url}', '{save_as}'),
|
||||
(2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'),
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue