92 lines
3.4 KiB
HTML
92 lines
3.4 KiB
HTML
<!doctype html>{#
|
|
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
|
SPDX-License-Identifier: GPL-3.0-only
|
|
#}
|
|
<html lang="en">
|
|
<title>{{ title }}</title>
|
|
<meta charset="utf-8">
|
|
{% if title %}<meta property="og:title" content="{{ title }}">{% endif %}
|
|
{% if description %}<meta property="og:description" content="{{ description }}">{% endif %}
|
|
<meta property="og:url" content="{{ base_url }}">
|
|
{% if image %}<meta property="og:image" content="{{ image }}">{% endif %}
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="stylesheet" type="text/css" title="{{ config.DEFAULT_PAGE_STYLE }}" href="{{ config.PAGE_STYLES[config.DEFAULT_PAGE_STYLE] }}">
|
|
{% for style, stylesheet in config.PAGE_STYLES.items() %}
|
|
<link rel="alternate stylesheet" type="text/css" title="{{ style }}" href="{{ stylesheet }}">
|
|
{% endfor %}
|
|
<link rel="icon" href="{{ config.FAVICON }}">
|
|
<link rel="alternate" type="application/atom+xml" href="/feed/atom">
|
|
<link rel="alternate" type="application/rss+xml" href="/feed/rss">
|
|
<script type="text/javascript">
|
|
// loathe as I am to use JavaScript, this style selection is one of my favorite parts
|
|
// of my CMS, so I want to keep it around even in the static site
|
|
function applyStyle(styleName) {
|
|
// disable all stylesheets except the one to apply, the user style
|
|
var i, link_tag;
|
|
for (i = 0, link_tag = document.getElementsByTagName("link"); i < link_tag.length; i++ ) {
|
|
// find the stylesheets with titles, meaning they can be disabled/enabled
|
|
if ((link_tag[i].rel.indexOf("stylesheet") != -1) && link_tag[i].title) {
|
|
link_tag[i].disabled = true;
|
|
if (link_tag[i].title == styleName) {
|
|
link_tag[i].disabled = false ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function setStyle(styleName) {
|
|
document.cookie = "user-style=" + encodeURIComponent(styleName) + "; max-age=31536000";
|
|
applyStyle(styleName);
|
|
}
|
|
|
|
|
|
function applyStyleFromCookie() {
|
|
// get the user style cookie and set that specified style as the active one
|
|
var styleName = getCookie("user-style");
|
|
if (styleName) {
|
|
applyStyle(styleName);
|
|
}
|
|
}
|
|
|
|
function getCookie(cookieName) {
|
|
// find the desired cookie from the document's cookie(s) string
|
|
let matches = document.cookie.match(new RegExp(
|
|
"(?:^|; )" + cookieName.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
|
|
));
|
|
return matches ? decodeURIComponent(matches[1]) : undefined;
|
|
}
|
|
|
|
applyStyleFromCookie();
|
|
</script>
|
|
|
|
<div {% block site_class %}class="site-wrap site-wrap-normal-width"{% endblock %}>
|
|
{% block header %}
|
|
<div class="header">
|
|
<div class="nav">
|
|
{% for nav in navs %}
|
|
<a href="{{ nav.1 }}">{{ nav.0 }}</a>
|
|
{% if not loop.last %} » {% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
{% if page_styles %}
|
|
<div class="styles">
|
|
{% for style in page_styles %}
|
|
<a href="#" onclick="setStyle('{{ style }}'); return false;">[{{ style }}]</a>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock %}
|
|
{% block body %}
|
|
<div class="content">
|
|
{{ content }}
|
|
</div>
|
|
<footer>
|
|
{% if extra_footer %}<div class="extra-footer"><i>{{ extra_footer|safe }}</i></div>{% endif %}
|
|
<div class="footer"><i>Last modified: {{ mtime }}</i></div>
|
|
</footer>
|
|
{% endblock %}
|
|
</div>
|
|
</html>
|