1

Merge branch 'rebuild_nov_2022'

This commit is contained in:
Evan Pratten 2022-11-25 15:04:41 -05:00
commit f9b564d317
58 changed files with 572 additions and 758 deletions

View File

@ -14,11 +14,13 @@ render_emoji = true
external_links_target_blank = true
[extra]
# Website
domain_name = "ewpratten.com"
# Me
name = "Evan Pratten"
profession = "Software Developer"
email = "contact@ewpratten.com"
twitter = "ewpratten"
profile_photo = "https://avatars.githubusercontent.com/u/21065412"
# Accounts
email = "evan@ewpratten.com"
github = "ewpratten"
qrz = "va3zza"
linkedin = "ewpratten"
profile_photo = "https://avatars.githubusercontent.com/u/21065412"

View File

@ -5,6 +5,7 @@ description: "I3wm makes everything 10x harder than it should be"
date: 2019-08-12
tags: notes languages
aliases: [/blog/2019/08/12/setting-up-ja]
draft: true
---
I am currently working with [Hiragana](https://en.wikipedia.org/wiki/Hiragana), [Katakana](https://en.wikipedia.org/wiki/Katakana), and, [Kanji](https://en.wikipedia.org/wiki/Kanji) in some projects, and needed a more reliable way to write than running some [romaji](https://en.wikipedia.org/wiki/Romanization_of_Japanese) through an online translator. So, this post will detail what I did to enable native inputs on my laptop. This guide is specifically for [i3wm](https://i3wm.org/), because it does not obey system settings for languages and inputs.

View File

@ -9,7 +9,7 @@ redirect_from:
- /ef7b3166/
aliases: [/blog/2019/09/11/buildingimgfrombin]
extra:
uses_twitter: true
uses: [twitter]
---
During a computer science class today, we were talking about embedding code and metadata in *jpg* and *bmp* files. @exvacuum was showing off a program he wrote that watched a directory for new image files, and would display them on a canvas. He then showed us a special image. In this image, he had injected some metadata into the last few pixels, which were not rendered, but told his program where to position the image on the canvas, and it's size.

View File

@ -9,7 +9,7 @@ redirect_from:
- /ebsdjtd9/
aliases: [/blog/2020/04/20/ludumdare46]
extra:
uses_twitter: true
uses: [twitter]
---
Over the past weekend I teamed up with @rsninja722, @wm-c, @exvacuum, @marshmarlow, and our friends Sally and Matt to participate in the [LudumDare46](https://ldjam.com/events/ludum-dare/46) game jam. This post will outline the game development process.

View File

@ -6,7 +6,7 @@ tags = ["frc"]
aliases = ["/blog/2020/08/03/joystick-to-voltage"]
[extra]
uses_katex = true
uses = ["katex"]
+++
I am starting a new little series here called "Notes from FRC". The idea is that I am going to write about what I have learned over the past three years of working (almost daily) with robots, and hopefully someone in the future will find them useful. The production source code I based this post around is available [here](https://github.com/frc5024/lib5k/blob/cd8ad407146b514cf857c1d8ac82ac8f3067812b/common_drive/src/main/java/io/github/frc5024/common_drive/calculation/DifferentialDriveCalculation.java).

View File

@ -9,7 +9,7 @@ extra:
This post is a continuation on my "Notes from FRC" series. This time,
I cover an extremely simple, yet very effective way to get a
tank-drive robot from A to B autonomously.
uses_katex: true
uses: [katex]
aliases: [/blog/2020/08/13/drivetrain-navigation]
---

View File

@ -6,7 +6,7 @@ date: 2021-12-03
tags: reference
draft: false
extra:
uses_katex: true
uses: [katex]
excerpt: This post is an overview of Quaternions for Rust programmers, and anyone willing to learn.
---

View File

@ -6,7 +6,7 @@ date: 2022-01-06
tags: random
draft: false
extra:
uses_katex: false
excerpt: My GitHub profile is a bit like an iceberg. At the time of writing, I have made nearly 8 and a half thousand commits to nearly a thousand repositories. This post covers the hidden failed projects.
---

View File

@ -6,7 +6,7 @@ date: 2022-01-19
tags: random 3d-pipeline
draft: false
extra:
uses_katex: false
excerpt: This post covers the process I went through to write a Neural-Network-assisted Blender plugin for converting monocular images into 3D textured meshes.
---

View File

@ -6,7 +6,7 @@ date: 2022-02-14
tags: project pbx
draft: true
extra:
uses_katex: false
auto_center_images: true
---

View File

@ -6,7 +6,7 @@ date: 2022-02-26
tags: project keyboard
draft: true
extra:
uses_katex: false
auto_center_images: true
---

View File

@ -7,7 +7,7 @@ tags: reference
draft: false
extra:
excerpt: This document is written for my PROG10082 classmates as a quick reference for some Java concepts that were skipped over in the course.
uses_katex: false
hidden: true
auto_center_images: true
---

View File

@ -6,7 +6,7 @@ date: 2022-04-06
tags: random
draft: false
extra:
uses_katex: false
excerpt: A project review post covering my work on remote-control for the UDM-Pro cooling system
---

View File

@ -6,7 +6,7 @@ date: 2022-04-11
tags: robotics
draft: true
extra:
uses_katex: true
uses: [katex]
excerpt: In this post, I take a look at a mathematical problem commonly encountered with relative rotation offset calculation in robotics.
---

View File

@ -6,7 +6,7 @@ date: 2022-05-10
tags: music
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: Release notification for Space & Time Vol. 1
---

View File

@ -6,7 +6,7 @@ date: 2022-05-18
tags: random
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: This post covers how to keep your commit graph alive across multiple GIT instances by syncing your commit history to magic repos.
---

View File

@ -6,7 +6,7 @@ date: 2022-05-21
tags: radio random nanovna
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: I went out in the field and tried out my brand new NanoVNA.
---

View File

@ -6,7 +6,7 @@ date: 2022-06-08
tags: networking
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: I used multiple layers of IP encapsulation to evade an upstream firewall in the name of IPv6.
---

View File

@ -6,7 +6,7 @@ date: 2022-06-13
tags: random
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: A quick guide on launching Visual Paradigm on Fedora 36
---

View File

@ -6,7 +6,7 @@ date: 2022-06-23
tags: random
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: How to flash custom firmware to the Steam Controller, allowing it to connect to the Nintendo Switch
---

View File

@ -6,7 +6,7 @@ date: 2022-06-26
tags: random as398057
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: This post covers some of the logistics behind rickrolling the internet with some clever routing tricks.
---

View File

@ -6,7 +6,7 @@ date: 2022-07-02
tags: story
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: From 2016 to 2021, I dedicated most of my time to robotics and control systems programming. This is my journey
---

View File

@ -6,7 +6,7 @@ date: 2022-08-17
tags: networking
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: I recently started AS398057, a low cost Autonomous System. This post talks about how its going
---

View File

@ -6,7 +6,7 @@ date: 2022-09-09
tags: website
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: A small update post about some website changes
---

View File

@ -6,7 +6,7 @@ date: 2022-10-02
tags: website network
draft: false
extra:
uses_katex: false
auto_center_images: true
excerpt: A look at the usage of personal ASNs based on freely available data
---

View File

@ -6,7 +6,7 @@ date: 2022-10-17
tags: amprnet network
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: A tutorial for AMPRNet operators who are BGP announcing their first prefix to Vultr
---

View File

@ -6,7 +6,7 @@ date: 2022-10-17
tags: amprnet network
draft: true
extra:
uses_katex: false
auto_center_images: true
excerpt: A tutorial for AMPRNet operators who are BGP announcing their first prefix to Vultr
---

View File

@ -2,7 +2,7 @@
title: Blog
sort_by: date
extra:
inject_blog_posts: true
section_embed_mode: blog_posts
---
## Blog posts

View File

@ -3,7 +3,7 @@ title: Meme Appreciation Month
description: "Come chat with young hams, and join the meme madness!"
aliases: [/yeet]
extra:
uses_flags: true
uses: [flags]
---
***This event has passed. Page preserved for nostalgia.***

View File

@ -1,7 +1,7 @@
---
title: IP Addressing Plan
extra:
uses_graphviz: true
uses: [graphviz]
---

View File

@ -2,7 +2,7 @@
title: "A10U8R: Signal Attenuator"
description: "A small, but helpful module for VCV Rack 2"
extra:
uses_katex: true
uses: [katex]
---
[![Download Plugin](https://img.shields.io/badge/-download-darkgreen)](https://github.com/Ewpratten/A10U8R/releases/latest)

View File

@ -0,0 +1,57 @@
.about-card {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: space-around;
width: max-content;
max-width: 95vw;
margin-left: auto;
margin-right: auto;
margin-top: 2em;
margin-bottom: 2em;
.profile-photo-container {
max-width: 150px;
height: max-content;
margin: 0;
padding: 0;
& > img {
width: 100%;
}
}
.text-container {
margin-left: 1em;
height: max-content;
.intro-text {
margin-bottom: 1em;
h1,
p {
margin: 0;
line-height: 1em;
}
}
.quick-links {
height: max-content;
ul {
margin: 0;
padding: 0;
li {
list-style-type: none;
line-height: 1.25em;
margin: 0;
padding: 0;
}
padding: 0;
}
}
}
}

View File

@ -0,0 +1,3 @@
.footer {
text-align: center;
}

View File

@ -0,0 +1,11 @@
.zola-github-card {
border-radius: 5px;
padding-top: 5px;
padding-bottom: 1px;
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
transition: all 0.1s ease 0s;
&:hover {
box-shadow: rgba(0, 0, 0, 0.5) 0px 3px 15px;
}
}

View File

@ -0,0 +1,32 @@
.heading-card {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: max-content;
max-width: 95vw;
margin-left: auto;
margin-right: auto;
margin-top: 2em;
margin-bottom: 2em;
.profile-photo-container {
width: 50px;
img {
width: 100%;
}
}
.text-container {
margin-left: 1em;
height: max-content;
h1,
p {
margin: 0;
line-height: 1em;
}
}
}

View File

@ -0,0 +1,30 @@
.ewp-navbar {
margin-top: 1em;
margin-bottom: 1em;
hr {
margin: 0;
border-top: 2px solid;
}
.navbar-items {
width: max-content;
padding: 0;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: auto;
margin-right: auto;
& > li {
display: inline-block;
.dropdown-menu {
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}
}
.separator {
content: "|";
}
}
}

View File

@ -0,0 +1,3 @@
#instagram-embed-0 {
margin: auto !important;
}

View File

@ -0,0 +1,4 @@
.markdown-body table {
margin: auto !important;
width: fit-content !important;
}

View File

@ -0,0 +1,4 @@
.mermaid {
width: fit-content;
margin: auto;
}

View File

@ -0,0 +1,4 @@
.tiktok-embed {
border: none !important;
margin: auto !important;
}

View File

@ -0,0 +1,9 @@
.yt-embed {
width: 100%;
height: 400px;
iframe {
width: 100%;
height: 100%;
}
}

View File

@ -1,321 +1,10 @@
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Urbanist", sans-serif;
font-weight: bolder;
}
p,
li,
span {
font-family: "Rubik", sans-serif;
font-weight: normal;
}
a {
text-decoration: none;
&:visited {
color: blue;
}
&:hover {
color: blueviolet;
}
}
body {
// margin-bottom: 30px;
margin: 0;
}
.mobile-hidden {
@media only screen and (max-width: 650px) {
display: none;
}
}
.yt-embed {
width: 100%;
height: 400px;
iframe {
width: 100%;
height: 100%;
}
}
.container {
max-width: 700px;
margin: auto;
padding-left: 10px;
padding-right: 10px;
}
.profile-card {
margin-top: 30px;
margin-bottom: 30px;
margin-left: auto;
margin-right: auto;
.row {
width: max-content;
max-width: 95vw;
margin: auto;
overflow-wrap: normal;
.headshot-container {
display: inline-block;
max-width: 150px;
@media only screen and (max-width: 399px) {
display: block;
margin: auto;
text-align: center;
}
img {
width: 100%;
}
}
.text-container {
display: inline-block;
margin-left: 20px;
h1,
p {
margin: 0px;
a {
text-decoration: none;
}
}
}
}
}
.navigation-bar {
text-align: center;
p {
margin: 0px;
a {
text-decoration: none;
}
}
}
.blog-post-li {
margin: 0.25em;
}
.gray {
color: gray;
}
ul {
padding-left: 20px;
}
.events-list {
& > li {
color: gray;
}
& > ul {
& > li {
& > div {
display: table-row;
& > span {
display: table-cell;
&:first-of-type {
color: gray;
width: 30px;
text-align: center;
padding-right: 8px;
// Only Firefox supports this
// letter-spacing: -0.35em;
// text-transform: full-width;
}
}
}
}
.page {
& > .container {
max-width: 800px;
}
}
.mermaid {
width: fit-content;
margin: auto;
}
.zola-github-card {
border-radius: 5px;
padding-top: 5px;
padding-bottom: 1px;
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
transition: all 0.1s ease 0s;
&:hover {
box-shadow: rgba(0, 0, 0, 0.5) 0px 3px 15px;
}
}
#instagram-embed-0 {
margin: auto !important;
}
.tiktok-embed {
border: none !important;
margin: auto !important;
}
.markdown-body table {
margin: auto !important;
width: fit-content !important;
}
.blog-post-listing-item {
color: black !important;
& > div {
border-left: solid rgb(201, 201, 201) 5px;
&:hover {
border-left: solid black 5px;
}
padding-left: 5px;
}
h4,
h1,
p {
padding: 0;
margin: 0;
}
h1 {
margin-bottom: 10px;
}
&:hover {
color: rgb(85, 85, 85) !important;
}
}
.pn-previous,
.pn-next {
border: 1px solid black;
border-radius: 5px;
padding: 5px;
color: black !important;
&:hover {
color: rgb(85, 85, 85) !important;
border: 1px solid rgb(85, 85, 85) !important;
}
}
#footer {
margin-top: 2em;
text-align:center;
}
.carded-section {
border: 1px solid black;
width: 100%;
& > .header {
background-color: aliceblue;
padding-left: 30px;
padding-right: 30px;
padding-top: 15px;
padding-bottom: 15px;
border-bottom: 1px solid rgb(201, 201, 201);
& > span {
font-size: 1.5em;
font-weight: bolder;
}
}
& > .content {
padding-left: 15px;
padding-right: 15px;
}
}
.portfolio-sellout {
margin-top: 15px;
background-color: #afa79e;
border-radius: 5px;
text-align: center;
// color: white;
padding-top: 5px;
padding-bottom: 5px;
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
// & > p > a {
// color: aqua;
// }
}
.hover-help {
&:hover {
cursor: help;
}
border-bottom: 1px double rgb(171, 167, 167);
}
.small {
font-size: 0.5em;
}
.hover-shadow {
&:hover {
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}
}
#main-skills {
display: flex;
flex-wrap: wrap;
width: 100%;
justify-content: space-evenly;
@media screen and (max-width: 455px) {
justify-content: left;
}
ul {
margin:0;
}
}
.project {
border: 1px solid gray;
border-radius: 5px;
padding: 1em;
margin-bottom: 1em;
p {
margin-top:0.25em;
margin-bottom:0.25em;
}
h3 {
border-bottom: 1px solid lightgrey;
margin-top:0.25em;
margin-bottom:0.5em;
padding-bottom: 0.5em;
}
ul{
margin-bottom:0;
}
}
.homepage-showoff {
padding-left: 1em;
padding-right: 1em;
padding-top: 0.25em;
padding-bottom: 0.25em;
background-color: #e3e3e3;
color: black;
}
.home-list {
&>ul>li {
padding-top:0.5em;
}
}

View File

@ -1,51 +0,0 @@
.project-mosaic {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
width: 100%;
@media (min-width: 437px) {
.project-small {
max-width: 175px !important;
}
}
.conform-height {
height: unset !important;
}
.project {
border: 1px solid #ccc;
border-radius: 5px;
padding: 1rem;
margin-bottom: 1rem;
max-width: 300px;
height: max-content;
img {
margin-bottom: 0.5em;
border-bottom: 1px solid #ccc;
padding-bottom: 0.75em;
width: 100%;
}
h3 {
margin: 0;
margin-bottom: 0.25em;
}
p {
margin-top: 0;
color: rgb(84, 84, 84);
}
span {
display: inline-block;
border-top: 1px solid #ccc;
font-size: 2em;
width: 100%;
padding-top: 0.25em;
text-align: center;
}
}
}

View File

@ -0,0 +1,53 @@
@import url("https://fonts.googleapis.com/css2?family=Roboto&family=Urbanist:wght@700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,400;0,700;1,400;1,700&display=swap");
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Urbanist", sans-serif;
font-weight: bolder;
}
p,
li,
span {
font-family: "Rubik", sans-serif;
font-weight: normal;
}
a {
text-decoration: none;
color: blue;
&:visited {
color: blue;
}
&:hover {
color: blueviolet;
}
}
body {
margin: 0;
}
.gray {
color: gray;
}
.hover-help {
&:hover {
cursor: help;
}
border-bottom: 1px double rgb(171, 167, 167);
}
.page #content {
img {
display: block;
margin-left: auto;
margin-right: auto;
}
}

