feat: Rewrite in Zola
This commit is contained in:
14
templates/404.html
Normal file
14
templates/404.html
Normal file
@ -0,0 +1,14 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<img src="404.png" class="full pixels transparent no-hover" />
|
||||
|
||||
<h1>Document Not Found</h1>
|
||||
|
||||
<p>The requested page could not be found. If you feel this is not normal, then you create an issue on the {{ config.extra.hosting }}.</p>
|
||||
|
||||
<p class="dialog-buttons">
|
||||
<a onclick="window.history.go(-1)" class="inline-button">Go Back</a>
|
||||
<a href="{{ config.extra.issues_url }}">File an issue</a>
|
||||
</p>
|
||||
{% endblock content %}
|
15
templates/base.html
Normal file
15
templates/base.html
Normal file
@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
{% include "includes/head.html" ignore missing -%}
|
||||
|
||||
<body>
|
||||
{% include "includes/nav.html" ignore missing -%}
|
||||
<div class="container">
|
||||
{% block custom %}{%- endblock -%}
|
||||
{% block content %}{%- endblock -%}
|
||||
</div>
|
||||
{% include "includes/footer.html" ignore missing -%}
|
||||
</body>
|
||||
|
||||
</html>
|
104
templates/blog.html
Normal file
104
templates/blog.html
Normal file
@ -0,0 +1,104 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ page.title }}</h1>
|
||||
|
||||
{%- if page.date %}
|
||||
<small>
|
||||
<time datetime='{{ page.date | date(format='%+') }}' pubdate>
|
||||
{{- page.date | date(format=config.extra.date_format) -}}
|
||||
</time>
|
||||
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
•
|
||||
{%- for item in taxon %}
|
||||
<a class="link-tag" href="{{ get_taxonomy_url(kind=name, name=item) }}">
|
||||
<svg class="link-icon" viewBox="0 0 16 16" width="16" height="16">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M4 0C1.785 0 0 1.785 0 4v3.09c0 .847.336 1.66.938 2.262l5.382 5.382c.93.934 2.43.934 3.36 0l4.965-4.964c.98-.98.98-2.56 0-3.54L9.227.812A2.777 2.777 0 0 0 7.266 0H4zm0 2h3.266c.207 0 .402.082.546.227l5.418 5.418a.512.512 0 0 1 0 .71L8.266 13.32a.38.38 0 0 1-.532 0L2.352 7.937A1.198 1.198 0 0 1 2 7.09V4c0-1.098.902-2 2-2zm.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"
|
||||
/>
|
||||
</svg>
|
||||
{{ item }}
|
||||
</a>
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
</small>
|
||||
{%- endif %}
|
||||
|
||||
{% if page.extra.archive %}
|
||||
<div class="statement-container archive">
|
||||
<h2>⚠ Archived</h2>
|
||||
{{ page.extra.archive | markdown | safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.trigger %}
|
||||
<div class="statement-container trigger">
|
||||
<h2>⚠ Trigger Warning</h2>
|
||||
{{ page.extra.trigger | markdown | safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.disclaimer %}
|
||||
<div class="statement-container disclaimer">
|
||||
<h2>⚠ Disclaimer(s)</h2>
|
||||
{{ page.extra.disclaimer | markdown | safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.toc %}
|
||||
<h2>
|
||||
Table of Contents
|
||||
</h2>
|
||||
<ul>
|
||||
{% for h1 in page.toc %}
|
||||
<li>
|
||||
<a href="{{ h1.permalink | safe }}">{{ h1.title }}</a>
|
||||
{% if h1.children %}
|
||||
<ul>
|
||||
{% for h2 in h1.children %}
|
||||
<li>
|
||||
<a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{{ page.content | safe }}
|
||||
|
||||
{% if page.extra.comments.id %}
|
||||
{% include "includes/comments.html" %}
|
||||
<hr>
|
||||
{% endif %}
|
||||
|
||||
{% if page.lower or page.higher %}
|
||||
{% if page.lower %}
|
||||
<h2>
|
||||
Read Next
|
||||
</h2>
|
||||
<a class="link-page" href="{{ page.lower.permalink }}">
|
||||
{{ page.lower.title }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.higher %}
|
||||
<h2>
|
||||
Read Previous
|
||||
</h2>
|
||||
<a class="link-page" href="{{ page.higher.permalink }}">
|
||||
{{ page.higher.title }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<p class="dialog-buttons">
|
||||
<a href="#top" class="inline-button">Go to top</a>
|
||||
<a href="{{ config.extra.issues_url }}">File an issue</a>
|
||||
</p>
|
||||
{% endblock content %}
|
41
templates/blog_list.html
Normal file
41
templates/blog_list.html
Normal file
@ -0,0 +1,41 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ config.extra.blog_title }}</h1>
|
||||
|
||||
<p>{{ config.extra.blog_description }}</p>
|
||||
|
||||
<small>
|
||||
<a class="link-page" href="{{ config.base_url }}/tags">Filter by tag</a>
|
||||
<br />
|
||||
From newest to oldest ↓
|
||||
</small>
|
||||
|
||||
{% for page in section.pages %}
|
||||
<article>
|
||||
<h2>
|
||||
<a class="link-page" href="{{ page.permalink | safe }}">{{ page.title }}</a>
|
||||
</h2>
|
||||
<small>
|
||||
<time datetime="{{ page.date | date(format='%+') }}" pubdate>
|
||||
{{- page.date | date(format=config.extra.date_format) -}}
|
||||
</time>
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
•
|
||||
{%-for item in taxon %}
|
||||
<a class="link-tag" href="{{ get_taxonomy_url(kind=name, name=item) }}">
|
||||
<svg class="link-icon" viewBox="0 0 16 16" width="16" height="16">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M4 0C1.785 0 0 1.785 0 4v3.09c0 .847.336 1.66.938 2.262l5.382 5.382c.93.934 2.43.934 3.36 0l4.965-4.964c.98-.98.98-2.56 0-3.54L9.227.812A2.777 2.777 0 0 0 7.266 0H4zm0 2h3.266c.207 0 .402.082.546.227l5.418 5.418a.512.512 0 0 1 0 .71L8.266 13.32a.38.38 0 0 1-.532 0L2.352 7.937A1.198 1.198 0 0 1 2 7.09V4c0-1.098.902-2 2-2zm.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"
|
||||
/>
|
||||
</svg>
|
||||
{{ item }}
|
||||
</a>
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
</small>
|
||||
</article>
|
||||
{% endfor %} {% endblock content %}
|
396
templates/includes/comments.html
Normal file
396
templates/includes/comments.html
Normal file
@ -0,0 +1,396 @@
|
||||
<!--
|
||||
Based on https://github.com/cassidyjames/cassidyjames.github.io/blob/99782788a7e3ba3cc52d6803010873abd1b02b9e/_includes/comments.html
|
||||
which were inspired by https://codeberg.org/jwildeboer/jwildeboersource/src/commit/45f9750bb53b9f0f6f28399ce4d21785a3bb7d22/_includes/fediverse_comments.html
|
||||
-->
|
||||
|
||||
{% if page.extra.comments.host %}
|
||||
{% set host = page.extra.comments.host %}
|
||||
{% else %}
|
||||
{% set host = config.extra.comments.host %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.comments.domain %}
|
||||
{% set domain = page.extra.comments.domain %}
|
||||
{% elif config.extra.comments.domain %}
|
||||
{% set domain = config.extra.comments.domain %}
|
||||
{% else %}
|
||||
{% set domain = host %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.comments.user %}
|
||||
{% set username = page.extra.comments.user %}
|
||||
{% else %}
|
||||
{% set username = config.extra.comments.user %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.extra.comments.token %}
|
||||
{% set token = page.extra.comments.token %}
|
||||
{% else %}
|
||||
{% set token = config.extra.comments.token %}
|
||||
{% endif %}
|
||||
|
||||
{% set id = page.extra.comments.id %}
|
||||
|
||||
{% if config.extra.comments.verified %}
|
||||
{% set verified = config.extra.comments.verified | jsonify %}
|
||||
{% else %}
|
||||
{% set verified = "[]" %}
|
||||
{% endif %}
|
||||
|
||||
<section id="comments" class="article comments">
|
||||
<h2>Comments</h2>
|
||||
<p>Comment on this blog post by publicly replying to <a href="https://{{ host }}/@{{ username }}/{{ id }}">this Mastodon post</a> using a Mastodon or other ActivityPub/Fediverse account. Known non-private replies are displayed below.</p>
|
||||
|
||||
<div id="comments-wrapper">
|
||||
<p><small>Press the button below to load comments if they exist, if not, be the first!</small></p>
|
||||
<noscript><p>Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit <a href="https://{{ host }}/@{{ username }}/{{ id }}">the original post</a> on Mastodon.</p></noscript>
|
||||
<a onclick="loadComments()" class="inline-button">Load comments…</a>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// loadComments();
|
||||
|
||||
function loadComments() {
|
||||
const HOST = "{{ host }}";
|
||||
const DOMAIN = "{{ domain }}";
|
||||
const USERNAME = "{{ username }}";
|
||||
const TOKEN = "{{ token }}";
|
||||
const VERIFIED = "{{ verified }}";
|
||||
const ID = "{{ id }}";
|
||||
|
||||
const SUPPORTED_MEDIA = [
|
||||
"image",
|
||||
"gifv",
|
||||
];
|
||||
|
||||
const STATUS_URL = `https://${ HOST }/api/v1/statuses/${ ID }`;
|
||||
|
||||
const REQUEST_HEADERS = new Headers();
|
||||
if(TOKEN != ""){
|
||||
REQUEST_HEADERS.append("Authorization", "Bearer " + TOKEN);
|
||||
}
|
||||
|
||||
const requestOptions = {
|
||||
method: "GET",
|
||||
headers: REQUEST_HEADERS,
|
||||
mode: "cors",
|
||||
cache: "default",
|
||||
};
|
||||
|
||||
const STATUS_REQUEST = new Request(STATUS_URL, requestOptions);
|
||||
const CONTEXT_REQUEST = new Request(STATUS_URL + "/context", requestOptions);
|
||||
|
||||
let commentsWrapper = document.getElementById("comments-wrapper");
|
||||
|
||||
fetch(STATUS_REQUEST).then((response) => {
|
||||
return response.json();
|
||||
}).then((status) => {
|
||||
fetch(CONTEXT_REQUEST).then((response) => {
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
let descendants = data['descendants'];
|
||||
if(
|
||||
descendants &&
|
||||
Array.isArray(descendants) &&
|
||||
descendants.length > 0
|
||||
) {
|
||||
commentsWrapper.innerHTML = "";
|
||||
descendants.unshift(status);
|
||||
|
||||
descendants.forEach((status) => {
|
||||
if( status.account.display_name.length > 0 ) {
|
||||
status.account.display_name = escapeHtml(status.account.display_name);
|
||||
status.account.display_name = emojify(
|
||||
status.account.display_name,
|
||||
status.account.emojis
|
||||
);
|
||||
} else {
|
||||
status.account.display_name = status.account.username;
|
||||
};
|
||||
|
||||
let instance = "";
|
||||
if( status.account.acct.includes("@") ) {
|
||||
instance = status.account.acct.split("@")[1];
|
||||
} else {
|
||||
instance = DOMAIN;
|
||||
}
|
||||
|
||||
status.content = emojify(status.content, status.emojis);
|
||||
|
||||
let avatarSource = document.createElement("source");
|
||||
avatarSource.setAttribute("srcset", escapeHtml(status.account.avatar));
|
||||
avatarSource.setAttribute("media", "(prefers-reduced-motion: no-preference)");
|
||||
|
||||
let avatarImg = document.createElement("img");
|
||||
avatarImg.className = "avatar";
|
||||
avatarImg.setAttribute("src", escapeHtml(status.account.avatar_static));
|
||||
avatarImg.setAttribute(
|
||||
"alt",
|
||||
`@${ status.account.username }@${ instance } avatar`
|
||||
);
|
||||
|
||||
let avatarPicture = document.createElement("picture");
|
||||
avatarPicture.appendChild(avatarSource);
|
||||
avatarPicture.appendChild(avatarImg);
|
||||
|
||||
let avatar = document.createElement("a");
|
||||
avatar.className = "avatar-link";
|
||||
avatar.setAttribute("href", status.account.url);
|
||||
avatar.setAttribute("rel", "external nofollow");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
`View profile at @${ status.account.username }@${ instance }`
|
||||
);
|
||||
avatar.appendChild(avatarPicture);
|
||||
|
||||
let instanceBadge = document.createElement("a");
|
||||
instanceBadge.className = "instance";
|
||||
instanceBadge.setAttribute("href", status.account.url);
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
`@${ status.account.username }@${ instance }`
|
||||
);
|
||||
instanceBadge.setAttribute("rel", "external nofollow");
|
||||
instanceBadge.textContent = instance;
|
||||
|
||||
let display = document.createElement("span");
|
||||
display.className = "display";
|
||||
display.setAttribute("itemprop", "author");
|
||||
display.setAttribute("itemtype", "http://schema.org/Person");
|
||||
display.innerHTML = status.account.display_name;
|
||||
|
||||
let header = document.createElement("header");
|
||||
header.className = "author";
|
||||
header.appendChild(display);
|
||||
header.appendChild(instanceBadge);
|
||||
|
||||
let permalink = document.createElement("a");
|
||||
permalink.setAttribute("href", status.url);
|
||||
permalink.setAttribute("itemprop", "url");
|
||||
permalink.setAttribute("title", `View comment at ${ instance }`);
|
||||
permalink.setAttribute("rel", "external nofollow");
|
||||
permalink.textContent = new Date(status.created_at).toLocaleString('en-GB', {
|
||||
dateStyle: "long",
|
||||
timeStyle: "short",
|
||||
});
|
||||
|
||||
let timestamp = document.createElement("time");
|
||||
timestamp.setAttribute("datetime", status.created_at);
|
||||
timestamp.appendChild(permalink);
|
||||
|
||||
if(status.edited_at != null) {
|
||||
timestamp.classList.add("edited");
|
||||
timestamp.setAttribute(
|
||||
"title",
|
||||
"Edited " + new Date(status.edited_at).toLocaleString('en-GB', {
|
||||
dateStyle: "long",
|
||||
timeStyle: "short",
|
||||
})
|
||||
)
|
||||
};
|
||||
|
||||
let main = document.createElement("main");
|
||||
main.setAttribute("itemprop", "text");
|
||||
|
||||
if(status.sensitive == true || status.spoiler_text != "") {
|
||||
let summary = document.createElement("summary");
|
||||
if(status.spoiler_text == "") {
|
||||
status.spoiler_text == "Sensitive";
|
||||
}
|
||||
summary.innerHTML = status.spoiler_text;
|
||||
|
||||
let spoiler = document.createElement("details");
|
||||
spoiler.appendChild(summary);
|
||||
spoiler.innerHTML += status.content;
|
||||
|
||||
main.appendChild(spoiler);
|
||||
} else {
|
||||
main.innerHTML = status.content;
|
||||
}
|
||||
|
||||
let interactions = document.createElement("footer");
|
||||
|
||||
if(status.reblogs_count > 0) {
|
||||
let boosts = document.createElement("span");
|
||||
boosts.className = "boosts";
|
||||
boosts.setAttribute("title", "Boosts");
|
||||
boosts.textContent = status.reblogs_count;
|
||||
|
||||
interactions.appendChild(boosts);
|
||||
}
|
||||
|
||||
if(status.favourites_count > 0) {
|
||||
let faves = document.createElement("span");
|
||||
faves.className = "faves";
|
||||
faves.setAttribute("title", "Favorites");
|
||||
faves.textContent = status.favourites_count;
|
||||
|
||||
interactions.appendChild(faves);
|
||||
}
|
||||
|
||||
let comment = document.createElement("article");
|
||||
comment.id = `comment-${ status.id }`;
|
||||
comment.className = "comment";
|
||||
comment.setAttribute("itemprop", "comment");
|
||||
comment.setAttribute("itemtype", "http://schema.org/Comment");
|
||||
comment.appendChild(avatar);
|
||||
comment.appendChild(header);
|
||||
comment.appendChild(timestamp);
|
||||
comment.appendChild(main);
|
||||
|
||||
let attachments = status.media_attachments;
|
||||
if(
|
||||
attachments &&
|
||||
Array.isArray(attachments) &&
|
||||
attachments.length > 0
|
||||
) {
|
||||
attachments.forEach((attachment) => {
|
||||
if( SUPPORTED_MEDIA.includes(attachment.type) ){
|
||||
let media = document.createElement("a");
|
||||
media.className = "card";
|
||||
media.setAttribute("href", attachment.url);
|
||||
media.setAttribute("rel", "external nofollow");
|
||||
|
||||
let mediaElement;
|
||||
switch(attachment.type){
|
||||
case "image":
|
||||
mediaElement = document.createElement("img");
|
||||
mediaElement.setAttribute("src", attachment.preview_url);
|
||||
|
||||
if(attachment.description != null) {
|
||||
mediaElement.setAttribute("alt", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
|
||||
case "gifv":
|
||||
mediaElement = document.createElement("video");
|
||||
mediaElement.setAttribute("src", attachment.url);
|
||||
mediaElement.setAttribute("autoplay", "");
|
||||
mediaElement.setAttribute("playsinline", "");
|
||||
mediaElement.setAttribute("loop", "");
|
||||
|
||||
if(attachment.description != null) {
|
||||
mediaElement.setAttribute("aria-title", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
}
|
||||
|
||||
comment.appendChild(media);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
} else if(
|
||||
status.card != null &&
|
||||
status.card.image != null &&
|
||||
!status.card.url.startsWith("{{ config.base_url }}")
|
||||
) {
|
||||
let cardImg = document.createElement("img");
|
||||
cardImg.setAttribute("src", status.card.image);
|
||||
|
||||
let cardTitle = document.createElement("h5");
|
||||
cardTitle.innerHTML = status.card.title;
|
||||
|
||||
let cardDescription = document.createElement("p");
|
||||
cardDescription.innerHTML = status.card.description;
|
||||
|
||||
let cardCaption = document.createElement("figcaption");
|
||||
cardCaption.appendChild(cardTitle);
|
||||
cardCaption.appendChild(cardDescription);
|
||||
|
||||
let cardFigure = document.createElement("figure");
|
||||
cardFigure.appendChild(cardImg);
|
||||
cardFigure.appendChild(cardCaption);
|
||||
|
||||
let card = document.createElement("a");
|
||||
card.className = "card";
|
||||
card.setAttribute("href", status.card.url);
|
||||
card.setAttribute("rel", "external nofollow");
|
||||
card.appendChild(cardFigure);
|
||||
|
||||
comment.appendChild(card);
|
||||
}
|
||||
|
||||
comment.appendChild(interactions);
|
||||
|
||||
if(status.account.acct == USERNAME) {
|
||||
comment.classList.add("op");
|
||||
|
||||
avatar.classList.add("op");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
"Blog post author; " + avatar.getAttribute("title")
|
||||
);
|
||||
|
||||
instanceBadge.classList.add("op");
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
"Blog post author: " + instanceBadge.getAttribute("title")
|
||||
);
|
||||
} else if( VERIFIED.includes(status.account.acct) ) {
|
||||
comment.classList.add("verified");
|
||||
|
||||
avatar.classList.add("verified");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
avatar.getAttribute("title") + " (verified by site owner)"
|
||||
);
|
||||
|
||||
instanceBadge.classList.add("verified");
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
instanceBadge.getAttribute("title") + " (verified by site owner)"
|
||||
);
|
||||
}
|
||||
|
||||
commentsWrapper.innerHTML += comment.outerHTML;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function emojify(input, emojis) {
|
||||
let output = input;
|
||||
|
||||
emojis.forEach(emoji => {
|
||||
let picture = document.createElement("picture");
|
||||
|
||||
let source = document.createElement("source");
|
||||
source.setAttribute("srcset", escapeHtml(emoji.url));
|
||||
source.setAttribute("media", "(prefers-reduced-motion: no-preference)");
|
||||
|
||||
let img = document.createElement("img");
|
||||
img.className = "emoji";
|
||||
img.setAttribute("src", escapeHtml(emoji.static_url));
|
||||
img.setAttribute("alt", `:${ emoji.shortcode }:`);
|
||||
img.setAttribute("title", `:${ emoji.shortcode }:`);
|
||||
img.setAttribute("width", "20");
|
||||
img.setAttribute("height", "20");
|
||||
|
||||
picture.appendChild(source);
|
||||
picture.appendChild(img);
|
||||
|
||||
output = output.replace(`:${ emoji.shortcode }:`, picture.outerHTML);
|
||||
});
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
function escapeHtml(unsafe) {
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/'/g, "'")
|
||||
.replace(/"/g, """)
|
||||
;
|
||||
}
|
||||
</script>
|
||||
</section>
|
21
templates/includes/footer.html
Normal file
21
templates/includes/footer.html
Normal file
@ -0,0 +1,21 @@
|
||||
<footer class="site-footer">
|
||||
{% if config.extra.footer.show_copyright %}
|
||||
<p title="Last built at {{ now() | date(format='%F %R %Z') }}">© {{ config.title }}, 2023</p>
|
||||
{% endif %}
|
||||
|
||||
{% if config.extra.footer.show_source %}
|
||||
<p><a href="{{ config.extra.source_url }}">Website source</a></p>
|
||||
{% endif %}
|
||||
|
||||
{% if config.extra.footer.show_powered_by %}
|
||||
<p><small>Powered by <a href="https://www.getzola.org">Zola</a> and <a href="https://duckquill.exozy.me">Duckquill</a></small></p>
|
||||
{% endif %}
|
||||
|
||||
{% if config.extra.footer.show_johnvert %}
|
||||
<small>
|
||||
<details><summary>Johnvertisement</summary>
|
||||
<iframe class="johnvertisement" title="Johnvertisement" src="https://john.citrons.xyz/embed?ref={{ config.extra.footer.johnvert_ref }}"></iframe>
|
||||
</details>
|
||||
</small>
|
||||
{% endif %}
|
||||
</footer>
|
20
templates/includes/head.html
Normal file
20
templates/includes/head.html
Normal file
@ -0,0 +1,20 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="{{ config.extra.accent_color }}" />
|
||||
|
||||
<title>{% block title %}{{ config.title }}{% endblock title %}</title>
|
||||
|
||||
<link href="{{ get_url(path='style.css') }}" rel="stylesheet" />
|
||||
|
||||
<link rel="icon" type="image/gif" href="{{ config.base_url }}/favicon.gif" />
|
||||
<link rel="icon" type="image/png" href="{{ config.base_url }}/favicon.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ config.base_url }}/apple-touch-icon.png" />
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:title" content="{{ config.title }}" />
|
||||
<meta property="og:url" content="{{ config.base_url }}" />
|
||||
<meta property="og:description" content="{{ config.description }}" />
|
||||
<meta property="og:image" content="{{ config.base_url }}/card.png" />
|
||||
</head>
|
25
templates/includes/nav.html
Normal file
25
templates/includes/nav.html
Normal file
@ -0,0 +1,25 @@
|
||||
<nav class="site-nav">
|
||||
<div class="site-nav-container">
|
||||
<a class="site-nav-title" href="{{ config.base_url }}">
|
||||
{{ config.title }}
|
||||
</a>
|
||||
<ul>
|
||||
{% for link in config.extra.nav_links %}
|
||||
<li>
|
||||
<a href="{{link.url}}">{{link.name}}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
<li>
|
||||
<a href="{{ config.base_url }}/atom.xml">
|
||||
<svg class="link-icon" viewBox="0 0 16 16" width="16" height="16">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M1.988 1.988V3c.008.547.453.984 1 .988.004-.004.008-.004.012-.004v.028A8.977 8.977 0 0 1 11.988 13a.991.991 0 0 0 1 .984h1V13h-.004c0-.004 0-.004.004-.008C13.984 7.02 9.184 2.148 3.242 2.02A1.004 1.004 0 0 0 3 1.988v-.004zm0 4V7c.008.547.453.984 1 .988.004-.004.008-.004.012-.004V8a4.985 4.985 0 0 1 4.996 4.844 1.002 1.002 0 0 0 .988 1.145c.008-.005.012-.005.016-.005v.004h.984V13H10c0-3.793-3.047-6.898-6.82-6.992 0-.004-.004-.004-.004-.004A.892.892 0 0 0 3 5.988v-.004zm2 4a1.999 1.999 0 1 0-.002 3.998 1.999 1.999 0 0 0 .002-3.998zm0 0"
|
||||
/>
|
||||
</svg>
|
||||
Feed
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
5
templates/index.html
Normal file
5
templates/index.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{{ section.content | safe }}
|
||||
{% endblock content %}
|
5
templates/page.html
Normal file
5
templates/page.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{{ page.content | safe }}
|
||||
{% endblock content %}
|
5
templates/section.html
Normal file
5
templates/section.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{{ section.content | safe }}
|
||||
{% endblock content %}
|
3
templates/shortcodes/crt.html
Normal file
3
templates/shortcodes/crt.html
Normal file
@ -0,0 +1,3 @@
|
||||
<div class="crt scanlines">
|
||||
{{ body | markdown | safe }}
|
||||
</div>
|
12
templates/shortcodes/image.html
Normal file
12
templates/shortcodes/image.html
Normal file
@ -0,0 +1,12 @@
|
||||
<a href="{{url}}">
|
||||
<img
|
||||
class="
|
||||
{% if full %}full{% endif %}
|
||||
{% if pixels %}pixels{% endif %}
|
||||
{% if transparent %}transparent{% endif %}
|
||||
{% if no_hover %}no-hover{% endif %}
|
||||
"
|
||||
{% if alt %}alt="{{alt}}"{% endif %}
|
||||
src="{% if url_min %}{{url_min}}{% else %}{{url}}{% endif %}"
|
||||
/>
|
||||
</a>
|
10
templates/shortcodes/video.html
Normal file
10
templates/shortcodes/video.html
Normal file
@ -0,0 +1,10 @@
|
||||
<video
|
||||
class="
|
||||
{% if full %}full{% endif %}
|
||||
{% if pixels %}pixels{% endif %}
|
||||
{% if transparent %}transparent{% endif %}
|
||||
"
|
||||
{% if alt %}alt="{{alt}}"{% endif %}
|
||||
controls
|
||||
src="{{url}}">
|
||||
</video>
|
27
templates/taxonomy_list.html
Normal file
27
templates/taxonomy_list.html
Normal file
@ -0,0 +1,27 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Tags</h1>
|
||||
<small> {{ terms | length }} tags in total </small>
|
||||
<article>
|
||||
<br />
|
||||
<br />
|
||||
{% for tag in terms %}
|
||||
<small>
|
||||
<a
|
||||
class="link-tag"
|
||||
href="{{ get_taxonomy_url(kind='tags', name=tag.name) }}"
|
||||
>
|
||||
<svg class="link-icon" viewBox="0 0 16 16" width="16" height="16">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M4 0C1.785 0 0 1.785 0 4v3.09c0 .847.336 1.66.938 2.262l5.382 5.382c.93.934 2.43.934 3.36 0l4.965-4.964c.98-.98.98-2.56 0-3.54L9.227.812A2.777 2.777 0 0 0 7.266 0H4zm0 2h3.266c.207 0 .402.082.546.227l5.418 5.418a.512.512 0 0 1 0 .71L8.266 13.32a.38.38 0 0 1-.532 0L2.352 7.937A1.198 1.198 0 0 1 2 7.09V4c0-1.098.902-2 2-2zm.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"
|
||||
/>
|
||||
</svg>
|
||||
{{ tag.name }}
|
||||
</a>
|
||||
<br />
|
||||
</small>
|
||||
{% endfor %}
|
||||
</article>
|
||||
{% endblock content %}
|
40
templates/taxonomy_single.html
Normal file
40
templates/taxonomy_single.html
Normal file
@ -0,0 +1,40 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Posts with tag “{{ term.name }}”</h1>
|
||||
<small>
|
||||
<a class="link-page" href="{{ config.base_url }}/tags">See all tags</a>
|
||||
<br />
|
||||
{{ term.pages | length }} posts in total
|
||||
</small>
|
||||
<article>
|
||||
{% for page in term.pages %}
|
||||
<h2>
|
||||
<a class="link-page" href="{{ page.permalink | safe }}">
|
||||
{{ page.title }}
|
||||
</a>
|
||||
</h2>
|
||||
<small>
|
||||
<time datetime='{{ page.date | date(format='%+') }}' pubdate>
|
||||
{{- page.date | date(format=config.extra.date_format) -}}
|
||||
</time>
|
||||
{%- if page.taxonomies %}
|
||||
{%- for name, taxon in page.taxonomies %}
|
||||
•
|
||||
{%- for item in taxon %}
|
||||
<a class="link-tag" href="{{ get_taxonomy_url(kind=name, name=item) }}">
|
||||
<svg class="link-icon" viewBox="0 0 16 16" width="16" height="16">
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M4 0C1.785 0 0 1.785 0 4v3.09c0 .847.336 1.66.938 2.262l5.382 5.382c.93.934 2.43.934 3.36 0l4.965-4.964c.98-.98.98-2.56 0-3.54L9.227.812A2.777 2.777 0 0 0 7.266 0H4zm0 2h3.266c.207 0 .402.082.546.227l5.418 5.418a.512.512 0 0 1 0 .71L8.266 13.32a.38.38 0 0 1-.532 0L2.352 7.937A1.198 1.198 0 0 1 2 7.09V4c0-1.098.902-2 2-2zm.5 1a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"
|
||||
/>
|
||||
</svg>
|
||||
{{ item }}
|
||||
</a>
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
</small>
|
||||
{% endfor %}
|
||||
</article>
|
||||
{% endblock content %}
|
Reference in New Issue
Block a user