Refactor and modularize
This commit is contained in:
parent
1265d3d4a9
commit
9d84151ee5
@ -4,15 +4,16 @@ module.exports = {
|
|||||||
url: "https://nathanupchurch.com/",
|
url: "https://nathanupchurch.com/",
|
||||||
language: "en",
|
language: "en",
|
||||||
description: "The personal website and blog of Nathan Upchurch.",
|
description: "The personal website and blog of Nathan Upchurch.",
|
||||||
pgpkey: "",
|
|
||||||
author: {
|
author: {
|
||||||
name: "Nathan Upchurch",
|
name: "Nathan Upchurch",
|
||||||
email: "blog@upchur.ch",
|
email: "blog@upchur.ch",
|
||||||
url: "https://nathanupchurch.com/me",
|
url: "https://nathanupchurch.com/me",
|
||||||
profilePic: "/img/CN20191025_301_Srt_SQUARE.jpg"
|
profilePic: "/img/CN20191025_301_Srt_SQUARE.jpg"
|
||||||
},
|
},
|
||||||
|
copyrightNotice: "© Nathan Upchurch 2022 - 2024",
|
||||||
defaultPostImageURL: "/img/vasilina-sirotina-1NMPvajSt9Q-unsplash_copy.avif",
|
defaultPostImageURL: "/img/vasilina-sirotina-1NMPvajSt9Q-unsplash_copy.avif",
|
||||||
defaultPostImageAlt: "The default post image: a close picture of the dark green leaves of a plant.",
|
defaultPostImageAlt: "The default post image: a close picture of the dark green leaves of a plant.",
|
||||||
|
postlistHeaderText: "Latest Posts",
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{
|
{
|
||||||
title: "My Blog",
|
title: "My Blog",
|
||||||
@ -69,5 +70,19 @@ module.exports = {
|
|||||||
linkDisplay: "Keyoxide Identity Profile",
|
linkDisplay: "Keyoxide Identity Profile",
|
||||||
iconURL: "/img/keyoxide.svg"
|
iconURL: "/img/keyoxide.svg"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
webrings: [
|
||||||
|
{
|
||||||
|
name: "Fediring",
|
||||||
|
ringURL: "https://fediring.net/",
|
||||||
|
previousURL: "https://fediring.net/previous?host=nathanupchurch.com",
|
||||||
|
nextURL: "https://fediring.net/next?host=nathanupchurch.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Geekring",
|
||||||
|
ringURL: "https://geekring.net/",
|
||||||
|
previousURL: "",
|
||||||
|
nextURL: ""
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
12
_includes/footer.njk
Normal file
12
_includes/footer.njk
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<footer>
|
||||||
|
{% if metadata.copyrightNotice %}<p>{{ metadata.copyrightNotice }}</p>{% endif %}<br>
|
||||||
|
|
||||||
|
{% if metadata.webrings %}
|
||||||
|
{% for webring in metadata.webrings %}
|
||||||
|
{% if webring.previousURL %}<a href="{{ webring.previousURL }}">←</a>{% endif %}
|
||||||
|
{% if webring.ringURL %}<a href="{{ webring.ringURL }}">{{ webring.name }}</a>{% endif %}
|
||||||
|
{% if webring.nextURL %}<a href="{{ webring.nextURL }}">→</a>{% endif %}
|
||||||
|
<br>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</footer>
|
5
_includes/header.njk
Normal file
5
_includes/header.njk
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
||||||
|
<header>
|
||||||
|
<a href="/" class="home-link"><img class="logo" src="{{ metadata.logo }}" alt="{{ metadata.title }}"></a>
|
||||||
|
{% if not hideNav %}{% include "nav.njk" %}{% endif %}
|
||||||
|
</header>
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
layout: layouts/base.njk
|
layout: layouts/base.njk
|
||||||
showPostListHeader: yep
|
|
||||||
---
|
---
|
||||||
<h1>403 Forbidden</h1>
|
<h1>403 Forbidden</h1>
|
||||||
<p class="nodropcap page-block">*Ahem* <a href="/">Go to the home page</a>.</p>
|
<p class="nodropcap page-block">*Ahem* <a href="/">Go to the home page</a>.</p>
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
layout: layouts/base.njk
|
layout: layouts/base.njk
|
||||||
showPostListHeader: yep
|
|
||||||
---
|
---
|
||||||
<h1>404</h1>
|
<h1>404</h1>
|
||||||
<p class="nodropcap page-block">Sorry, it looks like that link is broken. <a href="/">Go to the home page</a>.</p>
|
<p class="nodropcap page-block">Sorry, it looks like that link is broken. <a href="/">Go to the home page</a>.</p>
|
||||||
|
@ -1,103 +1,20 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="{{ metadata.language }}">
|
<html lang="{{ metadata.language }}">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
{% include "metadata.njk" %}
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>{{ title or metadata.title }}</title>
|
|
||||||
<link rel="icon" type="image/x-icon" href="/img/logo_favicon.svg">
|
|
||||||
<meta name="description" content="{{ description or metadata.description }}">
|
|
||||||
<meta name="robots" content="noai, noimageai">
|
|
||||||
|
|
||||||
<link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
|
|
||||||
<link rel="alternate" href="/feed/feed.json" type="application/json" title="{{ metadata.title }}">
|
|
||||||
{% if metadata.pgpkey %}<link rel="pgpkey" href="{{ metadata.pgpkey | safe }}">{% endif %}
|
|
||||||
|
|
||||||
<meta name="generator" content="{{ eleventy.generator }}">
|
|
||||||
{#- Bundle CSS #}
|
{#- Bundle CSS #}
|
||||||
{%- css %}{% include "public/css/index.css" %}{% endcss %}
|
{%- css %}{% include "public/css/index.css" %}{% endcss %}
|
||||||
{%- css %}{% include "public/css/webfonts/webfonts.css" %}{% endcss %}
|
{%- css %}{% include "public/css/webfonts/webfonts.css" %}{% endcss %}
|
||||||
{%- css %}{% include "public/css/dropcap.css" %}{% endcss %}
|
{%- css %}{% include "public/css/dropcap.css" %}{% endcss %}
|
||||||
<style>{% getBundle "css" %}</style>
|
<style>{% getBundle "css" %}</style>
|
||||||
{% if title %}
|
{% include "structuredData.njk" %}
|
||||||
<!-- Structured Data -->
|
|
||||||
<script type="application/ld+json">
|
|
||||||
{
|
|
||||||
"@context": "https://schema.org/",
|
|
||||||
"@type": "Article",
|
|
||||||
"headline": "{{ title }}",
|
|
||||||
"author": {
|
|
||||||
"@type": "Person",
|
|
||||||
"name": "{{ metadata.author.name }}"
|
|
||||||
},
|
|
||||||
"datePublished": "{{ date }}",
|
|
||||||
"description": "{% if synopsis %}{{ synopsis}}{% endif %}",
|
|
||||||
"image": "{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}",
|
|
||||||
"url": "{{ page.url | htmlBaseUrl(metadata.url) }}",
|
|
||||||
"articleBody": "{{ content | striptags }}"
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Open Graph -->
|
|
||||||
<meta property="og:type" content="article" />
|
|
||||||
<meta property="og:title" content="{{ title }}" />
|
|
||||||
<meta property="og:description" content="{{ synopsis}}" />
|
|
||||||
<meta property="og:url" content="{{ page.url | htmlBaseUrl(metadata.url) }}" />
|
|
||||||
<meta property="og:image" content="{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}" />
|
|
||||||
|
|
||||||
<!-- Twitter card -->
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
|
||||||
<meta name="twitter:title" content="{{ title }}" />
|
|
||||||
<meta name="twitter:description" content="{{ synopsis}}" />
|
|
||||||
<meta name="twitter:image" content="{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}" />
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include "umami.html" %}
|
{% include "umami.html" %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
{% include "header.njk" %}
|
||||||
|
|
||||||
<header>
|
|
||||||
<a href="/" class="home-link"><img class="logo" src="{{ metadata.logo }}" alt="{{ metadata.title }}"></a>
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<h2 class="visually-hidden">Top level navigation menu</h2>
|
|
||||||
<ul class="nav">
|
|
||||||
{%- for entry in collections.all | eleventyNavigation %}
|
|
||||||
<a class="nav-item" href="{{ entry.url }}"{% if entry.url == page.url %} aria-current="page"{% endif %}><li {% if entry.url == page.url %} data-currentpage="true"{% endif %}>{{ entry.title }}</li></a>
|
|
||||||
{%- endfor %}
|
|
||||||
<a class="nav-item" href="/feed/feed.xml">
|
|
||||||
<li class="subscribe">
|
|
||||||
<!-- RSS Logo -->
|
|
||||||
<svg class="nav-icon" viewBox="0 0 155 155" width="153.349" height="152.909" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g transform="translate(-427.323 -373.814)">
|
|
||||||
<ellipse
|
|
||||||
style="opacity:1;fill-opacity:1;fill-rule:nonzero;"
|
|
||||||
transform="matrix(.86996 0 0 .86996 135.156 330.529)"
|
|
||||||
cx="360.357" cy="200.643" rx="24.643" ry="23.929"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
style="fill-opacity:1;fill-rule:evenodd;"
|
|
||||||
d="m427.835 455.057-.073-30.273c64.706 3.375 100.619 49.673 101.5 101.94h-30.318c-.503-45.942-31.74-69.996-71.11-71.667z"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
style="fill-opacity:1;fill-rule:evenodd;"
|
|
||||||
d="m428.201 404.571-.878-30.757C526.75 378.43 580 450.582 580.67 526.724l-31.197-.44c1.365-48.704-34.665-120.267-121.273-121.713Z"
|
|
||||||
/>
|
|
||||||
</g>
|
|
||||||
</svg>Feed
|
|
||||||
</li>
|
|
||||||
</a>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main id="skip">
|
<main id="skip">
|
||||||
{{ content | safe }}
|
{{ content | safe }}
|
||||||
</main>
|
</main>
|
||||||
<footer><p>© Nathan Upchurch 2022 - 2024<br>
|
{% include "footer.njk" %}
|
||||||
<a href="https://fediring.net/previous?host=nathanupchurch.com">←</a>
|
|
||||||
<a href="https://fediring.net/">Fediring</a>
|
|
||||||
<a href="https://fediring.net/next?host=nathanupchurch.com">→</a>
|
|
||||||
</p></footer>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,35 +1,17 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="{{ metadata.language }}" class="barebones">
|
<html lang="{{ metadata.language }}" class="barebones">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
{% include "metadata.njk" %}
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>{{ title or metadata.title }}</title>
|
|
||||||
<link rel="icon" type="image/x-icon" href="/img/logo_favicon.svg">
|
|
||||||
<meta name="description" content="{{ description or metadata.description }}">
|
|
||||||
|
|
||||||
<meta name="generator" content="{{ eleventy.generator }}">
|
|
||||||
|
|
||||||
{#- Bundle CSS #}
|
{#- Bundle CSS #}
|
||||||
{%- css %}{% include "public/css/index.css" %}{% endcss %}
|
{%- css %}{% include "public/css/index.css" %}{% endcss %}
|
||||||
{%- css %}{% include "public/css/webfonts/webfonts.css" %}{% endcss %}
|
{%- css %}{% include "public/css/webfonts/webfonts.css" %}{% endcss %}
|
||||||
{%- css %}{% include "public/css/dropcap.css" %}{% endcss %}
|
|
||||||
<style>{% getBundle "css" %}</style>
|
<style>{% getBundle "css" %}</style>
|
||||||
|
|
||||||
{% include "umami.html" %}
|
{% include "umami.html" %}
|
||||||
</head>
|
</head>
|
||||||
<body class="barebones">
|
<body class="barebones">
|
||||||
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
{% include "header.njk" %}
|
||||||
|
|
||||||
<header>
|
|
||||||
<a href="/" class="home-link"><img class="logo" src="{{ metadata.logo }}" alt="{{ metadata.title }}"></a>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main id="skip">
|
<main id="skip">
|
||||||
{{ content | safe }}
|
{{ content | safe }}
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer></footer>
|
|
||||||
|
|
||||||
<!-- Current page: {{ page.url | htmlBaseUrl }} -->
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
layout: layouts/baseBareBones.njk
|
layout: layouts/baseBareBones.njk
|
||||||
|
hideNav: please
|
||||||
---
|
---
|
||||||
{%- css %}{% include "public/css/links.css" %}{% endcss %}
|
{%- css %}{% include "public/css/links.css" %}{% endcss %}
|
||||||
<img class="profilePic" src="{{ metadata.author.profilePic }}">
|
<img class="profilePic" src="{{ metadata.author.profilePic }}">
|
||||||
|
9
_includes/metadata.njk
Normal file
9
_includes/metadata.njk
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{{ title or metadata.title }}</title>
|
||||||
|
<link rel="icon" type="image/x-icon" href="/img/logo_favicon.svg">
|
||||||
|
<meta name="description" content="{{ description or metadata.description }}">
|
||||||
|
<meta name="robots" content="noai, noimageai">
|
||||||
|
<link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
|
||||||
|
<link rel="alternate" href="/feed/feed.json" type="application/json" title="{{ metadata.title }}">
|
||||||
|
<meta name="generator" content="{{ eleventy.generator }}">
|
13
_includes/nav.njk
Normal file
13
_includes/nav.njk
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<nav>
|
||||||
|
<h2 class="visually-hidden">Top level navigation menu</h2>
|
||||||
|
<ul class="nav">
|
||||||
|
{%- for entry in collections.all | eleventyNavigation %}
|
||||||
|
<a class="nav-item" href="{{ entry.url }}"{% if entry.url == page.url %} aria-current="page"{% endif %}><li {% if entry.url == page.url %} data-currentpage="true"{% endif %}>{{ entry.title }}</li></a>
|
||||||
|
{%- endfor %}
|
||||||
|
<a class="nav-item" href="/feed/feed.xml">
|
||||||
|
<li class="subscribe">
|
||||||
|
{% include "rssLogo.njk" %}Feed
|
||||||
|
</li>
|
||||||
|
</a>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
@ -1,5 +1,5 @@
|
|||||||
<section class="postlist">
|
<section class="postlist">
|
||||||
{% if showPostListHeader %}<h2>Latest Posts</h2>{% endif %}
|
{% if showPostListHeader %}<h2>{{ metadata.postlistHeaderText }}</h2>{% endif %}
|
||||||
<div class="postlist-item-container">
|
<div class="postlist-item-container">
|
||||||
{% for post in postslist | reverse %}
|
{% for post in postslist | reverse %}
|
||||||
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
|
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
|
||||||
|
19
_includes/rssLogo.njk
Normal file
19
_includes/rssLogo.njk
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!-- RSS Logo -->
|
||||||
|
<svg class="nav-icon" viewBox="0 0 155 155" width="153.349" height="152.909" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="translate(-427.323 -373.814)">
|
||||||
|
<ellipse
|
||||||
|
style="opacity:1;fill-opacity:1;fill-rule:nonzero;"
|
||||||
|
transform="matrix(.86996 0 0 .86996 135.156 330.529)"
|
||||||
|
cx="360.357" cy="200.643" rx="24.643" ry="23.929"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
style="fill-opacity:1;fill-rule:evenodd;"
|
||||||
|
d="m427.835 455.057-.073-30.273c64.706 3.375 100.619 49.673 101.5 101.94h-30.318c-.503-45.942-31.74-69.996-71.11-71.667z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
style="fill-opacity:1;fill-rule:evenodd;"
|
||||||
|
d="m428.201 404.571-.878-30.757C526.75 378.43 580 450.582 580.67 526.724l-31.197-.44c1.365-48.704-34.665-120.267-121.273-121.713Z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<!-- /RSS Logo -->
|
After Width: | Height: | Size: 779 B |
30
_includes/structuredData.njk
Normal file
30
_includes/structuredData.njk
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{% if title %}
|
||||||
|
<!-- Structured Data -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org/",
|
||||||
|
"@type": "Article",
|
||||||
|
"headline": "{{ title }}",
|
||||||
|
"author": {
|
||||||
|
"@type": "Person",
|
||||||
|
"name": "{{ metadata.author.name }}"
|
||||||
|
},
|
||||||
|
"datePublished": "{{ date }}",
|
||||||
|
"description": "{% if synopsis %}{{ synopsis}}{% endif %}",
|
||||||
|
"image": "{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}",
|
||||||
|
"url": "{{ page.url | htmlBaseUrl(metadata.url) }}",
|
||||||
|
"articleBody": "{{ content | striptags }}"
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<!-- Open Graph -->
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:title" content="{{ title }}" />
|
||||||
|
<meta property="og:description" content="{{ synopsis}}" />
|
||||||
|
<meta property="og:url" content="{{ page.url | htmlBaseUrl(metadata.url) }}" />
|
||||||
|
<meta property="og:image" content="{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}" />
|
||||||
|
<!-- Twitter card -->
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:title" content="{{ title }}" />
|
||||||
|
<meta name="twitter:description" content="{{ synopsis}}" />
|
||||||
|
<meta name="twitter:image" content="{% if imageURL %}{{ imageURL | htmlBaseUrl(metadata.url) }}{% else %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endif %}" />
|
||||||
|
{% endif %}
|
Loading…
x
Reference in New Issue
Block a user