Remove old site design

This commit is contained in:
Shadowfacts 2025-02-20 10:13:26 -05:00
parent eacdf85629
commit c5346bc15f
315 changed files with 920 additions and 9877 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,79 +0,0 @@
workspace = { members = [
"crates/compute_graph",
"crates/compute_graph_macros",
"crates/derive_test",
] }
[package]
name = "v6"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
[dependencies]
activitystreams = "0.7.0-alpha.22"
activitystreams-ext = "0.1.0-alpha.3"
ammonia = "3.2"
anyhow = "1.0"
askama = "0.11.1"
axum = "0.5.6"
base64 = "0.13"
chrono = { version = "0.4", features = ["serde"] }
clap = { version = "3.1", features = ["cargo"] }
compute_graph = { path = "crates/compute_graph" }
env_logger = "0.9"
futures = "0.3"
html5ever = "0.26"
http-signature-normalization = "0.6"
hyper = "0.14"
log = "0.4"
markup5ever_rcdom = "0.2"
mime = "0.3"
notify = "5.0.0-pre.16"
notify-debouncer-mini = { version = "*", default-features = false }
once_cell = "1.13"
# NOTE: openssl version also needs to be updated in ios target config below
openssl = "0.10"
pulldown-cmark = "0.9"
regex = "1.5"
reqwest = { version = "0.11", features = ["json"] }
rsass = "0.25"
rss = { version = "2.0", features = ["atom"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
splash-rs = { version = "0.3.1", git = "https://git.shadowfacts.net/shadowfacts/splash-rs.git" }
sqlx = { version = "0.5", features = ["runtime-tokio-native-tls", "sqlite"] }
thiserror = "1.0"
tokio = { version = "1.18", features = ["full"] }
tokio-cron-scheduler = "0.8"
tokio-stream = { version = "0.1.8", features = ["fs"] }
toml = "0.5"
tower = "0.4"
tower-http = { version = "0.3", features = ["fs"] }
# should be from crates.io
tree-sitter-bash = { version = "0.20", git = "https://git.shadowfacts.net/shadowfacts/tree-sitter-bash.git" }
tree-sitter-c = "0.20"
# should be https://github.com/tree-sitter/tree-sitter-css.git
tree-sitter-css = { version = "0.20", git = "https://git.shadowfacts.net/shadowfacts/tree-sitter-css.git" }
tree-sitter-elixir = { version = "0.19", git = "https://github.com/elixir-lang/tree-sitter-elixir.git" }
tree-sitter-highlight = "0.20"
# should be from crates.io
tree-sitter-html = { version = "0.20", git = "https://git.shadowfacts.net/shadowfacts/tree-sitter-html.git" }
# should be from crates.io
tree-sitter-java = { version = "0.20", git = "https://github.com/tree-sitter/tree-sitter-java.git" }
tree-sitter-javascript = "0.20"
tree-sitter-json = { version = "0.20", git = "https://github.com/tree-sitter/tree-sitter-json.git" }
# should be https://github.com/jiyee/tree-sitter-objc.git
tree-sitter-objc = { version = "1.0.0", git = "https://git.shadowfacts.net/shadowfacts/tree-sitter-objc.git" }
tree-sitter-rust = "0.20"
unicode-normalization = "0.1.19"
url = "2.2"
uuid = { version = "1.1", features = ["v4"] }
[target.'cfg(target_os = "ios")'.dependencies]
openssl = { version = "0.10", features = ["vendored"] }

View File

@ -1,28 +0,0 @@
create table if not exists articles (
id text primary key not null,
conversation text not null,
has_federated boolean not null,
article_object text not null
);
create table if not exists actors (
id text primary key not null,
actor_object text not null,
is_follower boolean not null default 0,
display_name text,
inbox text not null,
shared_inbox text,
icon_url text,
public_key_pem text
);
create table if not exists notes (
id text primary key not null,
content text not null,
in_reply_to text not null,
conversation text not null,
published text not null, -- RFC 3339 formatted date (e.g., 1985-04-12T23:20:50.52Z)
actor_id text not null,
digested boolean not null default 0,
foreign key (actor_id) references actors (id) on delete cascade
);

View File

@ -1,20 +1,31 @@
{% extends "layout/default.html" %}
{% block title %}Archive{% endblock %}
{% block content %}
{% for (year, posts) in years %}
<h2>{{ year }}</h2>
<ul>
{% for post in posts %}
<li>
<a href="{{ post.permalink }}">
{{ post.title }}
</a>
</li>
{% endfor %}
</ul>
{% endfor %}
{% extends "default" %}
{% block titlevariable %}
{% set title = "Archive" %}
{% endblock %}
{% block content -%}
<h1 class="headline">Archive</h1>
{% for year in years %}
<div class="archive-list">
{% for entry in posts_by_year[year] %}
<code>
<time datetime="{{ entry.date | iso_datetime }}">
{{ entry.date | iso_date }}
</time>
</code>
<div>
<a href="{{ entry.permalink }}">
{{ entry.title }}
</a>
</div>
{% endfor %}
</div>
{% if not loop.last %}
<hr>
{% endif %}
{% endfor %}
{%- endblock %}

View File

@ -1,5 +0,0 @@
@import "light.scss";
@media (prefers-color-scheme: dark) {
@import "dark.scss";
}

View File

@ -1,59 +0,0 @@
:root {
--accent-color: var(--dark-accent-color);
--content-background-color: var(--dark-content-background-color);
--shadow-color: var(--dark-shadow-color);
--ui-background-color: var(--dark-ui-background-color);
--ui-text-color: var(--dark-ui-text-color);
--secondary-ui-text-color: var(--dark-secondary-ui-text-color);
--content-text-color: var(--dark-content-text-color);
--aside-background: var(--dark-aside-background);
--aside-border: var(--dark-aside-border);
--aside-warning-background: var(--dark-aside-warning-background);
--aside-warning-border: var(--dark-aside-warning-border);
--webring-background: var(--dark-webring-background);
// Syntax highdarking
--atom-base: var(--dark-atom-base);
--atom-mono-1: var(--dark-atom-mono-1);
--atom-mono-2: var(--dark-atom-mono-2);
--atom-mono-3: var(--dark-atom-mono-3);
--atom-hue-1: var(--dark-atom-hue-1);
--atom-hue-2: var(--dark-atom-hue-2);
--atom-hue-3: var(--dark-atom-hue-3);
--atom-hue-4: var(--dark-atom-hue-4);
--atom-hue-5: var(--dark-atom-hue-5);
--atom-hue-5-2: var(--dark-atom-hue-5-2);
--atom-hue-6: var(--dark-atom-hue-6);
--atom-hue-6-2: var(--dark-atom-hue-6-2);
}
.theme-inverted {
--accent-color: var(--light-accent-color);
--content-background-color: var(--light-content-background-color);
--shadow-color: var(--light-shadow-color);
--ui-background-color: var(--light-ui-background-color);
--ui-text-color: var(--light-ui-text-color);
--secondary-ui-text-color: var(--light-secondary-ui-text-color);
--content-text-color: var(--light-content-text-color);
--aside-background: var(--light-aside-background);
--aside-border: var(--light-aside-border);
--aside-warning-background: var(--light-aside-warning-background);
--aside-warning-border: var(--light-aside-warning-border);
// Syntax highlighting
--atom-base: var(--light-atom-base);
--atom-mono-1: var(--light-atom-mono-1);
--atom-mono-2: var(--light-atom-mono-2);
--atom-mono-3: var(--light-atom-mono-3);
--atom-hue-1: var(--light-atom-hue-1);
--atom-hue-2: var(--light-atom-hue-2);
--atom-hue-3: var(--light-atom-hue-3);
--atom-hue-4: var(--light-atom-hue-4);
--atom-hue-5: var(--light-atom-hue-5);
--atom-hue-5-2: var(--light-atom-hue-5-2);
--atom-hue-6: var(--light-atom-hue-6);
--atom-hue-6-2: var(--light-atom-hue-6-2);
}

View File

Before

Width:  |  Height:  |  Size: 772 B

After

Width:  |  Height:  |  Size: 772 B

File diff suppressed because one or more lines are too long

View File

@ -1,59 +0,0 @@
:root {
--accent-color: var(--light-accent-color);
--content-background-color: var(--light-content-background-color);
--shadow-color: var(--light-shadow-color);
--ui-background-color: var(--light-ui-background-color);
--ui-text-color: var(--light-ui-text-color);
--secondary-ui-text-color: var(--light-secondary-ui-text-color);
--content-text-color: var(--light-content-text-color);
--aside-background: var(--light-aside-background);
--aside-border: var(--light-aside-border);
--aside-warning-background: var(--light-aside-warning-background);
--aside-warning-border: var(--light-aside-warning-border);
--webring-background: var(--light-webring-background);
// Syntax highlighting
--atom-base: var(--light-atom-base);
--atom-mono-1: var(--light-atom-mono-1);
--atom-mono-2: var(--light-atom-mono-2);
--atom-mono-3: var(--light-atom-mono-3);
--atom-hue-1: var(--light-atom-hue-1);
--atom-hue-2: var(--light-atom-hue-2);
--atom-hue-3: var(--light-atom-hue-3);
--atom-hue-4: var(--light-atom-hue-4);
--atom-hue-5: var(--light-atom-hue-5);
--atom-hue-5-2: var(--light-atom-hue-5-2);
--atom-hue-6: var(--light-atom-hue-6);
--atom-hue-6-2: var(--light-atom-hue-6-2);
}
.theme-inverted {
--accent-color: var(--dark-accent-color);
--content-background-color: var(--dark-content-background-color);
--shadow-color: var(--dark-shadow-color);
--ui-background-color: var(--dark-ui-background-color);
--ui-text-color: var(--dark-ui-text-color);
--secondary-ui-text-color: var(--dark-secondary-ui-text-color);
--content-text-color: var(--dark-content-text-color);
--aside-background: var(--dark-aside-background);
--aside-border: var(--dark-aside-border);
--aside-warning-background: var(--dark-aside-warning-background);
--aside-warning-border: var(--dark-aside-warning-border);
// Syntax highdarking
--atom-base: var(--dark-atom-base);
--atom-mono-1: var(--dark-atom-mono-1);
--atom-mono-2: var(--dark-atom-mono-2);
--atom-mono-3: var(--dark-atom-mono-3);
--atom-hue-1: var(--dark-atom-hue-1);
--atom-hue-2: var(--dark-atom-hue-2);
--atom-hue-3: var(--dark-atom-hue-3);
--atom-hue-4: var(--dark-atom-hue-4);
--atom-hue-5: var(--dark-atom-hue-5);
--atom-hue-5-2: var(--dark-atom-hue-5-2);
--atom-hue-6: var(--dark-atom-hue-6);
--atom-hue-6-2: var(--dark-atom-hue-6-2);
}

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
@ -21,7 +21,7 @@ html {
*/
body {
margin: 0;
margin: 0;
}
/**
@ -29,7 +29,7 @@ body {
*/
main {
display: block;
display: block;
}
/**
@ -38,8 +38,8 @@ main {
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
@ -51,9 +51,9 @@ h1 {
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
@ -62,8 +62,8 @@ hr {
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
@ -74,7 +74,7 @@ pre {
*/
a {
background-color: transparent;
background-color: transparent;
}
/**
@ -83,9 +83,9 @@ a {
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
@ -94,7 +94,7 @@ abbr[title] {
b,
strong {
font-weight: bolder;
font-weight: bolder;
}
/**
@ -105,8 +105,8 @@ strong {
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
@ -114,7 +114,7 @@ samp {
*/
small {
font-size: 80%;
font-size: 80%;
}
/**
@ -124,18 +124,18 @@ small {
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
bottom: -0.25em;
}
sup {
top: -0.5em;
top: -0.5em;
}
/* Embedded content
@ -146,7 +146,7 @@ sup {
*/
img {
border-style: none;
border-style: none;
}
/* Forms
@ -162,10 +162,10 @@ input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
@ -174,8 +174,9 @@ textarea {
*/
button,
input { /* 1 */
overflow: visible;
input {
/* 1 */
overflow: visible;
}
/**
@ -184,8 +185,9 @@ input { /* 1 */
*/
button,
select { /* 1 */
text-transform: none;
select {
/* 1 */
text-transform: none;
}
/**
@ -196,7 +198,7 @@ button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
-webkit-appearance: button;
}
/**
@ -207,8 +209,8 @@ button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
border-style: none;
padding: 0;
}
/**
@ -219,7 +221,7 @@ button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
outline: 1px dotted ButtonText;
}
/**
@ -227,7 +229,7 @@ button:-moz-focusring,
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
padding: 0.35em 0.75em 0.625em;
}
/**
@ -238,12 +240,12 @@ fieldset {
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
@ -251,7 +253,7 @@ legend {
*/
progress {
vertical-align: baseline;
vertical-align: baseline;
}
/**
@ -259,7 +261,7 @@ progress {
*/
textarea {
overflow: auto;
overflow: auto;
}
/**
@ -269,8 +271,8 @@ textarea {
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
@ -279,7 +281,7 @@ textarea {
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
height: auto;
}
/**
@ -288,8 +290,8 @@ textarea {
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
@ -297,7 +299,7 @@ textarea {
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
-webkit-appearance: none;
}
/**
@ -306,8 +308,8 @@ textarea {
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
@ -318,7 +320,7 @@ textarea {
*/
details {
display: block;
display: block;
}
/*
@ -326,7 +328,7 @@ details {
*/
summary {
display: list-item;
display: list-item;
}
/* Misc
@ -337,7 +339,7 @@ summary {
*/
template {
display: none;
display: none;
}
/**
@ -345,5 +347,5 @@ template {
*/
[hidden] {
display: none;
display: none;
}

View File

@ -1,97 +1,67 @@
/*
Atom One color scheme by Daniel Gamage
Modified to use colors from CSS vars, defined in theme.scss
*/
:root {
--solarized-base01: #586e75;
--solarized-base00: #657b83;
/* --solarized-base0: #839496; */
--solarized-base1: #93a1a1;
--solarized-base2: #eee8d5;
--solarized-base3: #fdf6e3;
--solarized-yellow: #b58900;
--solarized-orange: #cb4b16;
--solarized-red: #dc322f;
--solarized-blue: #268bd2;
--solarized-cyan: #2aa198;
--solarized-green: #859900;
}
.highlight {
display: block;
overflow-x: auto;
padding: 0.5em;
color: var(--atom-mono-1);
background: var(--atom-base);
display: block;
overflow-x: auto;
padding: 0.5em;
color: var(--solarized-base01);
// darkened base2
background: darken(#eee8d5, 5%);
}
.highlight > code {
display: block;
display: block;
}
.hl-cmt,
.hljs-quote {
color: var(--atom-mono-3);
font-style: italic;
.hl-cmt {
color: var(--solarized-base00);
font-style: italic;
}
.hljs-doctag,
.hl-kw,
.hljs-formula,
.hl-const {
color: var(--atom-hue-3);
color: var(--solarized-green);
}
.hljs-section,
.hljs-name,
.hljs-selector-tag,
.hljs-deletion,
.hljs-subst,
.hl-punct-sp,
.hl-tag {
color: var(--atom-hue-5);
color: var(--solarized-blue);
}
.hl-emb {
color: var(--atom-mono-1);
color: var(--solarized-base01);
}
.hljs-literal,
.hl-attr,
.hl-mod,
.hl-key {
color: var(--atom-hue-1);
}
.hl-str,
.hljs-regexp,
.hljs-addition,
.hljs-meta-string {
color: var(--atom-hue-4);
}
.hl-key,
.hl-prop {
color: var(--atom-hue-1);
color: var(--solarized-red);
}
.hl-str {
color: var(--solarized-cyan);
}
.hl-builtin,
.hljs-class .hljs-title {
color: var(--atom-hue-6-2);
}
.hljs-attr,
.hljs-template-variable,
.hl-type,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hl-num {
color: var(--atom-hue-6);
color: var(--solarized-yellow);
}
.hljs-symbol,
.hljs-bullet,
.hljs-link,
.hljs-meta,
.hljs-selector-id,
.hl-fn {
color: var(--atom-hue-2);
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-link {
text-decoration: underline;
color: var(--solarized-orange);
}

View File

@ -1,26 +0,0 @@
<article itemscope itemtype="https://schema.org/BlogPosting">
<h2 class="article-title" itemprop="headline">
<a href="{{ post.permalink() }}" itemprop="url mainEntityOfPage">
{% match post.metadata.html_title %}
{% when Some with (html) %}
{{ html|safe }}
{% when None %}
{{ post.metadata.title }}
{% endmatch %}
</a>
</h2>
{% include "includes/article-meta.html" %}
<div class="article-content" itemprop="description">
{% match post.excerpt %}
{% when Some with (excerpt) %}
{{ excerpt|safe }}
{% when None %}
{{ post.content.html()|safe }}
{% endmatch %}
</div>
{% if post.excerpt.is_some() %}
<p class="read-more-link">
<a href="{{ post.permalink() }}">Read more...</a>
</p>
{% endif %}
</article>

View File

@ -1,27 +0,0 @@
<p class="article-meta">
<span itemprop="author" itemscope="" itemtype="https://schema.org/Person">
<meta itemprop="name" content="Shadowfacts">
</span>
on
<span>
<time itemprop="datePublished" datetime="{{ post.metadata.date|iso_datetime }}" title="{{ post.metadata.date|pretty_datetime }}">
{{ post.metadata.date|pretty_date }}
</time>
</span>
{% match post.metadata.tags %}
{% when Some with (tags) %}
in
{% for tag in tags %}
<span itemprop="articleSection">
<a href="/{{ tag.slug }}/">{{ tag.name }}</a>{% if !loop.last %},{% endif %}
</span>
{% endfor %}
{% when None %}
{% endmatch %}
{% match post.word_count %}
{% when Some with (wc) %}
<span title="{{ wc }} words">{{ wc|reading_time }} min read</span>
{% when None %}
{% endmatch %}
</p>

View File

@ -1,29 +0,0 @@
<div class="pagination" role="navigation">
<p>
<span class="pagination-link">
{% match pagination_info.prev_href %}
{% when Some with (href) %}
<a href="{{ href }}">
<span class="arrow arrow-left" aria-hidden="true"></span>
<span>Previous</span>
</a>
{% when None %}
<span class="arrow arrow-left" aria-hidden="true"></span>
<span>Previous</span>
{% endmatch %}
</span>
Page {{ pagination_info.page }} of {{ pagination_info.total_pages }}
<span class="pagination-link">
{% match pagination_info.next_href %}
{% when Some with (href) %}
<a href="{{ href }}">
<span>Next</span>
<span class="arrow arrow-right" aria-hidden="true"></span>
</a>
{% when None %}
<span>Next</span>
<span class="arrow arrow-right" aria-hidden="true"></span>
{% endmatch %}
</span>
</p>
</div>

View File

@ -1,13 +1,71 @@
{% extends "layout/default.html" %}
{% extends "default" %}
{% block title %}Shadowfacts{% endblock %}
{% block footer_vars %}
{% set footer_links = false %}
{% endblock %}
{% block content -%}
{% for post in posts %}
{% include "includes/article-listing.html" %}
{% endfor %}
<h2 class="headline">About Me</h2>
<div class="body-content">
<p class="about">
Hi.
My day job is building software for people who pay me to build software.
In the evenings, I build software for people who don&rsquo;t pay me to build software (myself included).
I mostly write about building software on here.
That probably doesn&rsquo;t come as a shock.
</p>
</div>
{% include "includes/pagination.html" %}
<h2 class="headline">
Latest Post:
<a href="{{ latest_post_permalink }}">
{{ latest_post.metadata.title }}
</a>
</h2>
<p class="article-meta">
Published on
<time itemprop="datePublished" datetime="{{ latest_post.metadata.date | iso_datetime }}">
{{ latest_post.metadata.date | pretty_date }},
</time>
in
{% for tag in latest_post.metadata.tags %}
<span itemprop="articleSection">
<a href="/{{ tag.slug }}/">{{ tag.name }}</a>{% if loop.last %}.{% else %},{% endif %}
</span>
{% endfor %}
<span title="{{ latest_post.word_count }} word{% if latest_post.word_count != 1 %}s{% endif %}">
{{ latest_post.word_count | reading_time }}&nbsp;minute&nbsp;read.
</span>
</p>
<div class="body-content">
{% if latest_post.excerpt %}
{{ latest_post.excerpt }}
<p>
<a href="{{ latest_post_permalink }}" class="italic">Read more…</a>
</p>
{% else %}
{{ latest_post_content }}
{% endif %}
</div>
<h2 class="headline">Other Things</h2>
{%- endblock %}
{% block footer_links %}
{% set additional_links = [
"TV Commentary", "/tv/",
"Modding Tutorials", "/tutorials/",
] %}
{% endblock %}
{% block after_footer_links %}
<p>
<span class="webring">
<a href="https://metro.bieszczady.pl" class="no-external-link-decoration">Metro Bieszczady Webring</a>
<a title="previous page in webring" href="https://metro.bieszczady.pl/cgi-bin/webring?action=previous&amp;from=shadowfacts" class="no-external-link-decoration"></a>
<a title="next page in webring" href="https://metro.bieszczady.pl/cgi-bin/webring?action=next&amp;from=shadowfacts" class="no-external-link-decoration"></a>
</span>
</p>
{% endblock %}

View File

@ -1,77 +1,82 @@
{% extends "layout/default.html" %}
{% extends "default" %}
{% block titlevariable %}
{% set title = metadata.title %}
{% endblock %}
{% block head -%}
{% match post.metadata.short_desc %}
{% when Some with (val) %}
<meta property="og:type" content="article">
<meta property="og:description" content="{{ val }}">
{% when None %}
<meta property="og:type" content="website">
<meta property="og:description" content="The outer part of a shadow is called the penumbra.">
{% endmatch %}
<meta property="og:type" content="article">
{% if metadata.short_desc %}
<meta property="og:description" content="{{ metadata.short_desc }}">
{% else %}
<meta property="og:description" content="The outer part of a shadow is called the penumbra.">
{% endif %}
{%- endblock %}
{% block image %}
{% match post.metadata.card_image_path %}
{% when Some with (path) %}
<meta property="twitter:image" content="https://{{ Self::domain() }}{{ path }}">
<meta property="og:image" content="https://{{ Self::domain() }}{{ path }}">
{% when None %}
<meta property="twitter:image" content="https://{{ Self::domain() }}/shadowfacts.png">
<meta property="og:image" content="https://{{ Self::domain() }}/shadowfacts.png">
{% endmatch %}
{% if metadata.card_image_path %}
<meta property="twitter:image" content="https://{{ _domain }}{{ metadata.card_image_path }}">
<meta property="og:image" content="https://{{ _domain }}{{ metadata.card_image_path }}">
{% else %}
<meta property="twitter:image" content="https://{{ _domain }}/shadowfacts.png">
<meta property="og:image" content="https://{{ _domain }}/shadowfacts.png">
{% endif %}
{% endblock %}
{% block title %}{{ post.metadata.title }}{% endblock %}
{% block content -%}
<article itemprop="blogPost" itemscope itematype="https://schema.org/BlogPosting">
<meta itemprop="mainEntityOfPage" content="https://{{ Self::domain() }}{{ self.permalink() }}">
<h1 class="article-title" itemprop="name headline">
{% match post.metadata.html_title %}
{% when Some with (html) %}
{{ html|safe }}
{% when None %}
{{ post.metadata.title }}
{% endmatch %}
</h1>
{% include "includes/article-meta.html" %}
<div class="article-content" itemprop="articleBody">
{% match post.metadata.preamble %}
{% when Some with (html) %}
{{ html|safe }}
{% when None %}
{% endmatch %}
{{ post.content.html()|safe }}
</div>
<details id="comments-container">
<summary>
<h2 id="comments-container-title">Comments</h2>
</summary>
<p class="comments-info">
Comments powered by ActivityPub. To respond to this post, enter your username and instance below, or copy its URL into the search interface for client for Mastodon, Pleroma, or other compatible software.
<a href="/2019/reincarnation/#activity-pub">Learn more</a>.
</p>
<form id="remote-interact" action="/interact" method="POST">
<span>Reply from your instance:</span>
<input type="hidden" name="permalink" value="{{ post.comments_permalink() }}">
<!-- name needs to be exactly this to get the browser to use the same completions as mastodon -->
<input type="text" placeholder="Enter your user@domain" required id="acct" name="remote_follow[acct]">
<input type="submit" value="Interact">
</form>
<noscript>
<p id="comments-js-warning">JavaScript is required to display comments.</p>
</noscript>
</details>
<article itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<meta itemprop="mainEntityOfPage" content="https://{{ _domain }}{{ _permalink }}">
<h1 class="headline" itemprop="name headline">
{% if metadata.html_title %}
{{ metadata.html_title }}
{% else %}
{{ metadata.title }}
{% endif %}
</h1>
<p class="article-meta">
Published on
<time itemprop="datePublished" datetime="{{ metadata.date | iso_datetime }}">
{{ metadata.date | pretty_date }},
</time>
in
{% for tag in metadata.tags %}
<span itemprop="articleSection">
<a href="/{{ tag.slug }}/">{{ tag.name }}</a>{% if loop.last %}.{% else %},{% endif %}
</span>
{% endfor %}
<span title="{{ word_count }} word{% if word_count != 1 %}s{% endif %}">
{{ word_count | reading_time }} minute read.
</span>
</p>
<div class="body-content" itemprop="articleBody">
{% if metadata.preamble %}
{{ metadata.preamble }}
{% endif %}
{{ content }}
</div>
</article>
{% if metadata.comments_post_id %}
<hr>
<script>
const articleDomain = "{{ Self::domain() }}";
const articlePermalink = "{{ post.comments_permalink() }}";
const commentsPostID = "{{ metadata.comments_post_id }}";
</script>
<script src="/js/comments.js?{{ Self::stylesheet_cache_buster() }}" async></script>
<details id="comments-container">
<summary><h2>Comments</h2></summary>
<p class="italic">Reply to this post <a href="https://social.shadowfacts.net/notice/{{ metadata.comments_post_id }}" target="_blank">via the Fediverse</a>.</p>
<div id="comments-list"></div>
<noscript>
<aside class="inline">
<p>
Comments cannot be shown inline since you have JavaScript disabled.
</p>
</aside>
</noscript>
</details>
<script src="/js/comments.js?{{ _stylesheet_cache_buster }}" async></script>
{% endif %}
{%- endblock %}

View File

@ -1,128 +1,90 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{% block title %}Shadowfacts{% endblock %}</title>
{% block titlevariable %}
{% set title = "Shadowfacts" %}
{% endblock %}
<title>{{ title }}</title>
<link rel="cannonical" href="https://{{ Self::domain() }}{{ self.permalink() }}">
<link rel="alternate" type="application/rss+xml" title="Shadowfacts" href="https://{{ Self::domain() }}/feed.xml">
<link rel="cannonical" href="https://{{ _domain }}{{ _permalink }}">
<link rel="alternate" type="application/rss+xml" title="Shadowfacts" href="https://{{ _domain }}/feed.xml">
<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon-precomposed" href="/favicon-152.png">
<meta name="msapplication-TileColor" content="#F9C72F">
<meta name="msapplication-TileImage" content="/favicon-152.png">
<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon-precomposed" href="/favicon-152.png">
<meta name="msapplication-TileColor" content="#F9C72F">
<meta name="msapplication-TileImage" content="/favicon-152.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:creator" content="@ShadowfactsDev">
<meta property="og:title" content="{% block title %}{% endblock %}">
{% block image %}
<meta property="twitter:image" content="https://{{ Self::domain() }}shadowfacts.png">
<meta property="og:image" content="https://{{ Self::domain() }}shadowfacts.png">
{% endblock %}
<meta property="og:url" content="https://{{ Self::domain() }}{{ self.permalink() }}">
<meta property="og:site_name" content="Shadowfacts">
<meta name="twitter:card" content="summary">
<meta property="og:title" content="{{ title }}">
{% block image %}
<meta property="twitter:image" content="https://{{ _domain }}/shadowfacts.png">
<meta property="og:image" content="https://{{ _domain }}/shadowfacts.png">
{% endblock %}
<meta property="og:url" content="https://{{ _domain }}{{ _permalink }}">
<meta property="og:site_name" content="Shadowfacts">
<meta name="fediverse:creator" content="@shadowfacts@social.shadowfacts.net">
{% block head %}{% endblock %}
{% block head %}{% endblock %}
<script>
(() => {
const theme = localStorage.getItem("theme") || "auto";
document.write(`<link rel="stylesheet" href="/css/${theme}.css?{{ Self::stylesheet_cache_buster() }}">`);
})();
</script>
<noscript>
<link rel="stylesheet" href="/css/auto.css?{{ Self::stylesheet_cache_buster() }}">
</noscript>
<link rel="stylesheet" href="/css/main.css?{{ _stylesheet_cache_buster }}">
</head>
<body itemscope itemtype="https://schema.org/Blog">
<header class="site-header container">
<div>
<div>
<h1 class="site-title">{{ Self::fancy_link("Shadowfacts", "/", None)|safe }}</h1>
<p class="site-description">The outer part of a shadow is called the penumbra.</p>
</div>
<nav class="site-nav" role="navigation">
<ul>
<li>{{ Self::fancy_link("Archive", "/archive", None)|safe }}</li>
<li>{{ Self::fancy_link("Tutorials", "/tutorials", None)|safe }}</li>
<li>{{ Self::fancy_link("TV", "/tv", None)|safe }}</li>
<li>
<a href="#" class="dropdown-link" aria-haspopup="true">Other <span class="arrow arrow-down" aria-hidden="true"></span></a>
<ul aria-label="Other links">
<li>{{ Self::fancy_link("Gitea", "https://git.shadowfacts.net", None)|safe }}</li>
<li>{{ Self::fancy_link("RTFM", "https://rtfm.shadowfacts.net", None)|safe }}</li>
<li>{{ Self::fancy_link("Maven", "https://maven.shadowfacts.net", None)|safe }}</li>
<li>{{ Self::fancy_link("Type", "https://type.shadowfacts.net", None)|safe }}</li>
<li>{{ Self::fancy_link("Meme Machine", "https://mememachine.shadowfacts.net", None)|safe }}</li>
</ul>
</li>
</ul>
</nav>
</div>
</header>
<div class="container main" role="main">
{% block content %}{% endblock %}
</div>
<header>
<div class="container">
<h1><a href="/">Shadowfacts</a></h1>
<p id="epigraph">The outer part of a shadow is called the penumbra.</p>
</div>
</header>
<footer class="site-footer container">
<!-- <h2 class="site-title">Shadowfacts</h2> -->
<span class="ui-controls">
Theme:
<input type="radio" name="theme" id="auto" value="auto">
<label for="auto">auto</label>
<input type="radio" name="theme" id="light" value="light">
<label for="light">light</label>
<input type="radio" name="theme" id="dark" value="dark">
<label for="dark">dark</label>
</span>
<span class="site-colophon">
Generated on {{ Self::generated_at() | pretty_date }} by <a href="https://git.shadowfacts.net/shadowfacts/v6">v6</a>.
<br>
<img src="/buttons/vi.png" alt="Made with vi" />
<img src="/buttons/rust.png" alt="Powered by Rust" />
<img src="/buttons/html.png" alt="HTML: Learn it today!" />
</span>
<main>
<div class="container">
{% block content %}{% endblock %}
<nav class="links">
<ul>
<li>{{ Self::fancy_link("Email", "mailto:me@shadowfacts.net", Some("rel=me"))|safe }}</li>
<li>{{ Self::fancy_link("RSS", "/feed.xml", None)|safe }}</li>
<li>{{ Self::fancy_link("GitHub", "https://github.com/shadowfacts", Some("rel=me"))|safe }}</li>
<li>{{ Self::fancy_link("Mastodon", "https://social.shadowfacts.net/users/shadowfacts", Some("rel=me"))|safe }}</li>
</ul>
</nav>
<aside class="webring">
<a href="https://metro.bieszczady.pl">Metro Bieszczady webring</a>
<a title="previous page in webring" href="https://metro.bieszczady.pl/cgi-bin/webring?action=previous&amp;from=shadowfacts"></a>
<a title="next page in webring" href="https://metro.bieszczady.pl/cgi-bin/webring?action=next&amp;from=shadowfacts"></a>
</aside>
{% if _permalink != "/" %}
<hr>
{% endif %}
</div>
</main>
<script>
(() => {
const theme = localStorage.getItem("theme") || "auto";
document.getElementsByName("theme").forEach((el) => {
el.checked = theme === el.value;
el.onchange = () => {
localStorage.setItem("theme", el.value);
window.location.reload();
};
});
})();
</script>
<noscript>
<style>
.ui-controls {
display: none;
}
</style>
</noscript>
</footer>
<footer>
<div class="container">
<ul>
{% set footer_links = [
"Archive", "/archive/",
"Colophon", "/colophon/",
"Contact", "/elsewhere/"
] %}
{% block footer_links %}
{% set additional_links = [] %}
{% endblock %}
{% set sorted_links = footer_links | concat(with=additional_links) | zip | sort(attribute="0") %}
{% for link in sorted_links %}
<li><a href="{{ link.1 }}">{{ link.0 }}</a></li>
{% endfor %}
</ul>
{% block after_footer_links %}
{% endblock %}
<p>Generated on {{ _generated_at | pretty_date }}, by <a href="https://git.shadowfacts.net/shadowfacts/v7">v7</a>.</p>
</div>
</footer>
<script data-goatcounter="https://shadowfacts.goatcounter.com/count" async src="//gc.zgo.at/count.v3.js" crossorigin="anonymous"></script>
<script data-goatcounter="https://shadowfacts.goatcounter.com/count" defer src="//gc.zgo.at/count.v3.js" crossorigin="anonymous"></script>
{% if _development %}
<script>
let ws = new WebSocket("/_dev/live_reload");
ws.onmessage = (event) => {
if (event.data == "regenerated") {
ws.close();
window.location.reload();
}
};
</script>
{% endif %}
</body>
</html>

View File

@ -1,21 +0,0 @@
{% extends "layout/default.html" %}
{% block title%}{{ series.name }}{% endblock %}
{% block content -%}
<h1 class="page-heading">{{ series.name }}</h1>
{% for post in series.posts %}
<article>
<h2 class="article-title">
<a href="/tutorials/{{ series.slug }}/{{ post.slug }}/">
{{ post.metadata.title }}
</a>
</h2>
{% include "includes/article-meta.html" %}
</article>
{% endfor %}
{%- endblock %}

View File

@ -1,20 +0,0 @@
{% extends "layout/default.html" %}
{% block title%}{{ post.metadata.title }}{% endblock %}
{% block content -%}
<article itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting">
<meta itemprop="mainEntityOfPage" content="https://{{ Self::domain() }}{{ self.permalink() }}">
<h1 class="article-title" itemprop="name headline">
{{ post.metadata.title }}
</h1>
{% include "includes/article-meta.html" %}
<div class="article-content" itemprop="articleBody">
{{ post.content|safe }}
</div>
</article>
{%- endblock %}

Some files were not shown because too many files have changed in this diff Show More