15
sass/styles/utils.scss Normal file
View File

@ -0,0 +1,15 @@
.mobile-hidden {
@media only screen and (max-width: 650px) {
display: none;
}
}
.small {
font-size: 0.5em;
}
.hover-shadow {
&:hover {
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}
}

View File

@ -1,165 +1,96 @@
{# Allow extenders to pass through variables #}
{% block variable_wormhole %}
{% set title = "NO TITLE SET" %}
{% set description = "" %}
{% set is_article = false %}
{% set feature_flags = [] %}
{% set redirect_target = "" %}
{% endblock variable_wormhole %}
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<!-- Google Tag Manager -->
<script>(function (w, d, s, l, i) {
w[l] = w[l] || []; w[l].push({
'gtm.start':
new Date().getTime(), event: 'gtm.js'
}); var f = d.getElementsByTagName(s)[0],
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-KFJ95RP');</script>
<!-- End Google Tag Manager -->
{# Page metadata #}
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/jpg" href="{{config.extra.profile_photo}}" />
{% if current_url %}
<link rel="canonical" href="{{current_url}}" />
{% include "components/metadata/advertise-rss.html" %}
{% include "components/metadata/opengraph.html" %}
{# Redirect support #}
{% if redirect_target != "" %}
<meta http-equiv="refresh" content="0; url={{redirect_target}}" />
{% endif %}
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{get_url(path=" rss.xml",
trailing_slash=false)}}">
<link rel="webmention" href="https://webmention.io/ewpratten.com/webmention" />
<link rel="pingback" href="https://webmention.io/ewpratten.com/xmlrpc" />
<title>{% block title %}{% endblock title %} | {{config.extra.name}}</title>
{# Page title #}
<title>{{title}} | {{config.title}}</title>
{# Preconnects for external resources #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto&family=Urbanist:wght@700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,400;0,700;1,400;1,700&display=swap"
rel="stylesheet">
<link rel="preconnect" href="https://maxst.icons8.com">
{# External styles #}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet"
href="https://maxst.icons8.com/vue-static/landings/line-awesome/line-awesome/1.3.0/css/line-awesome.min.css">
<link rel="stylesheet" href="/styles/layout.css">
<link rel="stylesheet" href="/styles/project_mosaic.css">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/4.0.0/github-markdown.min.css"
integrity="sha512-Oy18vBnbSJkXTndr2n6lDMO5NN31UljR8e/ICzVPrGpSud4Gkckb8yUpqhKuUNoE+o9gAb4O/rAxxw1ojyUVzg=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
{# Site-wide styles #}
<link rel="stylesheet" href="/styles/fixes/instagram.css">
<link rel="stylesheet" href="/styles/fixes/markdown.css">
<link rel="stylesheet" href="/styles/fixes/mermaid.css">
<link rel="stylesheet" href="/styles/fixes/tiktok.css">
<link rel="stylesheet" href="/styles/fixes/youtube.css">
<link rel="stylesheet" href="/styles/typography.css">
<link rel="stylesheet" href="/styles/utils.css">
<link rel="stylesheet" href="/styles/layout.css">
<link rel="stylesheet" href="/styles/components/github-card.css">
<meta name="twitter:card" content="summary" />
<meta name="og:site" content="ewpratten.com" />
<meta name="og:image" content="{{config.extra.profile_photo}}" />
<meta name="twitter:creator" content="@ewpratten">
<meta name="og:site_name" content="Evan Pratten (VA3ZZA)" />
{# Component styles #}
{% block component_styles %}
{% endblock component_styles %}
{% endblock head %}
{# Enable features #}
{% include "components/metadata/page-features.html" %}
</head>
<body>
<div class="container">
<div class="profile-card">
{% block profile %}
<div class="row">
<div class="headshot-container">
<img src="{{config.extra.profile_photo}}" alt="Headshot">
</div>
<div class="text-container">
<h1>{{config.extra.name}}</h1>
<p>
{{config.extra.profession}}
<br><br>
<a href="mailto:{{config.extra.email}}" rel="me"><i class="las la-envelope"></i>
{{config.extra.email}}</a><br>
<a href="https://github.com/{{config.extra.github}}" rel="me"><i class="lab la-github"></i>
{{config.extra.github}}</a><br>
<a href="https://www.linkedin.com/in/{{config.extra.linkedin}}" rel="me"><i
class="lab la-linkedin"></i>
{{config.extra.linkedin}}</a><br>
<a href="https://qrz.com/db/{{config.extra.qrz}}" rel="me"><i
class="las la-broadcast-tower"></i>
{{config.extra.qrz}}</a>
</p>
</div>
</div>
{% endblock profile %}
</div>
<div class="navigation-bar">
<hr>
<p>
<a href="/">Home</a> |
<a href="/blog">Blog</a> |
{# <a href="/blog">Rabbit Hole</a> | #}
{# <a href="/work">My Work</a> | #}
{# <a href="/network">Network</a> | #}
<a href="/contact">Contact</a>
{# <a href="/hobbies">Hobbies</a> #}
{# <a href="/whois">WHOIS</a> #}
{# <a href="/rfc">RFC</a> #}
</p>
<hr>
</div>
<div class="page-content">
{% block content %}
{% endblock content %}
{# The whole page #}
<div class="page">
{# Allow pages to override the content before the navbar #}
{% block page_start %}{% endblock page_start %}
{# Navbar #}
<div class="container">
{% include "components/navbar.html" %}
</div>
<div id="footer">
<p class="gray">-- EOF --</p>
<p>
<em>
<a href="https://github.com/ewpratten/va3zza.com"><i class="lab la-github"></i></a>
<a href="https://status.ewpratten.com"><i class="las la-info-circle"></i></a>
<a href="/rss.xml"><i class="las la-rss"></i></a><br>
Thanks for reading :)<br>
Site design & content by: <a href="/info">Evan Pratten</a><br>
Consider <a href="/donate" target="_blank">supporting my work</a> if you like what you see<br>
</em>
</p>
{# Actual content #}
<div id="content" class="container">
<article class="markdown-body">
{% block content %}{% endblock content %}
</article>
</div>
{# Footer #}
{% include "components/footer.html" %}
</div>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-5912H4H03P"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
{# External scripts #}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
gtag('config', 'G-5912H4H03P');
</script>
<script>
if (window.performance && performance.getEntriesByType) { // avoid error in Safari 10, IE9- and other old browsers
let navTiming = performance.getEntriesByType('navigation')
if (navTiming.length > 0) { // still not supported as of Safari 14...
let serverTiming = navTiming[0].serverTiming
if (serverTiming && serverTiming.length > 0) {
for (let i = 0; i < serverTiming.length; i++) {
if (serverTiming[i].name == 'source') {
if (serverTiming[i].description == 'net44') {
document.getElementById('ampr-notice').style.display = 'block';
}
}
}
}
}
}
</script>
{# URL Rewriter for retrylife.ca #}
<script>
if (window.location.hostname == 'retrylife.ca') {
window.location.href = window.location.href.replace('retrylife.ca', 'ewpratten.com');
}
</script>
{# Meta magic for mastodon verification #}
<a rel="me" href="https://social.ewpratten.com/@evan" style="display:none;"></a>
{% include "components/metadata/analytics.html" %}
</body>
</html>

View File

@ -0,0 +1,46 @@
{% block component_styles %}
{{ super() }}
<link rel="stylesheet" href="/styles/components/about-card.css">
{% endblock component_styles %}
<div class="about-card">
<div class="profile-photo-container">
<img src="{{config.extra.profile_photo}}" alt="Profile Photo">
</div>
<div class="text-container">
<div class="intro-text">
<h1>{{config.extra.name}}</h1>
<p>{{config.extra.profession}}</p>
</div>
<div class="quick-links">
<ul>
<li>
<a href="mailto:{{config.extra.email}}" rel="me">
<i class="las la-envelope"></i>
{{config.extra.email}}
</a>
</li>
<li>
<a href="https://github.com/{{config.extra.github}}" rel="me">
<i class="lab la-github"></i>
{{config.extra.github}}
</a>
</li>
<li>
<a href="https://linkedin.com/in/{{config.extra.linkedin}}" rel="me">
<i class="lab la-linkedin"></i>
{{config.extra.linkedin}}
</a>
</li>
<li>
<a href="/contact">
...&nbsp;&nbsp;more
</a>
</li>
</ul>
</div>
</div>
</div>
{# Mastodon requires this to exist somewhere, so why not here #}
<a rel="me" href="https://social.ewpratten.com/@evan" style="display:none;"></a>

View File

@ -0,0 +1,13 @@
{% block component_styles %}
{{ super() }}
<link rel="stylesheet" href="/styles/components/footer.css">
{% endblock component_styles %}
<div class="footer">
<br>
<span class="gray">-- EOF --</span>
<p>
Site design & content by: <a href="/contact">Evan Pratten</a><br>
Consider <a href="/donate" target="_blank">supporting my work</a> if you like what you see<br>
</p>
</div>

View File

@ -0,0 +1,14 @@
{% block component_styles %}
{{ super() }}
<link rel="stylesheet" href="/styles/components/heading-card.css">
{% endblock component_styles %}
<div class="heading-card">
<div class="profile-photo-container">
<img src="{{config.extra.profile_photo}}" alt="Profile Photo">
</div>
<div class="text-container">
<h1>{{config.extra.name}}</h1>
<p>{{config.extra.profession}}</p>
</div>
</div>

View File

@ -0,0 +1,5 @@
{% if current_url %}
<link rel="canonical" href="{{current_url}}" />
{% endif %}
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{get_url(path=config.feed_filename, trailing_slash=false)}}">

View File

@ -0,0 +1,9 @@
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-5912H4H03P"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-5912H4H03P');
</script>

View File

@ -0,0 +1,21 @@
{# Site info #}
<meta name="twitter:card" content="summary" />
<meta name="og:site" content="{{config.extra.domain_name}}" />
<meta name="og:site_name" content="{{config.title}}" />
{# Page image #}
<meta name="og:image"
content="{% block opengraph_image_url %}{{config.extra.profile_photo}}{% endblock opengraph_image_url %}" />
{# Page description #}
<meta property="og:description" content="{{description}}" />
<meta property="description" content="{{description}}" />
<meta name="description" content="{{description}}">
{# Page title #}
<meta property="og:title" content="{{title}} - {{config.title}}" />
{# Article-specifics #}
{% if is_article %}
<meta property="og:type" content="article" />
{% endif %}

View File

@ -0,0 +1,28 @@
{% for feature in feature_flags %}
{# KATEX #}
{% if feature == "katex" %}
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML' async></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ['\[','\]'] ]}});
</script>
{% endif %}
{# Flags #}
{% if feature == "flags" %}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/6.4.3/css/flag-icons.min.css"
integrity="sha512-uvXdJud8WaOlQFjlz9B15Yy2Au/bMAvz79F7Xa6OakCl2jvQPdHD0hb3dEqZRdSwG4/sknePXlE7GiarwA/9Wg=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
{% endif %}
{# Twitter embed #}
{% if feature == "twitter" %}
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
{% endif %}
{# Mermaid #}
{% if feature == "mermaid" or feature == "graphviz" %}
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
{% endif %}
{% endfor %}

View File

@ -0,0 +1,27 @@
{% block component_styles %}
{{ super() }}
<link rel="stylesheet" href="/styles/components/navbar.css">
{% endblock component_styles %}
<div class="ewp-navbar">
<hr>
<ul class="navbar-items">
<li><a href="/">Home</a></li>
<li class="separator">|</li>
<li><a href="/blog">Blog</a></li>
<li class="separator">|</li>
{# <li class="dropdown-center">
<a href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
More
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
<li class="separator">|</li> #}
<li><a href="/contact">Contact</a></li>
</ul>
<hr>
</div>

View File

@ -1,44 +1,41 @@
{% extends "base.html" %}
{% block title %}
{{section.title}}
{% endblock title %}
{# Additional metadata for Google #}
{% block head %}
{{ super() }}
<meta property="og:description" content="{{config.description}}" />
<meta property="description" content="{{config.description}}" />
<meta name="description" content="{{config.description}}">
<meta name="og:title" content="Evan Pratten (VA3ZZA)" />
<script type="application/ld+json">
{% set person_ld = load_data(path="static/person.jsonld")%}
{% if person_ld %}{{person_ld | safe}}{% endif %}
</script>
{% set person_ld = load_data(path="static/person.jsonld")%}
{% if person_ld %}{{person_ld | safe}}{% endif %}
</script>
<script type="application/ld+json">
{# Import our template file #}
{% set template = load_data(path="jsonld_templates/website.jsonld") %}
{# Now we can fill in any additional data #}
{{ template |
replace(from="{{url}}", to=config.base_url) |
replace(from="{{title}}", to=section.title) |
replace(from="{{description}}", to=config.description) |
replace(from="{{avatar}}", to=config.extra.profile_photo) |
safe
}}
</script>
{# Handle flags #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/6.4.3/css/flag-icons.min.css"
integrity="sha512-uvXdJud8WaOlQFjlz9B15Yy2Au/bMAvz79F7Xa6OakCl2jvQPdHD0hb3dEqZRdSwG4/sknePXlE7GiarwA/9Wg=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
{# Import our template file #}
{% set template = load_data(path="jsonld_templates/website.jsonld") %}
{# Now we can fill in any additional data #}
{{ template |
replace(from="{{url}}", to=config.base_url) |
replace(from="{{title}}", to=section.title) |
replace(from="{{description}}", to=config.description) |
replace(from="{{avatar}}", to=config.extra.profile_photo) |
safe
}}
</script>
{% endblock head %}
{# Pass data through to the base template #}
{% block variable_wormhole %}
{{ super() }}
{% set title = section.title %}
{% set description = config.description %}
{% if section.extra.uses %}
{% set feature_flags = section.extra.uses %}
{% endif %}
{% endblock variable_wormhole %}
{# Page content #}
{% block page_start %}
{% include "components/about-card.html" %}
{% endblock page_start %}
{% block content %}
{# <br>
<article class="markdown-body"> #}
{{section.content | safe}}
{# </article> #}
{{ section.content | safe }}
{% endblock content %}

View File

@ -1,58 +1,10 @@
{% extends "base.html" %}
{% block title %}
{{page.title}}
{% endblock title %}
{# Additional metadata for Google #}
{% block head %}
{# <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/4.0.0/github-markdown.min.css"
integrity="sha512-Oy18vBnbSJkXTndr2n6lDMO5NN31UljR8e/ICzVPrGpSud4Gkckb8yUpqhKuUNoE+o9gAb4O/rAxxw1ojyUVzg=="
crossorigin="anonymous" referrerpolicy="no-referrer" /> #}
{{ super() }}
{# Disable crawling if requested #}
{% if page.extra.no_crawl %}
<meta name="robots" content="noindex, nofollow">
{% endif %}
{% if page.extra.uses_katex %}
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML' async></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ['$$','$$'], ['\[','\]'] ]}});
</script>
{% endif %}
<meta property="og:title" content="{{page.title}} - Evan Pratten" />
<meta property="og:type" content="article" />
{% if page.description %}
<meta property="og:description" content="{{page.description}}" />
<meta property="description" content="{{page.description}}" />
{% else %}
<meta property="og:description" content="{{config.description}}" />
<meta property="description" content="{{config.description}}" />
{% endif %}
<meta property="article:published_time" content="{{page.date}}T00:00:00" />
{# Handle auto-centering request #}
{% if page.extra.auto_center_images %}
<style>
img {
display: block;
margin-left: auto;
margin-right: auto;
}
</style>
{% endif %}
{# Handle flags #}
{% if page.extra.uses_flags %}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/6.4.3/css/flag-icons.min.css"
integrity="sha512-uvXdJud8WaOlQFjlz9B15Yy2Au/bMAvz79F7Xa6OakCl2jvQPdHD0hb3dEqZRdSwG4/sknePXlE7GiarwA/9Wg=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
{% endif %}
{# Handle loading JSONLD #}
{% if page.extra.is_rfc or page.description and page.date %}
{% if page.description and page.date %}
<script type="application/ld+json">
{# Import our template file #}
{% set template = load_data(path="jsonld_templates/blog_post.jsonld") %}
@ -66,53 +18,30 @@ MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], displayMat
}}
</script>
{% endif %}
{# Handle redirects if needed #}
{% if page.extra.redir_to %}
<meta http-equiv="refresh" content="0; url={{page.extra.redir_to}}" />
{% endif %}
{% endblock head %}
{% block profile %}
<div class="row">
<div class="headshot-container">
<img src="{{config.extra.profile_photo}}" alt="Headshot" style="height:50px;width:auto;">
</div>
<div class="text-container">
<h1>{{config.extra.name}}</h1>
<p>
{{config.extra.profession}}
</p>
</div>
</div>
{% endblock profile %}
{# Pass data through to the base template #}
{% block variable_wormhole %}
{{ super() }}
{% set title = page.title %}
{% set description = page.description %}
{% set is_article = true %}
{% if page.extra.uses %}
{% set feature_flags = page.extra.uses %}
{% endif %}
{% if page.extra.redir_to %}
{% set redirect_target = page.extra.redir_to %}
{% endif %}
{% endblock variable_wormhole %}
{# Page content #}
{% block page_start %}
{% include "components/heading-card.html" %}
{% endblock page_start %}
{% block content %}
<h1 style="margin-bottom:0;padding-bottom:0;">{{page.title}}</h1>
<em>{{page.description}}</em>
<br><br>
<article class="markdown-body">
{% if page.description %}
<h1 style="border:none;margin-bottom:0;padding-bottom:0">{{page.title}}</h1>
<h3 style="margin-top:0;color:gray;padding-bottom:.3em;border-bottom:1px solid #eaecef;">
<em>
<span style="color:rgb(186, 186, 186)">/*</span>
{{page.description}}
<span style="color:rgb(186, 186, 186)">*/</span>
</em>
</h3>
{% else %}
<h1>{{page.title}}</h1>
{% endif %}
<div style="text-align: justify;">
{{page.content | safe}}
</div>
</article>
{% if page.extra.uses_twitter %}
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
{% endif %}
{% if page.extra.uses_graphviz %}
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
{% endif %}
{{ page.content | safe }}
{% endblock content %}

View File

@ -1,113 +1,49 @@
{% extends "base.html" %}
{% block title %}
{{section.title}}
{% endblock title %}
{% block head %}
{# Pass data through to the base template #}
{% block variable_wormhole %}
{{ super() }}
{# Disable crawling if requested #}
{% if section.extra.no_crawl %}
<meta name="robots" content="noindex, nofollow">
{% set title = section.title %}
{% set description = section.description %}
{% if section.extra.uses %}
{% set feature_flags = section.extra.uses %}
{% endif %}
{% endblock variable_wormhole %}
<meta property="og:title" content="{{section.title}} - Evan Pratten" />
{% if section.description %}
<meta property="og:description" content="{{section.description}}" />
<meta property="description" content="{{section.description}}" />
{% else %}
<meta property="og:description" content="{{config.description}}" />
<meta property="description" content="{{config.description}}" />
{% endif %}
{# Handle listing blog posts nicely in search #}
{% if section.extra.inject_blog_posts %}
<script type="application/ld+json">
{
"@context":"https://schema.org",
"@type":"ItemList",
"itemListElement":[
{% for page in section.pages %}
{% if not page.extra.hidden %}
{
"@type":"ListItem",
"position": "{{loop.index}}",
"item": {
"@type": "Article",
"headline": "{{page.title}}",
"url":"https://ewpratten.com{{page.path | safe}}",
"author": [{
"@type": "Person",
"name": "Evan Pratten",
"url": "https://ewpratten.com"
}]
}
} {% if not loop.last %},{% endif %}
{% endif %}
{% endfor %}
]
}
</script>
{% endif %}
{% endblock head %}
{# Page content #}
{% block page_start %}
{% include "components/heading-card.html" %}
{% endblock page_start %}
{% block content %}
{% if section.extra.enable_gh_markdown %}
<article class="markdown-body">
{% endif %}
{{section.content | safe}}
{% if section.extra.enable_gh_markdown %}
</article>
{% endif %}
{{ section.content | safe }}
{# Blog posts #}
{% if section.extra.inject_blog_posts %}
<ul style="margin:0">
<div>
{# Posts shall be broken down by year #}
{% set title_year = "3000" %}
{% for page in section.pages %}
{% if not page.extra.hidden %}
{% set page_year = page.date | date(format="%Y")%}
{% if page_year != title_year %}
{% set_global title_year = page_year %}
</ul>
<h2>{{title_year}}</h2>
<ul>
{% endif %}
{# Handle various embed modes #}
{% if section.extra.section_embed_mode %}
<li class="blog-post-li"><span style="color:{% if page.draft %}red{% else %}gray{% endif %};">{{page.date}}:</span> <a
href="{{page.path}}">{{page.title}}</a>
</li>
{% endif %}
{% endfor %}
</ul>
<br><br>
{% endif %}
{# RFCs #}
{% if section.extra.inject_rfcs %}
{% if section.extra.section_embed_mode == "blog_posts" %}
{# <ul style="margin:0"> #}
<div>
{# Posts shall be broken down by year #}
{% set title_year = "3000" %}
{% for page in section.pages %}
{% if not page.extra.hidden %}
{% set page_year = page.date | date(format="%Y")%}
{% if page_year != title_year %}
{% set_global title_year = page_year %}
</ul>
<h2>{{title_year}}</h2>
<ul>
{% for page in section.pages %}
{% if not page.extra.hidden %}
<li class="blog-post-li"><a href="{{page.path}}">{{page.title}}</a> <span style="color:gray;">({{page.date}})</span>
{% endif %}
<li class="blog-post-li"><span style="color:{% if page.draft %}red{% else %}gray{% endif %};">{{page.date}}:</span>
<a href="{{page.path}}">{{page.title}}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
{# Notes #}
{% if section.extra.inject_notes %}
<ul>
{% for page in section.pages %}
{% if not page.extra.hidden %}
<li class="blog-post-li"><a href="{{page.path}}">{{page.title}}</a>
</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
{% endblock content %}

View File

@ -1,8 +0,0 @@
<div class="carded-section">
<div class="header">
<span>{{title}}</span>
</div>
<div class="content">
{{body | safe}}
</div>
</div>