rewrite the project as a static site generator
this removes Flask, reworks a number of library methods accordingly, and adds generators and build commands to process the instance directory (largely unchanged, except config.py is now config.json) and spit out files suitable to be served by a web server such as Nginx. there are probably some rough edges here, but overall this works. also note, as this is no longer server software on a network, the license has changed from AGPLv3 to GPLv3, and the "or any later version" allowance has been removed Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
<!--
|
||||
{#
|
||||
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-only
|
||||
#}
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block header %}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
<!--
|
||||
{#
|
||||
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-only
|
||||
#}
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block header %}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
<!--
|
||||
{#
|
||||
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-only
|
||||
#}
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block header %}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<!--
|
||||
{#
|
||||
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-only
|
||||
#}
|
||||
{% extends "base.html" %}
|
||||
{% block site_class %}class="site-wrap site-wrap-double-width"{% endblock %}
|
||||
|
||||
@@ -1,21 +1,67 @@
|
||||
<!--
|
||||
<!doctype html>{#
|
||||
SPDX-FileCopyrightText: © 2020 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
<!doctype html>
|
||||
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 %}
|
||||
{% if image %}<meta property="og:image" content="{{ image }}">{% 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" href="{{ user_style }}">
|
||||
<link rel="icon" href="{% if config.FAVICON %}{{ config.FAVICON }}{% else %}{{ url_for('static', filename='img/favicon.png') }}{% endif %}">
|
||||
<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) {
|
||||
alert(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");
|
||||
alert(styleName);
|
||||
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') + "=([^;]*)"
|
||||
));
|
||||
alert(matches);
|
||||
return matches ? decodeURIComponent(matches[1]) : undefined;
|
||||
}
|
||||
|
||||
applyStyleFromCookie();
|
||||
</script>
|
||||
|
||||
<div {% block site_class %}class="site-wrap site-wrap-normal-width"{% endblock %}>
|
||||
{% block header %}
|
||||
@@ -26,11 +72,13 @@ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
{% if not loop.last %} » {% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if page_styles %}
|
||||
<div class="styles">
|
||||
{% for style in page_styles %}
|
||||
<a href="?style={{ style }}">[{{ style }}]</a>
|
||||
<a href="#" onclick="setStyle('{{ style }}'); return false;">[{{ style }}]</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
|
||||
Reference in New Issue
Block a user