Compare commits
12 Commits
d9514f2491
...
00d1c6d573
Author | SHA1 | Date |
---|---|---|
max/sooulix | 00d1c6d573 | |
max/sooulix | ac13e4348f | |
max/sooulix | 5bcf39406f | |
max/sooulix | 4827eb4286 | |
max/sooulix | 3d7d96c314 | |
max/sooulix | c86271fa19 | |
max/sooulix | 0c20dace7f | |
max/sooulix | afad779a87 | |
max/sooulix | 971d761212 | |
max/sooulix | 345304a615 | |
max/sooulix | f1453d4182 | |
max/sooulix | af04eb1dfc |
|
@ -1,3 +1,9 @@
|
|||
[submodule "pelican-plugins/pelican-toc"]
|
||||
path = pelican-plugins/pelican-toc
|
||||
url = https://github.com/ingwinlu/pelican-toc.git
|
||||
[submodule "theme"]
|
||||
path = theme
|
||||
url = ssh://gitea@gitea.gitu.be:2222/masq/pelican-papyrus.git
|
||||
[submodule "pelican-plugins"]
|
||||
path = pelican-plugins
|
||||
url = https://github.com/getpelican/pelican-plugins.git
|
||||
[submodule "pelican-custom-plugins/jsonresume"]
|
||||
path = pelican-custom-plugins/jsonresume
|
||||
url = ssh://gitea@gitea.gitu.be:2222/masq/pelican-plugin-jsonresume.git
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
À propos
|
||||
########
|
||||
|
||||
:date: 2024-07-05 18:38
|
||||
:modified: 2024-07-05 18:38
|
||||
:tags:
|
||||
:category: pages
|
||||
:slug: about_me
|
||||
:lang: fr
|
||||
:authors: maxime alves
|
||||
:summary: présentation
|
||||
|
||||
--------------
|
||||
ce que je fais
|
||||
--------------
|
||||
|
||||
- j'apprécie travailler pour le renforcement et la diffusion du logiciel libre
|
||||
- j'héberge et administre des service permettant de se rendre indépendant des
|
||||
géants de l'informatique
|
||||
- je fournis des ressources a des associations et des indépendants à titre gratuit
|
||||
|
||||
|
||||
-----
|
||||
où ça
|
||||
-----
|
||||
|
||||
- résident à Montpellier, France
|
||||
- originaire d'Alsace
|
||||
- souvent entre Leiria, Portugal et Arad, Romania
|
||||
|
||||
|
||||
-------
|
||||
hobbies
|
||||
-------
|
||||
|
||||
- perd son temps sur des rogueli(k-t)es
|
||||
- se casse le nez en skateboard
|
||||
- bricole des vélos entre la réparation et le sabotage
|
||||
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
Liens
|
||||
#####
|
||||
|
||||
:date: 2024-07-05 19:28
|
||||
:modified: 2024-07-05 19:28
|
||||
:tags:
|
||||
:category: pages
|
||||
:slug: links
|
||||
:authors: maxime alves
|
||||
:summary: liens internet importants
|
||||
:lang: fr
|
||||
|
||||
|
||||
##############
|
||||
Projets libres
|
||||
##############
|
||||
|
||||
Note: Tout les projets ci-dessous sont sous licence libre et sont tous utilisables sous le système d'exploitation GNU/Linux.
|
||||
|
||||
Les essentiels
|
||||
--------------
|
||||
|
||||
- `GNU`_
|
||||
- `Linux`_
|
||||
- `Devuan`_
|
||||
- `Alpine Linux`_
|
||||
- `Debian`_
|
||||
- `Archlinux`_
|
||||
- `Gentoo`_
|
||||
|
||||
.. _GNU: https://www.gnu.org/
|
||||
.. _Linux: https://kernel.org/
|
||||
.. _Devuan: https://www.devuan.org/
|
||||
.. _Alpine Linux: https://alpinelinux.org/
|
||||
.. _Debian: https://www.debian.org/
|
||||
.. _Archlinux: https://archlinux.org/
|
||||
.. _Gentoo: https://www.gentoo.org/
|
||||
|
||||
|
||||
Les outils du quotidien
|
||||
-----------------------
|
||||
|
||||
- `vim`_
|
||||
- `screen`_
|
||||
- `SSH`_
|
||||
- `password-store`_
|
||||
- `mutt`_
|
||||
- `dmenu`_
|
||||
|
||||
.. _vim: https://www.vim.org/
|
||||
.. _screen: https://www.gnu.org/software/screen/manual/screen.html
|
||||
.. _SSH: https://www.openssh.com/
|
||||
.. _password-store: https://www.passwordstore.org/
|
||||
.. _mutt: http://www.mutt.org/
|
||||
.. _dmenu: http://tools.suckless.org/dmenu/
|
||||
|
||||
|
||||
Sous Xorg
|
||||
.........
|
||||
|
||||
- `xterm`_: L'emulateur de terminal standard
|
||||
- `i3`_: Le gestionnaire de fenêtre par pavage (tiling WM) par excellence
|
||||
|
||||
.. _xterm: https://www.x.org/releases/X11R6.7.0/doc/xterm.1.html
|
||||
.. _i3: https://i3wm.org/
|
||||
|
||||
Sous wayland
|
||||
............
|
||||
|
||||
- `foot`_: Une alternative a xterm sous wayland
|
||||
- `sway`_: Réécriture de i3 wm pour wayland
|
||||
|
||||
.. _foot: https://codeberg.org/dnkl/foot
|
||||
.. _sway: https://swaywm.org/
|
||||
|
||||
|
||||
Documents
|
||||
---------
|
||||
|
||||
- `zathura`_: Lecteur de documents PDF, epub, DJVU, etc...
|
||||
- `Libre Office`_: Suite de logiciels bureautiques
|
||||
- `pandoc`_: Convertisseur de documents aux super-pouvoirs
|
||||
- `Latex`_: Mise en forme de documents pour l'édition
|
||||
|
||||
.. _zathura: https://github.com/pwmt/zathura
|
||||
.. _Libre Office: https://www.libreoffice.org/
|
||||
.. _pandoc: https://pandoc.org/
|
||||
.. _Latex: https://www.latex-project.org/about/
|
||||
|
||||
|
||||
Images et médias
|
||||
----------------
|
||||
|
||||
- `feh`_: Visualiseur d'images
|
||||
- `mplayer`_: CLI media player
|
||||
- `vlc`_: GUI media player
|
||||
|
||||
.. _feh: https://feh.finalrewind.org/
|
||||
.. _mplayer: http://www.mplayerhq.hu/design7/dload.html
|
||||
.. _vlc: https://www.videolan.org/vlc/
|
|
@ -0,0 +1,13 @@
|
|||
CV
|
||||
##
|
||||
|
||||
:date: 2024-08-12 14:00
|
||||
:modified: 2024-08-12 14:00
|
||||
:tags:
|
||||
:category: pages
|
||||
:slug: resume
|
||||
:authors: maxime alves
|
||||
:summary: présentation
|
||||
:template: resume
|
||||
:lang: fr
|
||||
:jsonresume: /home/emixam/src/gitea.gitu.be/masq/cv/resume_fr.json
|
|
@ -0,0 +1,15 @@
|
|||
Resume
|
||||
######
|
||||
|
||||
:date: 2024-08-12 14:00
|
||||
:modified: 2024-08-12 14:00
|
||||
:tags:
|
||||
:category: pages
|
||||
:slug: resume
|
||||
:authors: maxime alves
|
||||
:summary: présentation
|
||||
:template: resume
|
||||
:lang: en
|
||||
:jsonresume: /home/emixam/src/gitea.gitu.be/masq/cv/resume_en.json
|
||||
:jsonresume_fr: /home/emixam/src/gitea.gitu.be/masq/pysira-papyrus/language/fr.json
|
||||
:jsonresume_en: /home/emixam/src/gitea.gitu.be/masq/pysira-papyrus/language/en.json
|
|
@ -0,0 +1,93 @@
|
|||
#!/usr/bin/env python3
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
|
||||
dateformat = lambda x: x.strftime("%Y-%m-%d %H:%M")
|
||||
now = datetime.now()
|
||||
|
||||
default_slug = lambda x: re.sub(r'[^a-z0-9_]', '', x.lower().replace(' ', '_'))
|
||||
|
||||
existing_authors = []
|
||||
|
||||
# def scan_metadata():
|
||||
# metadata = {}
|
||||
# for _, _, files in os.walk('./content'):
|
||||
# for file in files:
|
||||
# with open(file) as fh:
|
||||
# content = filter(fh.readlines())
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
# def read_authors():
|
||||
|
||||
@dataclass
|
||||
class ContentMetadata:
|
||||
title: str
|
||||
date: str
|
||||
modified: str
|
||||
tags: List[str]
|
||||
category: str
|
||||
slug: str
|
||||
authors: str
|
||||
summary: str
|
||||
|
||||
def __repr__(self):
|
||||
return f"""
|
||||
{self.title}
|
||||
{'#' * len(self.title)}
|
||||
|
||||
:date: {self.date}
|
||||
:modified: {self.date}
|
||||
:tags: {', '.join(self.tags)}
|
||||
:category: {self.category}
|
||||
:slug: {self.slug}
|
||||
:authors: {self.authors}
|
||||
:summary: {self.summary}
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
title = input("Title?")
|
||||
date = input(f"Creation date? [{dateformat(now)}]")
|
||||
if len(date) == 0:
|
||||
date = dateformat(now)
|
||||
|
||||
tags = []
|
||||
tag = None
|
||||
while tag is None or len(tag) > 0:
|
||||
if tag is not None:
|
||||
tags.append(tag)
|
||||
|
||||
tag = input("Add tag")
|
||||
|
||||
category = input("Category?")
|
||||
slug = input(f"Slug? [{default_slug(title)}]")
|
||||
|
||||
if len(slug) == 0:
|
||||
slug = default_slug(title)
|
||||
|
||||
authors = input("Authors?")
|
||||
summary = input("Summary?")
|
||||
|
||||
content = ContentMetadata(
|
||||
title,
|
||||
date,
|
||||
date,
|
||||
tags,
|
||||
category,
|
||||
slug,
|
||||
authors,
|
||||
summary
|
||||
)
|
||||
|
||||
with open(f'./{slug}.rst', 'w') as fh:
|
||||
fh.write(str(content))
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -0,0 +1 @@
|
|||
Subproject commit b1c55eb1b169dc2497f091339bc9ac6d78d05a95
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 48d743f410c15498b27e5038ea645be65c682802
|
|
@ -1 +0,0 @@
|
|||
Subproject commit ffcc96360df9fc304e49485089f5b4cd32ec05b4
|
|
@ -1,12 +1,13 @@
|
|||
AUTHOR = 'maxime alves'
|
||||
SITENAME = 'mfalves'
|
||||
SITEURL = ""
|
||||
SITEURL = "http://127.0.0.1:8000/"
|
||||
|
||||
PATH = "content"
|
||||
|
||||
TIMEZONE = 'Europe/Paris'
|
||||
|
||||
DEFAULT_LANG = 'fr'
|
||||
DEFAULT_LOCALE = 'fr_FR.UTF-8'
|
||||
|
||||
# Feed generation is usually not desired when developing
|
||||
FEED_ALL_ATOM = None
|
||||
|
@ -35,12 +36,36 @@ DEFAULT_PAGINATION = 10
|
|||
# RELATIVE_URLS = True
|
||||
THEME = "./theme"
|
||||
THEME_STATIC_PATHS = ['static']
|
||||
PLUGIN_PATHS = ['pelican-plugins']
|
||||
PLUGINS = ['readtime','search','neighbors','pelican-toc']
|
||||
PLUGIN_PATHS = ['pelican-plugins', 'pelican-custom-plugins']
|
||||
PLUGINS = ['readtime','neighbors'
|
||||
,'pelican-toc'
|
||||
, 'jsonresume'
|
||||
, 'i18n_subsites'
|
||||
]
|
||||
|
||||
PAGINATED_TEMPLATES = {'index':None,'tag':None,'category':None,'author':None,'archives':24}
|
||||
# SEARCH_MODE = "output"
|
||||
# SEARCH_HTML_SELECTOR = "main"
|
||||
DIRECT_TEMPLATES = (('index','search','tags','categories','archives'))
|
||||
STORK_INPUT_OPTIONS = {
|
||||
'html_selector': 'main'
|
||||
'html_selector': 'main',
|
||||
}
|
||||
DISPLAY_PAGES_ON_MENU = True
|
||||
|
||||
I18N_SUBSITES = {
|
||||
'fr': {
|
||||
'SITEURL': 'http://127.0.0.1:8000/fr/',
|
||||
'LOCALE': 'fr_FR.UTF-8',
|
||||
'THEME_STATIC_DIR': '../theme',
|
||||
},
|
||||
'en': {
|
||||
'SITEURL': 'http://127.0.0.1:8000/en/',
|
||||
'LOCALE': 'en_US.UTF-8',
|
||||
'THEME_STATIC_DIR': '../theme',
|
||||
}
|
||||
}
|
||||
I18N_TEMPLATES_LANG = ['en','fr']
|
||||
|
||||
JINJA_ENVIRONMENT = {
|
||||
'extensions': ['jinja2.ext.i18n', 'jinja2.ext.debug']
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 4bf887c46e3eb10f37327d99a13ed8ea205aaf78
|
File diff suppressed because one or more lines are too long
|
@ -1,38 +0,0 @@
|
|||
@import url(https://files.stork-search.net/basic.css);
|
||||
|
||||
body:not(.stork-multitheme),
|
||||
.stork-wrapper-dark {
|
||||
--stork-border-color: hsl(0, 0%, 36%);
|
||||
--stork-background-color: hsl(0, 0%, 22%);
|
||||
--stork-accent-color: hsl(194, 90%, 53%);
|
||||
|
||||
--stork-input-text-color: white;
|
||||
|
||||
--stork-results-hover-color: hsl(210, 83%, 16%);
|
||||
--stork-results-title-color: white;
|
||||
--stork-results-excerpt-color: hsla(0, 0%, 80%, 1);
|
||||
--stork-results-highlight-color: rgb(94, 201, 186);
|
||||
--stork-results-border-color: hsl(0, 0%, 30%);
|
||||
}
|
||||
|
||||
body:not(.stork-multitheme) .stork-close-button,
|
||||
.stork-wrapper-dark .stork-close-button {
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
hsl(0, 0%, 60%) 0%,
|
||||
hsl(0, 0%, 50%) 100%
|
||||
);
|
||||
border: 1px solid hsla(0, 0%, 50%, 0.8);
|
||||
color: hsl(0, 0%, 25%);
|
||||
}
|
||||
|
||||
body:not(.stork-multitheme) .stork-close-button:hover,
|
||||
.stork-wrapper-dark .stork-close-button:hover {
|
||||
background: hsla(0, 0%, 45%);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
body:not(.stork-multitheme) .stork-close-button:active,
|
||||
.stork-wrapper-dark .stork-close-button:active {
|
||||
background: hsla(0, 0%, 40%);
|
||||
}
|
|
@ -1,212 +0,0 @@
|
|||
:root {
|
||||
--stork-border-color: hsl(0, 0%, 65%);
|
||||
--stork-background-color: hsla(0, 0%, 97%, 1);
|
||||
--stork-font-family: inherit;
|
||||
--stork-size-multiplier: 1;
|
||||
--stork-accent-color: hsl(210, 72%, 45%);
|
||||
|
||||
--stork-input-width: 100%;
|
||||
--stork-input-border-radius: 8px;
|
||||
--stork-input-text-color: black;
|
||||
--stork-input-shadow: 1;
|
||||
|
||||
--stork-results-width: 100%;
|
||||
--stork-results-border-radius: 4px;
|
||||
--stork-results-shadow: 1;
|
||||
--stork-results-hover-color: hsl(210, 65%, 75%);
|
||||
--stork-results-title-color: black;
|
||||
--stork-results-excerpt-color: black;
|
||||
--stork-results-highlight-color: rgb(245, 230, 26);
|
||||
--stork-results-border-color: var(--stork-border-color);
|
||||
}
|
||||
|
||||
.stork-wrapper {
|
||||
position: relative;
|
||||
font-family: var(--stork-font-family);
|
||||
box-sizing: border-box;
|
||||
font-size: 1em * var(--stork-size-multiplier);
|
||||
}
|
||||
|
||||
.stork-wrapper *,
|
||||
.stork-wrapper *:before,
|
||||
.stork-wrapper *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.stork-input {
|
||||
width: var(--stork-input-width);
|
||||
height: 2.4em;
|
||||
font-size: 1em;
|
||||
padding: 0.4em 0.8em;
|
||||
position: relative;
|
||||
box-shadow: inset 0 0.1em 0.3em
|
||||
hsla(0, 0%, 0%, calc(var(--stork-input-shadow) * 0.25));
|
||||
border: 1px solid var(--stork-border-color);
|
||||
border-radius: var(--stork-input-border-radius);
|
||||
background-color: var(--stork-background-color);
|
||||
color: var(--stork-input-text-color);
|
||||
font-family: var(--stork-font-family);
|
||||
}
|
||||
|
||||
.stork-input:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.stork-progress {
|
||||
position: absolute;
|
||||
display: block;
|
||||
content: "";
|
||||
bottom: 1px;
|
||||
background-color: var(--stork-accent-color);
|
||||
box-shadow: 0 0 8px var(--stork-accent-color);
|
||||
height: 1px;
|
||||
transition: width 0.25s ease, opacity 0.4s ease 0.4s;
|
||||
}
|
||||
|
||||
.stork-output {
|
||||
position: absolute;
|
||||
width: var(--stork-results-width);
|
||||
margin-top: 0.5em;
|
||||
border-radius: var(--stork-results-border-radius);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
z-index: 100;
|
||||
color: var(--stork-results-title-color);
|
||||
font-weight: 400;
|
||||
font-family: var(--stork-font-family);
|
||||
}
|
||||
|
||||
.stork-attribution a:link,
|
||||
.stork-attribution a:visited {
|
||||
color: var(--stork-accent-color);
|
||||
}
|
||||
|
||||
.stork-output-visible {
|
||||
border: 1px solid var(--stork-border-color);
|
||||
box-shadow: 0px 0px 2.2px
|
||||
rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.02)),
|
||||
0px 0px 5.3px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.028)),
|
||||
0px 0px 10px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.035)),
|
||||
0px 0px 17.9px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.042)),
|
||||
0px 0px 33.4px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.05)),
|
||||
0px 0px 80px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.07));
|
||||
background: var(--stork-background-color);
|
||||
}
|
||||
|
||||
.stork-message {
|
||||
width: 100%;
|
||||
padding: 0.5em 1em;
|
||||
color: var(--stork-results-title-color);
|
||||
}
|
||||
|
||||
.stork-attribution {
|
||||
width: 100%;
|
||||
padding: 0.5em 1em;
|
||||
font-size: 0.8em;
|
||||
color: var(--stork-results-title-color);
|
||||
}
|
||||
|
||||
.stork-results {
|
||||
margin: 0;
|
||||
padding: 0.25em 0;
|
||||
width: 100%;
|
||||
list-style-type: none;
|
||||
max-height: 25em;
|
||||
overflow-y: scroll;
|
||||
border-top: 1px solid var(--stork-border-color);
|
||||
border-bottom: 1px solid var(--stork-border-color);
|
||||
box-shadow: inset 0em 0.7em 0.7em -0.7em hsla(0, 0%, 0%, calc(var(
|
||||
--stork-results-shadow
|
||||
) * 0.34)),
|
||||
inset 0em -0.7em 0.7em -0.7em
|
||||
hsl(0, 0%, 0%, calc(var(--stork-results-shadow) * 0.34));
|
||||
}
|
||||
|
||||
.stork-result:not(:last-child) {
|
||||
border-bottom: 1px solid var(--stork-results-border-color);
|
||||
}
|
||||
|
||||
.stork-result.selected {
|
||||
background: var(--stork-results-hover-color);
|
||||
}
|
||||
|
||||
.stork-result a:link {
|
||||
padding: 1em;
|
||||
display: block;
|
||||
color: currentcolor;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.stork-result p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.stork-title {
|
||||
font-weight: bold;
|
||||
font-size: 0.95em;
|
||||
margin: 0 0 0.75em 0;
|
||||
color: var(--stork-results-title-color);
|
||||
|
||||
/* Flexbox container for the title and the score, when debugging */
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.stork-excerpt {
|
||||
font-size: 0.8em;
|
||||
line-height: 1;
|
||||
margin: 0;
|
||||
color: var(--stork-results-excerpt-color);
|
||||
|
||||
/* Flexbox container for the title and the score, when debugging */
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.stork-excerpt:not(:last-of-type) {
|
||||
margin-bottom: 0.6em;
|
||||
}
|
||||
|
||||
.stork-highlight {
|
||||
background-color: var(--stork-results-highlight-color);
|
||||
padding: 0 0.1em;
|
||||
}
|
||||
|
||||
.stork-error {
|
||||
outline: 2px solid hsl(0, 89%, 46%);
|
||||
}
|
||||
|
||||
.stork-close-button {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin: 0.3em 0.4em;
|
||||
height: 1.5em;
|
||||
width: 1.5em;
|
||||
padding: 0px;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
hsl(0, 0%, 85%) 0%,
|
||||
hsl(0, 0%, 75%) 100%
|
||||
);
|
||||
border: 1px solid hsla(0, 0%, 50%, 0.8);
|
||||
font-size: 1.1em;
|
||||
color: hsl(0, 0%, 45%);
|
||||
border-radius: 15%;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.stork-close-button svg {
|
||||
width: 0.8em;
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
|
||||
.stork-close-button:hover {
|
||||
background: hsla(0, 0%, 70%);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.stork-close-button:active {
|
||||
background: hsla(0, 0%, 65%);
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,120 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Archive | {{ SITENAME }}{% endblock %}
|
||||
{% set current = "archive" %}
|
||||
|
||||
{% macro countyear(year) %}
|
||||
{% set name = namespace(y=0) %}
|
||||
{% for article in dates %}
|
||||
{% if article.date | strftime('%Y') == year %}
|
||||
{% set name.y = name.y + 1 %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{name.y}}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro countmonth(month, year) %}
|
||||
{% set name = namespace(m=0) %}
|
||||
{% for article in dates %}
|
||||
{% if article.date | strftime('%B') == month and article.date | strftime('%Y') == year %}
|
||||
{% set name.m = name.m + 1 %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{name.m}}
|
||||
{% endmacro %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="md:mt-14 text-zinc-800 dark:text-zinc-300 pb-6">
|
||||
<h1 class="font-bold text-4xl my-10">Archive</h1>
|
||||
<ul class=" flex-col">
|
||||
{% for year, year_group in dates_page.object_list|groupby('date.year')|reverse %}
|
||||
{% for month, month_group in year_group|groupby('date.month')|reverse %}
|
||||
{% for article in month_group %}
|
||||
{% if article == month_group[0] and article == year_group[0] %}
|
||||
<h3 class="text-2xl font-semibold my-8">{{(month_group|first).date|strftime('%Y')}}
|
||||
<sup class="text-sm text-zinc-800 dark:text-zinc-400">
|
||||
{{ countyear(article.date | strftime('%Y')) }}
|
||||
</sup>
|
||||
</h3>
|
||||
<div class="md:flex my-1">
|
||||
<time class="text-xl font-semibold flex mt-6 md:mt-2 md:w-40">{{ (month_group|first).date|strftime('%B') }}
|
||||
<sup class="text-sm m-1 text-zinc-800 dark:text-zinc-400">
|
||||
{{ countmonth(article.date | strftime('%B'), article.date | strftime('%Y')) }}
|
||||
</sup>
|
||||
</time>
|
||||
<a href="{{ SITEURL }}/{{ article.url }}">
|
||||
<li class="flex-1 md:mt-2"><span class="text-lg">{{ article.title}}</span><br>
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<time>{{ article.date|strftime('%B %d, %Y') }}</time>
|
||||
<div>
|
||||
{% if article.readtime %}
|
||||
<span> · {{ article.readtime }} min read</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
{% if article.author != '' %}
|
||||
<span> · {{ article.author }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
</div>
|
||||
{% elif article == month_group[0] %}
|
||||
<div class="md:flex mt-3">
|
||||
<time class="text-xl font-semibold flex mt-6 md:mt-2 md:w-40">{{ (month_group|first).date|strftime('%B') }}
|
||||
<sup class="text-sm m-1 text-zinc-800 dark:text-zinc-400">
|
||||
{{ countmonth(article.date | strftime('%B'), article.date | strftime('%Y')) }}
|
||||
</sup>
|
||||
</time>
|
||||
<a href="{{ SITEURL }}/{{ article.url }}">
|
||||
<li class="flex-1 md:mt-2"><span class="text-lg">{{ article.title}}</span><br>
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<time>{{ article.date|strftime('%B %d, %Y') }}</time>
|
||||
<div>
|
||||
{% if article.readtime %}
|
||||
<span> · {{ article.readtime }} min read</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
{% if article.author != '' %}
|
||||
<span> · {{ article.author }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="md:flex">
|
||||
<time class="flex md:w-40"></time>
|
||||
<a href="{{ SITEURL }}/{{ article.url }}">
|
||||
<li class="flex-1 md:mt-2 mt-1"><span class="text-lg">{{ article.title}}</span><br>
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<time>{{ article.date|strftime('%B %d, %Y') }}</time>
|
||||
<div>
|
||||
{% if article.readtime %}
|
||||
<span> · {{ article.readtime }} min read</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
{% if article.author != '' %}
|
||||
<span> · {{ article.author }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% if dates_page.has_other_pages() %}
|
||||
{% include 'pagination.html' %}
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,123 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% block html_lang %}{{ article.lang }}{% endblock %}
|
||||
{% block head -%}
|
||||
{{ super() -}}
|
||||
{% if article.summary %}
|
||||
<meta name="description" content="{{ article.summary | striptags | safe | truncate(150) }}" />
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block title %}{{ article.title|striptags }}{% endblock %}
|
||||
{% block extra_head %}
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{% if translations.entry_hreflang(article) %}
|
||||
{{ translations.entry_hreflang(article) }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<main>
|
||||
<header>
|
||||
<h1 class="font-semibold text-3xl my-2">{{article.title}}</h1>
|
||||
<footer class="flex text-sm text-zinc-800 dark:text-zinc-400">
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<time>{{ article.date|strftime('%B %d, %Y') }}</time>
|
||||
<div>
|
||||
{% if article.readtime %}
|
||||
<span> · {{ article.readtime }} min read</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
{% if article.author != '' %}
|
||||
<span> · {{ article.author }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% if article.modified %}
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<span>Last updated: {{ article.modified|strftime('%B %d, %Y') }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</header>
|
||||
{% if article.toc %}
|
||||
<details class="flex flex-col my-6 p-4 bg-zinc-200 dark:bg-zinc-800 rounded-lg">
|
||||
<summary class="text-lg font-bold">Table of contents</summary>
|
||||
<div class="mx-4 px-4 underline">
|
||||
{{ article.toc }}
|
||||
</div>
|
||||
</details>
|
||||
{% endif %}
|
||||
<div class="max-w-7xl container mx-auto my-8 text-zinc-800 dark:text-zinc-300
|
||||
prose lg:max-w-none prose-headings:text-zinc-800 prose-headings:dark:text-zinc-300
|
||||
prose-h1:text-3xl lg:prose-h1:text-3xl prose-headings:font-semibold
|
||||
prose-pre:bg-zinc-200 prose-pre:text-zinc-800
|
||||
dark:prose-pre:bg-zinc-800 dark:prose-pre:text-zinc-200
|
||||
prose-blockquote:text-zinc-800
|
||||
dark:prose-blockquote:text-zinc-200
|
||||
prose-a:text-gray-500
|
||||
dark:prose-a:text-gray-400
|
||||
dark:prose-strong:text-zinc-200
|
||||
dark:prose-code:text-zinc-200
|
||||
dark:prose-code:bg-zinc-800
|
||||
prose-code:bg-zinc-200
|
||||
prose-code:font-light
|
||||
prose-img:rounded-md
|
||||
">
|
||||
{{ article.content }}
|
||||
<!-- <div class="aspect-w-16 aspect-h-9 mx-auto"></div> CSS placeholder -->
|
||||
</div>
|
||||
<footer class="flex flex-col mt-10 ">
|
||||
<ul class="flex flex-wrap">
|
||||
{% for tag in article.tags|sort %}
|
||||
<a href="{{ SITEURL }}/{{ tag.url }}">
|
||||
<li
|
||||
class="bg-zinc-200 hover:bg-zinc-300 dark:hover:bg-zinc-800 dark:bg-zinc-700 text-zinc-500 dark:text-neutral-400 mb-2 mr-2 px-3 py-1.5 rounded-md transition ease-in active:-translate-y-1 active:scale-110 duration-75">
|
||||
{{ tag }}
|
||||
</li>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="flex w-full my-2 bg-zinc-200 dark:bg-zinc-700 rounded-lg">
|
||||
{% if article.next_article %}
|
||||
<div class="w-1/2 hover:bg-zinc-300 dark:hover:bg-zinc-800 rounded-l-lg">
|
||||
<a class="flex flex-col pr-2" href="{{ SITEURL }}/{{ article.next_article.url }}">
|
||||
<div class="mx-4 py-2 text-left">
|
||||
<p class="text-zinc-500 dark:text-neutral-400 text-sm">« PREV PAGE</p>
|
||||
<p class="text-left py-1 hover:underline">{{ article.next_article.title }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="w-1/2 rounded-l-lg"></div>
|
||||
{% endif %}
|
||||
{% if article.prev_article %}
|
||||
<div class="w-1/2 hover:bg-zinc-300 dark:hover:bg-zinc-800 rounded-r-lg ">
|
||||
<a class="flex flex-col" href="{{ SITEURL }}/{{ article.prev_article.url }}">
|
||||
<div class="text-right mx-4 py-2">
|
||||
<p class="text-zinc-500 dark:text-neutral-400 text-sm">NEXT PAGE »</p>
|
||||
<p class="text-right py-1 hover:underline">{{ article.prev_article.title }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="flex bg-zinc-200 dark:bg-zinc-700 py-2 rounded-lg justify-center space-x-2 text-xs">
|
||||
{% for name, link in SHARE %}
|
||||
<ul>
|
||||
<a target="_blank" rel="noopener noreferrer" title="{{ name }}" aria-label="share Features on {{ name }}"
|
||||
href="{{ link }}{{ SITEURL }}/{{ article.url }}">
|
||||
<li class="bg-gray-900 p-1 text-white rounded-md">
|
||||
<i class="fab fa-{{ name }} fa-2x" aria-hidden="true"></i>
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</footer>
|
||||
<div>
|
||||
{% include 'disqus_script.html' %}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{% endblock %}
|
|
@ -1,2 +0,0 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} - {{ author }}{% endblock %}
|
|
@ -1,12 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} - Authors{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<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>
|
||||
{% endblock %}
|
|
@ -1,252 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
|
||||
|
||||
<head>
|
||||
{% block head %}
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="generator" content="Pelican" />
|
||||
<title>{% block title %} {{ SITENAME }} {% endblock %}</title>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Slab|Ruda" />
|
||||
<link rel="stylesheet" type="text/css" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/main.css" />
|
||||
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/stork.css">
|
||||
<link rel="stylesheet" media="screen and (prefers-color-scheme: dark)"
|
||||
href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/stork-dark.css">
|
||||
{% 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 %}
|
||||
{% endblock head %}
|
||||
<script>
|
||||
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia(
|
||||
'(prefers-color-scheme: dark)').matches)) {
|
||||
document.documentElement.classList.add('dark');
|
||||
} else {
|
||||
document.documentElement.classList.remove('dark')
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col max-w-7xl lg:max-w-none text-zinc-800 bg-neutral-100
|
||||
dark:bg-neutral-900 dark:text-zinc-300 container mx-auto justify-center md:px-3 ">
|
||||
<nav class="sm:flex sm:justify-between xl:ml-32 pl-4 items-center">
|
||||
<div class="flex pt-4">
|
||||
<h1 class="font-semibold text-2xl"><a href="{{ SITEURL }}/">{{ SITENAME }}</a></h1>
|
||||
<button id="theme-toggle" type="button"
|
||||
class="text-zinc-700 dark:text-zinc-400 rounded-full focus:outline-none text-sm ml-2 p-1">
|
||||
<svg id="theme-toggle-dark-icon" class="w-5 h-5 hidden" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path>
|
||||
</svg>
|
||||
<svg id="theme-toggle-light-icon" class="w-5 h-5 hidden" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
|
||||
fill-rule="evenodd" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<ul class="flex flex-wrap lg:mr-24 md:pt-0">
|
||||
{% if DISPLAY_PAGES_ON_MENU %}
|
||||
{% for p in pages %}
|
||||
<li class="mr-4 pt-6"><a {% if p==page %} class="border-b-2 border-zinc-800 dark:border-zinc-300"
|
||||
{% endif %} href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<li class="mr-4 pt-6"><a {% if current=="archive" %} class="border-b-2 border-zinc-800 dark:border-zinc-300"
|
||||
{% endif %} href="{{ SITEURL }}/archives.html">Archive</a></li>
|
||||
<li class="mr-4 pt-6"><a {% if current=="categories" %}
|
||||
class="border-b-2 border-zinc-800 dark:border-zinc-300" {% endif %}
|
||||
href="{{ SITEURL }}/categories.html">Categories</a></li>
|
||||
<li class="mr-4 pt-6"><a {% if current=="tags" %} class="border-b-2 border-zinc-800 dark:border-zinc-300"
|
||||
{% endif %} href="{{ SITEURL }}/tags.html">Tags</a></li>
|
||||
<li class="mr-4 pt-6"><a {% if current=="search" %} class="border-b-2 border-zinc-800 dark:border-zinc-300"
|
||||
{% endif %} href="{{ SITEURL }}/search.html">Search</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<div class="flex-grow md:max-w-screen-md md:mx-auto md:w-3/4 px-4">
|
||||
{% if article %}
|
||||
<nav class="text-zinc-800 dark:text-zinc-300 mt-12 pb-2 md:mt-16" aria-label="Breadcrumb">
|
||||
<ul class="p-0 inline-flex items-center">
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/" class="text-zinc-800 dark:text-zinc-300 inline-flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z">
|
||||
</path>
|
||||
</svg>
|
||||
Home
|
||||
</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/categories.html">Categories</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/{{category.url}}">{{ category }}</a>
|
||||
</li>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</ul>
|
||||
</nav>
|
||||
{% elif tag %}
|
||||
<nav class="text-zinc-800 dark:text-zinc-300 mt-12 pb-3 md:mt-16" aria-label="Breadcrumb">
|
||||
<ul class="p-0 inline-flex">
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/" class="text-zinc-800 dark:text-zinc-300 inline-flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z">
|
||||
</path>
|
||||
</svg>
|
||||
Home
|
||||
</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/tags.html">Tags</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="border-b-2 border-zinc-800 dark:border-zinc-300">
|
||||
{{ tag }}
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% elif page %}
|
||||
<nav class="text-zinc-800 dark:text-zinc-300 mt-12 pb-3 md:mt-16" aria-label="Breadcrumb">
|
||||
<ul class="p-0 inline-flex">
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/" class="text-zinc-800 dark:text-zinc-300 inline-flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z">
|
||||
</path>
|
||||
</svg>
|
||||
Home
|
||||
</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="border-b-2 border-zinc-800 dark:border-zinc-300">
|
||||
{{page.title}}
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% elif category %}
|
||||
<nav class="text-zinc-800 dark:text-zinc-300 mt-12 pb-3 md:mt-16" aria-label="Breadcrumb">
|
||||
<ul class="p-0 inline-flex">
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/" class="text-zinc-800 dark:text-zinc-300 inline-flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z">
|
||||
</path>
|
||||
</svg>
|
||||
Home
|
||||
</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="flex items-center">
|
||||
<a href="{{ SITEURL }}/categories.html">Categories</a>
|
||||
<svg class="fill-current w-3 h-3 mr-2 ml-1" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 320 512">
|
||||
<path
|
||||
d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z" />
|
||||
</svg>
|
||||
</li>
|
||||
<li class="border-b-2 border-zinc-800 dark:border-zinc-300">
|
||||
{{ category }}
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
{% block content %} {% endblock %}
|
||||
</div>
|
||||
<footer class="flex w-full text-xs justify-center mt-10 mb-6 text-zinc-500 dark:text-zinc-400">
|
||||
<div class="px-4">
|
||||
<span>{% if COPYRIGHT %}{{ COPYRIGHT }} • {% endif %}</span>Powered by
|
||||
<a class="underline" href="https://getpelican.com/">Pelican</a> &
|
||||
<a class="underline" href="https://github.com/aleylara/Papyrus"> Papyrus</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{% include 'analytics.html' %}
|
||||
{% include 'disqus_script.html' %}
|
||||
|
||||
<script>
|
||||
let themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
|
||||
let themeToggleLightIcon = document.getElementById('theme-toggle-light-icon');
|
||||
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia(
|
||||
'(prefers-color-scheme: dark)').matches)) {
|
||||
themeToggleLightIcon.classList.remove('hidden');
|
||||
} else {
|
||||
themeToggleDarkIcon.classList.remove('hidden');
|
||||
}
|
||||
let themeToggleBtn = document.getElementById('theme-toggle');
|
||||
themeToggleBtn.addEventListener('click', function () {
|
||||
themeToggleDarkIcon.classList.toggle('hidden');
|
||||
themeToggleLightIcon.classList.toggle('hidden');
|
||||
if (localStorage.getItem('color-theme')) {
|
||||
if (localStorage.getItem('color-theme') === 'light') {
|
||||
document.documentElement.classList.add('dark');
|
||||
localStorage.setItem('color-theme', 'dark');
|
||||
} else {
|
||||
document.documentElement.classList.remove('dark');
|
||||
localStorage.setItem('color-theme', 'light');
|
||||
}
|
||||
} else {
|
||||
if (document.documentElement.classList.contains('dark')) {
|
||||
document.documentElement.classList.remove('dark');
|
||||
localStorage.setItem('color-theme', 'light');
|
||||
} else {
|
||||
document.documentElement.classList.add('dark');
|
||||
localStorage.setItem('color-theme', 'dark');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<script src="https://files.stork-search.net/releases/v1.4.0/stork.js"></script>
|
||||
<script>
|
||||
stork.register("sitesearch", "{{ SITEURL }}/search-index.st")
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,21 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | Categories{% endblock %}
|
||||
{% set current = "categories" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="mb-12 md:mt-14 text-zinc-800 dark:text-zinc-300">
|
||||
<h1 class="font-bold text-4xl my-10">Categories</h1>
|
||||
<ul class="flex flex-wrap font-medium">
|
||||
{% for category, articles in categories|sort %}
|
||||
<a href="{{ SITEURL }}/{{ category.url }}">
|
||||
<li
|
||||
class="bg-zinc-300 dark:bg-neutral-700 text-zinc-800 dark:text-zinc-300 hover:bg-zinc-400 dark:hover:bg-zinc-800 m-2 py-2 px-2 md:px-4 rounded-md transition ease-in active:-translate-y-1 active:scale-110 duration-75">
|
||||
{{ category }}<sup class="p-1">{{ articles|count }}</sup></li>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,7 +0,0 @@
|
|||
{% extends "index.html" %}
|
||||
|
||||
{% block title %}{{ category }} | {{SITENAME}}{% endblock %}
|
||||
|
||||
{% block content_title %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,5 +0,0 @@
|
|||
{% if DISQUS_SITENAME %}
|
||||
<p>
|
||||
There are <a href="{{ SITEURL }}/{{ article.url }}#disqus_thread">comments</a>.
|
||||
</p>
|
||||
{% endif %}
|
|
@ -1,12 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,89 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% block content_title %}
|
||||
{% if not category and not tag %}
|
||||
<div class="my-12 md:my-24 text-zinc-800 dark:text-zinc-300">
|
||||
{% if SUBTITLE %}
|
||||
<h1 class="mb-6 text-3xl font-bold">{{ SUBTITLE }}</h1>
|
||||
{%endif%}
|
||||
{%if SUBTEXT %}
|
||||
<p class="mb-8 text-zinc-500 dark:text-zinc-400"> {{ SUBTEXT }}</p>
|
||||
{% endif %}
|
||||
{% if SOCIAL or FEED_ALL_ATOM or FEED_ALL_RSS %}
|
||||
<ul class="flex px-2 space-x-4 text-lg">
|
||||
{% for name, link in SOCIAL %}
|
||||
<li><a href="{{ link }}"><i class="fab fa-{{ name }} fa-lg" aria-hidden="true" target="_blank"
|
||||
rel="noopener noreferrer" title="{{ name }}"></i></a></li>
|
||||
{% endfor %}
|
||||
{% 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" title="{{ FEED_ALL_ATOM }}" rel="alternate"><i class="fa fa-rss fa-lg"
|
||||
aria-hidden="true"></i></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" title="{{ FEED_ALL_RSS }}" rel="alternate"><i class="fa fa-rss fa-lg"
|
||||
aria-hidden="true"></i></a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
<div class="py-1">
|
||||
<ul>
|
||||
{% for article in articles_page.object_list %}
|
||||
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">
|
||||
<li class="transition ease-in active:-translate-y-1 active:scale-110 duration-75">
|
||||
<div class="bg-white dark:bg-zinc-800 p-4 md:p-6 mb-4 rounded-lg">
|
||||
<header class="font-semibold text-2xl mb-2">
|
||||
<h1>{{ article.title }}</h1>
|
||||
</header>
|
||||
<div class="max-w-7xl container mx-auto my-4 justify-center overflow-hidden mb-2 text-sm text-zinc-800 dark:text-zinc-400
|
||||
prose lg:max-w-none prose-headings:text-zinc-800 prose-headings:dark:text-zinc-300
|
||||
prose-h1:text-3xl prose-headings:font-semibold
|
||||
prose-pre:bg-zinc-200 prose-pre:text-zinc-800
|
||||
dark:prose-pre:bg-zinc-800 dark:prose-pre:text-zinc-200
|
||||
prose-blockquote:text-zinc-800
|
||||
dark:prose-blockquote:text-zinc-200
|
||||
prose-a:text-gray-500
|
||||
dark:prose-a:text-gray-400
|
||||
dark:prose-strong:text-zinc-200
|
||||
dark:prose-code:text-zinc-200
|
||||
dark:prose-code:bg-zinc-800
|
||||
prose-code:bg-zinc-200
|
||||
prose-code:font-light
|
||||
prose-img:rounded-md
|
||||
">
|
||||
{{ article.summary }}
|
||||
</div>
|
||||
<div class="flex text-xs text-zinc-800 dark:text-zinc-400">
|
||||
<time>{{ article.date|strftime('%B %d, %Y') }}</time>
|
||||
<div>
|
||||
{% if article.readtime %}
|
||||
<span> · {{ article.readtime }} min read</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
{% if article.author != '' %}
|
||||
<span> · {{ article.author }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% if articles_page.has_other_pages() %}
|
||||
{% include 'pagination.html' %}
|
||||
{% endif %}
|
||||
|
||||
{% endblock content %}
|
|
@ -1,47 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% block html_lang %}{{ page.lang }}{% endblock %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | {{ page.title }}{%endblock%}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<main class="text-zinc-800 dark:text-zinc-300">
|
||||
<div class="max-w-7xl container mx-auto my-2 text-zinc-800 dark:text-zinc-300
|
||||
prose lg:max-w-none prose-headings:text-zinc-800 prose-headings:dark:text-zinc-300
|
||||
prose-h1:text-3xl lg:prose-h1:text-3xl prose-headings:font-semibold
|
||||
prose-pre:bg-zinc-200 prose-pre:text-zinc-800
|
||||
dark:prose-pre:bg-zinc-800 dark:prose-pre:text-zinc-200
|
||||
prose-blockquote:text-zinc-800
|
||||
dark:prose-blockquote:text-zinc-200
|
||||
prose-a:text-gray-500
|
||||
dark:prose-a:text-gray-400
|
||||
dark:prose-strong:text-zinc-200
|
||||
dark:prose-code:text-zinc-200
|
||||
dark:prose-code:bg-zinc-800
|
||||
prose-code:bg-zinc-200
|
||||
prose-code:font-light
|
||||
prose-img:rounded-md
|
||||
">
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{{ translations.translations_for(page) }}
|
||||
{{ page.content }}
|
||||
<!-- <div class="aspect-w-16 aspect-h-9 mx-auto"></div> CSS placeholder -->
|
||||
</div>
|
||||
<footer class="flex bg-zinc-200 dark:bg-zinc-700 mt-10 py-2 rounded-lg justify-center space-x-2 text-xs">
|
||||
{% for name, link in SHARE %}
|
||||
<ul>
|
||||
<a target="_blank" rel="noopener noreferrer" title="{{ name }}" aria-label="share Features on {{ name }}"
|
||||
href="{{ link }}{{ SITEURL }}/{{ page.url }}">
|
||||
<li class="bg-gray-900 p-1 text-white rounded-md">
|
||||
<i class="fab fa-{{ name }} fa-2x" aria-hidden="true"></i>
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
{% endfor %}
|
||||
</footer>
|
||||
<div>
|
||||
{% include 'disqus_script.html' %}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{% endblock %}
|
|
@ -1,20 +0,0 @@
|
|||
{% if DEFAULT_PAGINATION %}
|
||||
{% set first_page = articles_paginator.page(1) %}
|
||||
{% set last_page = articles_paginator.page(articles_paginator.num_pages) %}
|
||||
<div class="relative h-12 mt-3">
|
||||
{% if articles_page.has_previous() %}
|
||||
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}">
|
||||
<button
|
||||
class="bg-zinc-800 dark:bg-zinc-300 rounded-full py-2.5 px-4 text-zinc-100 dark:text-zinc-800 font-medium text-xs absolute left-0">
|
||||
« Prev Page
|
||||
</button></a>
|
||||
{% endif %}
|
||||
{% if articles_page.has_next() %}
|
||||
<a href="{{ SITEURL }}/{{ articles_next_page.url }}">
|
||||
<button
|
||||
class="bg-zinc-800 dark:bg-zinc-300 rounded-full py-2.5 px-4 text-zinc-100 dark:text-zinc-800 font-medium text-xs absolute right-0">
|
||||
Next Page »
|
||||
</button></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
|
@ -1,14 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | {{ period | reverse | join(' ') }} archives{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<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>
|
||||
{% endblock %}
|
|
@ -1,24 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Search | {{ SITENAME }}{% endblock %}
|
||||
{% set current = "search" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="relative mb-12 md:mt-14 text-zinc-800 dark:text-zinc-300">
|
||||
<h1 class="flex font-bold my-10 text-4xl mb-12 md:my-12 text-zinc-800 dark:text-zinc-300">Search
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||
stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<circle cx="11" cy="11" r="8"></circle>
|
||||
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
||||
</svg>
|
||||
</h1>
|
||||
<div class="stork-wrapper">
|
||||
<input
|
||||
class="font-semibold h-10 w-full border-2 border-zinc-500 bg-zinc-100 dark:bg-zinc-800 placeholder-zinc-400 dark:placeholder-zinc-300 focus:border-zinc-500 focus:outline-none rounded-lg pl-4"
|
||||
data-stork="sitesearch" autofocus="" placeholder=" Search ↵" aria-label="search" type="search">
|
||||
<div data-stork="sitesearch-output" class=""></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,7 +0,0 @@
|
|||
{% extends "index.html" %}
|
||||
|
||||
{% block title %} {{ tag }} | {{ SITENAME }}{% endblock %}
|
||||
|
||||
{% block content_title %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,22 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} | Tags{% endblock %}
|
||||
{% set current = "tags" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="mb-12 md:mt-14 text-gray-800 dark:text-gray-300">
|
||||
<h1 class="font-bold text-4xl my-10">Tags</h1>
|
||||
<ul class="flex flex-wrap font-medium">
|
||||
{% for tag, articles in tags|sort %}
|
||||
<a href="{{ SITEURL }}/{{ tag.url }}">
|
||||
<li
|
||||
class="bg-zinc-300 dark:bg-neutral-700 text-zinc-800 dark:text-zinc-300 hover:bg-zinc-400 dark:hover:bg-zinc-800 m-2 py-2 px-2 md:px-4 rounded-md transition ease-in active:-translate-y-1 active:scale-110 duration-75">
|
||||
{{ tag }}<sup class="p-1">{{ articles|count }}</sup>
|
||||
</li>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,16 +0,0 @@
|
|||
{% 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 %}
|
Loading…
Reference in New Issue