Compare commits

...
7 Commits
Author SHA1 Message Date
nelsbrock dd95c144f3 add .editorconfig and fix formatting 2026-05-07 16:57:34 +02:00
nelsbrock 95a91d9aca fix formatting of jinja files 2026-05-07 16:35:59 +02:00
nelsbrock adadafca15 use jinja to statically build website 2026-05-07 01:37:03 +02:00
nelsbrock 224926a9c8 redesign background and footer 2026-02-04 23:15:59 +01:00
nelsbrock f8435c95a3 update PGP key, add WKD 2025-10-20 16:43:15 +02:00
nelsbrock 5e912ce3d4 update PGP key 2025-10-16 18:55:18 +02:00
nelsbrock c5e71a7fd4 remove Bluesky link 2025-09-29 17:19:29 +02:00
27 changed files with 223 additions and 203 deletions
+11
View File
@@ -0,0 +1,11 @@
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[{*.{html.jinja,css,txt}}]
indent_style = tab
indent_size = 4
+1
View File
@@ -0,0 +1 @@
/dist
Executable
+56
View File
@@ -0,0 +1,56 @@
#!/usr/bin/env python
import contextlib
from io import BufferedWriter, FileIO
import os
import shutil
import git
from jinja2 import Environment, FileSystemLoader
SOURCES_DIR = "src"
DIST_DIR = "dist"
def latest_git_commit_year() -> int:
return git.Repo(".").head.commit.authored_datetime.year
def build_template(env: Environment, src_path: str):
rel_path = os.path.relpath(src_path, SOURCES_DIR)
dist_path = os.path.splitext(os.path.join(DIST_DIR, rel_path))[0]
template = env.get_template(rel_path)
rendered_text = template.render(copyright_year = latest_git_commit_year())
with BufferedWriter(FileIO(dist_path, "wb")) as writer:
for line in rendered_text.splitlines():
line = line.strip()
if len(line) > 0:
writer.write(line.encode())
writer.write(b"\n")
def main():
with contextlib.suppress(FileNotFoundError):
shutil.rmtree(DIST_DIR)
env = Environment(
loader=FileSystemLoader(SOURCES_DIR),
autoescape=True
)
for root, _, files in os.walk(SOURCES_DIR):
rel_dir_path = os.path.relpath(root, SOURCES_DIR)
dist_root = os.path.join(DIST_DIR, rel_dir_path)
os.makedirs(dist_root, exist_ok=True)
for src_name in files:
src_path = os.path.join(root, src_name)
if src_name.endswith(".jinja"):
if not src_name.startswith("_"):
build_template(env, src_path)
else:
dist_path = os.path.join(dist_root, src_name)
shutil.copy(src_path, dist_path)
if __name__ == '__main__':
main()
-42
View File
@@ -1,42 +0,0 @@
<!DOCTYPE html>
<!-- Copyright © 2025 Niklas Elsbrock -->
<html lang="de">
<head>
<meta charset="UTF-8" />
<title>Niklas Elsbrock</title>
<meta name="description" content="Persönliche Website von Niklas Elsbrock." />
<meta name="copyright" content="Niklas Elsbrock" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="/resources/style.css" />
</head>
<body>
<div class="viewstretch">
<main class="card">
<div class="main-info">
<h1>Niklas&nbsp;Elsbrock</h1>
<p>Softwareentwickler und Informatikstudent</p>
</div>
<hr />
<nav>
<ul>
<li><a class="link-github" href="https://github.com/nelsbrock">GitHub</a></li>
<li><a class="link-bluesky" href="https://bsky.app/profile/nelsbrock.de">Bluesky</a></li>
<li><a class="link-email" href="mailto:mail@nelsbrock.de">E-Mail</a></li>
<li><a class="link-pgp-key" href="/niklas_elsbrock.asc">PGP</a></li>
</ul>
</nav>
</main>
</div>
<footer>
<p>
&copy; 2025 Niklas&nbsp;Elsbrock
&middot; <a href="/privacy.html">Datenschutz</a>
&middot; <a href="/licenses.html">Open-Source-Lizenzen</a>
</p>
<p>Geeignet für Allergiker: Diese Website enthält kein JavaScript.</p>
</footer>
</body>
</html>
-55
View File
@@ -1,55 +0,0 @@
<!DOCTYPE html>
<!-- Copyright © 2025 Niklas Elsbrock -->
<html lang="de">
<head>
<meta charset="UTF-8" />
<title>Niklas Elsbrock &ndash; Open-Source-Lizenzen</title>
<meta name="description" content="Persönliche Website von Niklas Elsbrock." />
<meta name="copyright" content="Niklas Elsbrock" />
<meta name="viewport" content="width=device-width, initial-scale=0.75" />
<link rel="stylesheet" href="/resources/style.css" />
</head>
<body>
<div class="viewstretch">
<main>
<h1>Open-Source-Lizenzen</h1>
<h2>Schriftarten:</h2>
<h3>Überschriften: <a href="https://fontsarena.com/metropolis-by-chris-simpson/">Metropolis</a></h3>
<p>Public Domain (<a href="https://unlicense.org/">Unlicense</a>)</p>
<h3>Text: <a href="https://github.com/rsms/inter">Inter</a></h3>
<p>
Copyright (c) 2016-2020 The Inter Project Authors.<br />
"Inter" is trademark of Rasmus&nbsp;Andersson.<br />
Licensed under the <a href="https://scripts.sil.org/OFL">SIL Open Font License, Version 1.1</a>.
</p>
<h3>Icons: <a href="https://fontawesome.com/">Font Awesome Free</a></h3>
<p>
Copyright (c) 2024 Fonticons, Inc.<br />
with Reserved Font Name: "Font Awesome".<br />
Licensed under the <a href="https://scripts.sil.org/OFL">SIL Open Font License, Version 1.1</a>.
</p>
<hr />
<p>
<a href="/" data-icon="&#xf060;">Zurück zur Hauptseite</a>
</p>
</main>
</div>
<footer>
<p>
&copy; 2025 Niklas&nbsp;Elsbrock
&middot; <a href="/privacy.html">Datenschutz</a>
&middot; <a href="/licenses.html">Open-Source-Lizenzen</a>
</p>
<p>Geeignet für Allergiker: Diese Website enthält kein JavaScript.</p>
</footer>
</body>
</html>
-44
View File
@@ -1,44 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
zQKRYKL73nYAUDW7CL3Vog6EuyZwQzdVaW50Ag==
=n4Z7
-----END PGP PUBLIC KEY BLOCK-----
-48
View File
@@ -1,48 +0,0 @@
<!DOCTYPE html>
<!-- Copyright © 2025 Niklas Elsbrock -->
<html lang="de">
<head>
<meta charset="UTF-8" />
<title>Niklas Elsbrock &ndash; Datenschutz</title>
<meta name="description" content="Persönliche Website von Niklas Elsbrock." />
<meta name="copyright" content="Niklas Elsbrock" />
<meta name="viewport" content="width=device-width, initial-scale=0.75" />
<link rel="stylesheet" href="/resources/style.css" />
</head>
<body>
<div class="viewstretch">
<main>
<h1>Datenschutz</h1>
<p>Verantwortlich für diese Website ist</p>
<address>
Niklas Elsbrock<br />
<a href="mailto:mail@nelsbrock.de">mail@nelsbrock.de</a>
</address>
<h2>Keine Erfassung von Besucherinformationen</h2>
<p>
Beim Besuch der Website unter www.nelsbrock.de werden keine
personenbezogenen Daten verarbeitet. Zugriffsprotokolle sind
deaktiviert.
</p>
<hr />
<p>
<a href="/" data-icon="&#xf060;">Zurück zur Hauptseite</a>
</p>
</main>
</div>
<footer>
<p>
&copy; 2025 Niklas&nbsp;Elsbrock
&middot; <a href="/privacy.html">Datenschutz</a>
&middot; <a href="/licenses.html">Open-Source-Lizenzen</a>
</p>
<p>Geeignet für Allergiker: Diese Website enthält kein JavaScript.</p>
</footer>
</body>
</html>
View File
+28
View File
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<title>{% block title %}{% endblock %}</title>
<meta name="description" content="Persönliche Website von Niklas Elsbrock." />
<meta name="copyright" content="Niklas Elsbrock" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="/resources/style.css" />
</head>
<body>
<div class="viewstretch">
{% block main %}{% endblock %}
</div>
<footer>
<p>
&copy; {{ copyright_year }} Niklas&nbsp;Elsbrock
&middot; <a href="/privacy.html">Datenschutz</a>
&middot; <a href="/licenses.html">Open-Source-Lizenzen</a>
</p>
<p>Geeignet für Allergiker: Diese Website enthält kein JavaScript.</p>
</footer>
</body>
</html>
+20
View File
@@ -0,0 +1,20 @@
{% extends "_base.html.jinja" %}
{% block title %}Niklas Elsbrock{% endblock %}
{% block main %}
<main class="card">
<div class="main-info">
<h1>Niklas&nbsp;Elsbrock</h1>
<p>Softwareentwickler und Informatikstudent</p>
</div>
<hr />
<nav>
<ul>
<li><a class="link-github" href="https://github.com/nelsbrock">GitHub</a></li>
<li><a class="link-email" href="mailto:mail@nelsbrock.de">E-Mail</a></li>
<li><a class="link-pgp-key" href="/niklas_elsbrock.asc">PGP</a></li>
</ul>
</nav>
</main>
{% endblock %}
+34
View File
@@ -0,0 +1,34 @@
{% extends "_base.html.jinja" %}
{% block title %}Open-Source-Lizenzen &ndash; Niklas Elsbrock{% endblock %}
{% block main %}
<main>
<h1>Open-Source-Lizenzen</h1>
<h2>Schriftarten:</h2>
<h3>Überschriften: <a href="https://fontsarena.com/metropolis-by-chris-simpson/">Metropolis</a></h3>
<p>Public Domain (<a href="https://unlicense.org/">Unlicense</a>)</p>
<h3>Text: <a href="https://github.com/rsms/inter">Inter</a></h3>
<p>
Copyright (c) 2016-2020 The Inter Project Authors.<br />
"Inter" is trademark of Rasmus&nbsp;Andersson.<br />
Licensed under the <a href="https://scripts.sil.org/OFL">SIL Open Font License, Version 1.1</a>.
</p>
<h3>Icons: <a href="https://fontawesome.com/">Font Awesome Free</a></h3>
<p>
Copyright (c) 2024 Fonticons, Inc.<br />
with Reserved Font Name: "Font Awesome".<br />
Licensed under the <a href="https://scripts.sil.org/OFL">SIL Open Font License, Version 1.1</a>.
</p>
<hr />
<p>
<a href="/" data-icon="&#xf060;">Zurück zur Hauptseite</a>
</p>
</main>
{% endblock %}
+34
View File
@@ -0,0 +1,34 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEYEEKrBYJKwYBBAHaRw8BAQdAMnvJCDOYsUNINJOPgvZE3iE0O6VgTw5HDnND
nnkd8KnNI05pa2xhcyBFbHNicm9jayA8bWFpbEBuZWxzYnJvY2suZGU+wpkEExYI
AEECGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4ACGQEWIQTYMKWUelsRc6iQiDLr
s+RQYaOq0wUCaPYmYgUJEJrN1AAKCRDrs+RQYaOq06yBAP9TrhPTIEzJJdRj+AxD
Bm7QrCeexyDt8mRSi+UkeD8WuwEAoA9QTpigqpIHmuYrPK4VcJ6rtImutepvJWA3
f0OvdAbCwD8EFhYKALEFgmj2SIYJEOuz5FBho6rTRxQAAAAAAB4AIHNhbHRAbm90
YXRpb25zLnNlcXVvaWEtcGdwLm9yZ6j4DdA2Qim6sQz1X5gVKi9h1dPIMi7EAS1I
u+yoWNUBFiEE2DCllHpbEXOokIgy67PkUGGjqtNBpXhPICd21RNDgb1loe8NXp8P
QNr/s0DIeHEEqXVa7SAH4AUyupHIAhEZFDmqv3eawO6fEtmlQoWAe7TR9beANuIA
AGICAP4yR4Xkqjdu0zlLf4q759N3BCvEEGklUwRi/ECNd3FkowEAx+uLz+EmK0HR
yNI8HMEPsnqpSquYvYyrf12j0SvsHwTCwXMEEwEIAAYFAmP6FccAIQkQXlzMtKS/
Q9cWIQSGTouVHs/ASvK7Iz5eXMy0pL9D15LhD/4npNOYpq2X8rMdFWOZaQ+kECbO
CG4RG8QaJXNSnYJHEPjaWpPAl6AwJYFm08NQmdbgfAQBzxQC+Sr3NFgyj+W6YGdb
KmlQmjEzUQsUCol9nSq/GUrHC5ooKVp31XNLNuV30P1uZJOshwKSH4g/xSMKogQD
2xN/A77jjlcb/1QLRxi3ryDpLOEuk9pe99A+xaSxDJVMCCoo4lXlholET0hjhP9J
b6tPH8wtbWRMdOVfnTfS9yduPrRc/YPLy15xSsgwqAILyMY4CcyEMLHeyBqKCBY6
63RlhmfCpi5wLkXaLkb+wBgUbcAi2KJ2j/URO7ommCSvWppbbXiJCzvHAn0mImJ9
Mo/nhNqn576wr35T5krpDw95fP8Of62MjlfTX84hgFDc0oaOuxPo+4pmCrdSosv1
xpl0PfKIn0rT8rJYCmgnlZB6HWXrkmkNPWbGznVDHi2LxsbQHv7r89dmULKrcBuV
jlJpGEUUW3iozSFgTKtoMosZ0+HN3zC+N1EUZnrhXRX0Cm/XG+SWj0u7dHODa6HC
oGaA6D5WuGw3ApJHGXvVSdrXaOx0sCzbeMZkp+10Q/8v1zkZkQ5cLpcSrdN6Q8s2
dkd0Z7QSJUgEZZR01VhRsHLxW0ztJho+Oz7j6/+J+0nFaY/tFxsgHsR7d+oBUc1q
FWJqNxsbqmHiaHJZJs4zBGQwiUAWCSsGAQQB2kcPAQEHQJbQPzSGBGWUvB8zLUgW
ZL9sGI6gwLeqtj2JyskU4jg1wngEGBYIACACGyAWIQTYMKWUelsRc6iQiDLrs+RQ
YaOq0wUCaPYXZQAKCRDrs+RQYaOq0zjaAQCpYHb05FY9uDUHabBkdSLTYgD+mAHl
Pp/KC7yRjbTSPQEAhlggSW02FG1vJ8mIfzvzUrvVM4/0jxOWq/cpl7ndVgPOOARg
QQqsEgorBgEEAZdVAQUBAQdAy0etPTsX2mL1wMopD+QGkC1rq1c/KitGYcsBRkIM
RDMDAQgHwngEGBYIACACGwwWIQTYMKWUelsRc6iQiDLrs+RQYaOq0wUCaPYXYQAK
CRDrs+RQYaOq096KAP47dWc6mTxNxgGgtA6mBSSS5J6TnH7aFo+j5seVZWQ35QEA
u+dYrACDzFJxmVdjpbURRBevVYthZxn5asfWKe/YkAQ=
=5nMm
-----END PGP PUBLIC KEY BLOCK-----
+27
View File
@@ -0,0 +1,27 @@
{% extends "_base.html.jinja" %}
{% block title %}Datenschutz &ndash; Niklas Elsbrock{% endblock %}
{% block main %}
<main>
<h1>Datenschutz</h1>
<p>Verantwortlich für diese Website ist</p>
<address>
Niklas Elsbrock<br />
<a href="mailto:mail@nelsbrock.de">mail@nelsbrock.de</a>
</address>
<h2>Keine Erfassung von Besucherinformationen</h2>
<p>
Beim Besuch der Website unter www.nelsbrock.de werden keine
personenbezogenen Daten verarbeitet. Zugriffsprotokolle sind
deaktiviert.
</p>
<hr />
<p>
<a href="/" data-icon="&#xf060;">Zurück zur Hauptseite</a>
</p>
</main>
{% endblock %}
+12 -14
View File
@@ -1,16 +1,16 @@
/*
* Cascading Style Sheets für www.nelsbrock.de
* Copyright © 2025 Niklas Elsbrock
* Copyright © 2026 Niklas Elsbrock
*/
:root {
--bg-color: hsl(120, 25%, 7%);
--text-color: hsl(42, 20%, 85%);
--deco-color: hsl(42, 20%, 85%);
--card-link-color: hsl(42, 20%, 85%);
--card-link-hover-color: hsl(0, 0%, 100%);
--footer-bg-color: hsl(20, 25%, 5%);
--footer-text-color: hsl(0, 0%, 75%);
--text-color: hsl(0, 0%, 100%);
--deco-color: hsla(0, 0%, 100%, 0.4);
--card-link-color: var(--text-color);
--card-link-hover-color: var(--text-color);
--footer-bg-color: hsla(0, 0%, 0%, 0.6);
--footer-border-color: hsla(0, 0%, 0%, 0.25);
--footer-text-color: hsl(0, 0%, 100%);
}
@font-face {
@@ -147,7 +147,9 @@ body {
height: 100%;
margin: 0;
color: var(--text-color);
background-color: var(--bg-color);
background: linear-gradient(150deg, rgba(132, 58, 181, 1) 0%, rgba(207, 21, 21, 1) 80%, rgba(230, 126, 34, 1) 100%);
background-repeat: no-repeat;
background-attachment: fixed;
font-family: Inter, sans-serif;
}
@@ -236,10 +238,6 @@ main {
content: "\f09b";
}
.card nav a.link-bluesky::before {
content: "\e671";
}
.card nav a.link-email::before {
content: "\f0e0";
}
@@ -274,7 +272,7 @@ footer {
text-align: center;
font-size: 0.75rem;
color: var(--footer-text-color);
border-top: 2px dashed var(--footer-text-color);
border-top: 4px solid var(--footer-border-color);
background-color: var(--footer-bg-color);
scroll-snap-align: end;
}
View File