Compare commits
7 Commits
9cf38d78f1
...
2f224023fb
Author | SHA1 | Date | |
---|---|---|---|
2f224023fb | |||
cfe48023e6 | |||
36f9f62a0e | |||
9b7b19992c | |||
4d200e29d4 | |||
a9596734e4 | |||
4d857fc787 |
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
__pycache__
|
||||
log
|
||||
messages
|
||||
static/docs/mailpassword
|
||||
get-logs.sh
|
||||
upload.sh
|
||||
todo.txt
|
||||
website
|
14
config-uwsgi.ini
Normal file
@@ -0,0 +1,14 @@
|
||||
[uwsgi]
|
||||
module = wsgi:app
|
||||
|
||||
plugins = python3
|
||||
|
||||
socket = /tmp/myapp.sock
|
||||
chmod-socket = 660
|
||||
chown-socket = www-data:www-data
|
||||
vacuum = true
|
||||
buffer-size=32768
|
||||
master = true
|
||||
processes = 4
|
||||
logto = /var/log/nginx/%n.log
|
||||
die-on-term = true
|
375
server.py
Executable file
@@ -0,0 +1,375 @@
|
||||
#!/bin/python3
|
||||
|
||||
from flask import Flask, request, render_template, Response, send_file, g, url_for, redirect, make_response
|
||||
from random import randint
|
||||
import requests
|
||||
import datetime
|
||||
import smtplib
|
||||
import flask
|
||||
import time
|
||||
import os
|
||||
import json
|
||||
|
||||
app = Flask(__name__, static_url_path="", static_folder="static", template_folder="templates")
|
||||
|
||||
app.config['msgTime'] = datetime.datetime.now()
|
||||
app.config['reloadTime'] = datetime.datetime.now()
|
||||
|
||||
|
||||
weekday = [
|
||||
"Mon", "Tue", "Wed", "Thu",
|
||||
"Fri", "Sat", "Sun"
|
||||
]
|
||||
|
||||
def getIpInfo(ip):
|
||||
try:
|
||||
endpoint = f'https://ipinfo.io/{ip}/json'
|
||||
response = requests.get(endpoint, verify = True)
|
||||
|
||||
if response.status_code != 200:
|
||||
return None
|
||||
|
||||
return response.json()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def logConnection(req:request, site:str):
|
||||
|
||||
scraper = False
|
||||
ipInfo = getIpInfo(request.remote_addr);
|
||||
|
||||
logStr = f"{ req.remote_addr } connected on '{ time.asctime() }' to '{ site }' with user-agent '{ req.user_agent }'"
|
||||
|
||||
logFile = open(f"log/{datetime.datetime.now().strftime('%d.%m.%Y')}.log", "a")
|
||||
|
||||
try:
|
||||
logStr += f"\n^\tIP Country: '{ipInfo['country']}'\t"
|
||||
logStr += f"Region: '{ipInfo['region']}'\t"
|
||||
logStr += f"City: '{ipInfo['city']}'\t"
|
||||
logStr += f"Org: '{ipInfo['org']}'\t"
|
||||
|
||||
for i in app.config["config"]["blacklist"]:
|
||||
if ipInfo['org'].lower().find(i.lower()) != -1:
|
||||
scraper = True
|
||||
logFile.write("Scraper detected, redirecting that fucko\n")
|
||||
|
||||
logStr += f"Hostname: '{ipInfo['hostname']}'"
|
||||
|
||||
|
||||
except:
|
||||
logStr += "\n^\tError with IP-Info getter"
|
||||
|
||||
logFile.write(f"{logStr}\n\n")
|
||||
logFile.close()
|
||||
|
||||
if scraper:
|
||||
flask.abort(406)
|
||||
|
||||
def generateNavbar(selectedElement):
|
||||
return render_template("inline/navbar.html", navContent=app.config["config"]["navbar"], navSel=selectedElement,
|
||||
randomQuote=app.config["quote"][0],
|
||||
todos=app.config["todo"],
|
||||
updates=app.config["updates"],
|
||||
rndShit=app.config["random"][randint(0, len(app.config["random"])-1)])
|
||||
|
||||
|
||||
def generateFooter():
|
||||
updTime = datetime.datetime.fromtimestamp(os.path.getmtime("static/docs/config.json"))
|
||||
timeStr = f"{updTime.day}.{updTime.month}.{updTime.year} ({weekday[updTime.weekday()]})"
|
||||
|
||||
return render_template("inline/footer.html", buttons=app.config["config"]["buttons"], updated=timeStr)
|
||||
|
||||
|
||||
def generateStyle():
|
||||
style = """
|
||||
<style>
|
||||
:root {
|
||||
--main-bg-color: #fed6af;
|
||||
--main-bg-end-color: #ffffee;
|
||||
--main-color: #ffffff;
|
||||
--main-fg-color: #800000;
|
||||
--main-title-fg-color: #800000;
|
||||
|
||||
--title-align: left;
|
||||
--border-style: solid;
|
||||
--border-width: 0px;
|
||||
|
||||
--button-border-width: 1px;
|
||||
--button-border-style: solid;
|
||||
--button-selected-style: ridge;
|
||||
|
||||
--optional-link-background: #00000000;
|
||||
|
||||
--font-family: Arial, Helvetica, sans-serif;
|
||||
--font-size: 13px;
|
||||
|
||||
--background-image: url(../images/fade.png);
|
||||
}
|
||||
|
||||
</style>
|
||||
"""
|
||||
|
||||
return style
|
||||
|
||||
def getMultiples(i) -> str: #lol
|
||||
ret = "s"
|
||||
if i == 1:
|
||||
ret = ""
|
||||
return ret
|
||||
|
||||
|
||||
@app.errorhandler(406)
|
||||
def not_found_error(error):
|
||||
return render_template("scraper.html"), 406
|
||||
|
||||
@app.before_request
|
||||
def reload_jsons(anyway=False):
|
||||
|
||||
try:
|
||||
test = app.config["config"]["navbar"]
|
||||
except:
|
||||
anyway = True
|
||||
|
||||
if anyway or (datetime.datetime.now() - app.config['reloadTime']).seconds > 5:
|
||||
todoRaw = open("static/docs/todo.json", "r")
|
||||
app.config["todo"] = json.load(todoRaw)["todo"]
|
||||
|
||||
randomRaw = open("static/docs/random.json", "r")
|
||||
app.config["random"] = json.load(randomRaw)["rnd"]
|
||||
|
||||
quoteRaw = open("static/docs/lessons.json", "r")
|
||||
app.config["quote"] = json.load(quoteRaw)["lessons"]
|
||||
|
||||
funRaw = open("static/docs/funfacts.json", "r")
|
||||
app.config["fun"] = json.load(funRaw)["funfacts"]
|
||||
|
||||
updatesRaw = open("static/docs/updates.json", "r")
|
||||
app.config["updates"] = json.load(updatesRaw)["updates"]
|
||||
|
||||
photobookRaw = open("static/docs/photobook.json", "r")
|
||||
app.config["photobook"] = json.load(photobookRaw)["photobook"]
|
||||
|
||||
configRaw = open("static/docs/config.json", "r")
|
||||
app.config["config"] = json.load(configRaw)
|
||||
|
||||
passwordRaw = open("static/docs/mailpassword", "r")
|
||||
app.config["password"] = passwordRaw.readlines()[0].replace("\n", "")
|
||||
|
||||
todoRaw.close()
|
||||
randomRaw.close()
|
||||
quoteRaw.close()
|
||||
funRaw.close()
|
||||
updatesRaw.close()
|
||||
photobookRaw.close()
|
||||
configRaw.close()
|
||||
passwordRaw.close()
|
||||
|
||||
app.config["reloadTime"] = datetime.datetime.now()
|
||||
|
||||
print("Reloaded JSON's")
|
||||
|
||||
if not anyway:
|
||||
if request.method == "POST":
|
||||
if "test" in request.form:
|
||||
print("bruh")
|
||||
|
||||
|
||||
@app.route("/", methods=["GET", "POST"])
|
||||
def homepage():
|
||||
logConnection(request, "homepage");
|
||||
|
||||
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
|
||||
error = ""
|
||||
textinput = ""
|
||||
TEXTLEN = app.config["config"]["Textlength"]
|
||||
RATELIM = app.config["config"]["Ratelimit"]
|
||||
|
||||
if request.method == "POST":
|
||||
textinput = request.form["textvalue"]
|
||||
|
||||
if "send" in request.form:
|
||||
if (datetime.datetime.now() - app.config['msgTime']).seconds < RATELIM:
|
||||
waitTime = RATELIM - ((datetime.datetime.now() - app.config['msgTime']).seconds)
|
||||
error = f"Messages are rate limited. Please wait {waitTime} second{getMultiples(waitTime)} before trying again."
|
||||
|
||||
elif len(textinput) > TEXTLEN :
|
||||
remChars = len(textinput) - TEXTLEN
|
||||
error = f"Your text is too long. Trim by {remChars} char{getMultiples(remChars)}."
|
||||
|
||||
elif len(textinput) < 3:
|
||||
error = "Too short lol"
|
||||
|
||||
else:
|
||||
msg = open(f"messages/{datetime.datetime.now().strftime('%d.%m.%Y - %H:%M:%S')} : {request.remote_addr}", "w")
|
||||
|
||||
txt = f"IP: '{request.remote_addr}' with user-agent '{request.user_agent}' wrote:\n\n----------\n\n{textinput}\n\n--------\n\n"
|
||||
msg.write(txt)
|
||||
|
||||
info = ""
|
||||
try:
|
||||
info = getIpInfo(request.remote_addr)
|
||||
msg.write(str(info))
|
||||
except:
|
||||
None
|
||||
|
||||
msg.close();
|
||||
|
||||
|
||||
s = smtplib.SMTP("mail.weingardt.dev", 587)
|
||||
s.starttls()
|
||||
s.login("messages", app.config["password"])
|
||||
|
||||
try:
|
||||
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE FUCKO\n\n{txt}\n\n{info}")
|
||||
except:
|
||||
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE BUT KINDOF BROKEN\n\nIdk, failed to send mail but u got a message")
|
||||
|
||||
s.quit()
|
||||
|
||||
textinput = ""
|
||||
error = "Message send!"
|
||||
|
||||
app.config['msgTime'] = datetime.datetime.now()
|
||||
|
||||
elif "clear" in request.form:
|
||||
textinput = ""
|
||||
error = ""
|
||||
|
||||
|
||||
return render_template("home.html", style=generateStyle(), navbar=generateNavbar("Home"), footer=generateFooter(),
|
||||
lol="nope", errorValue=error, textvalue=textinput, textlength=TEXTLEN, ageinsert=f"{int(diff.days / 30 / 12)}")
|
||||
|
||||
|
||||
@app.route("/me")
|
||||
def me():
|
||||
logConnection(request, "me");
|
||||
|
||||
# Epic Birthday leak
|
||||
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
|
||||
|
||||
return render_template("me.html", style=generateStyle(), navbar=generateNavbar("Me"), footer=generateFooter(),
|
||||
ageinsert=f"{int(diff.days / 30 / 12)}",
|
||||
funfact=app.config["fun"][randint(0, len(app.config["fun"])-1)])
|
||||
|
||||
|
||||
|
||||
@app.route("/photobook/<pagenr>")
|
||||
def photobook(pagenr="0"):
|
||||
def generateContent(index) -> str:
|
||||
ret = ""
|
||||
style = "photo"
|
||||
|
||||
if len(app.config["photobook"][index]) == 4:
|
||||
style = app.config["photobook"][index][3]
|
||||
|
||||
for i in app.config["photobook"][index][2]:
|
||||
ret += f'<a href="../images/photobook/{ i }"><img src="../images/photobook/{ i }" class="{style}" loading="lazy"></a>'
|
||||
|
||||
|
||||
return ret
|
||||
|
||||
pagecarry = int(pagenr.split("&")[0])
|
||||
|
||||
nextDisabled = ""
|
||||
previousDisabled = ""
|
||||
|
||||
if pagenr.find("++") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(pagecarry + 1)))
|
||||
elif pagenr.find("--") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(pagecarry - 1)))
|
||||
elif pagenr.find("rnd") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(randint(0, int(((len(app.config["photobook"]) - 1 )/2)) ))))
|
||||
|
||||
logConnection(request, f"photobook/{pagecarry}")
|
||||
|
||||
if pagecarry < 1:
|
||||
previousDisabled = "disabled"
|
||||
if pagecarry >= (len(app.config["photobook"])/2) - 1:
|
||||
nextDisabled = "disabled"
|
||||
|
||||
leftDate = ""
|
||||
rightDate = ""
|
||||
leftDesc = ""
|
||||
rightDesc = ""
|
||||
leftContent = ""
|
||||
rightContent= ""
|
||||
|
||||
for i in range(pagecarry*2, (pagecarry*2)+2):
|
||||
if i >= len(app.config["photobook"]):
|
||||
break
|
||||
|
||||
if i % 2 == 0:
|
||||
leftDate = app.config["photobook"][i][0]
|
||||
leftDesc = app.config["photobook"][i][1]
|
||||
leftContent = generateContent(i)
|
||||
else:
|
||||
rightDate = app.config["photobook"][i][0]
|
||||
rightDesc = app.config["photobook"][i][1]
|
||||
rightContent = generateContent(i)
|
||||
|
||||
return render_template("photobook.html", nextDisabled=nextDisabled, previousDisabled=previousDisabled,
|
||||
pageLeftDate=leftDate, pageRightDate=rightDate,
|
||||
pageLeftDesc=leftDesc, pageRightDesc=rightDesc,
|
||||
contentLeftInsert=leftContent, contentRightInsert=rightContent)
|
||||
|
||||
@app.route("/photobook")
|
||||
def photobook_redirect():
|
||||
return redirect(url_for("photobook", pagenr="0"))
|
||||
|
||||
@app.route("/info")
|
||||
def info():
|
||||
logConnection(request, "info")
|
||||
return render_template("info.html", style=generateStyle(), navbar=generateNavbar("Info"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/ls7")
|
||||
def ls7():
|
||||
logConnection(request, "ls7.html")
|
||||
return render_template("ls7.html")
|
||||
|
||||
|
||||
@app.route("/projects")
|
||||
def projects():
|
||||
logConnection(request, "projects")
|
||||
return render_template("projects.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/posts")
|
||||
def posts():
|
||||
logConnection(request, "posts")
|
||||
return render_template("posts.html", style=generateStyle(), navbar=generateNavbar("Posts"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/misc")
|
||||
def misc():
|
||||
logConnection(request, "misc")
|
||||
return render_template("misc.html", style=generateStyle(), navbar=generateNavbar("Misc"), footer=generateFooter())
|
||||
|
||||
@app.route("/lessons")
|
||||
def lessons():
|
||||
logConnection(request, "lessons")
|
||||
|
||||
return render_template("lessons.html", style=generateStyle(), randomQuote=app.config["quote"])
|
||||
|
||||
@app.route("/ssup")
|
||||
def ssup():
|
||||
logConnection(request, "ssup")
|
||||
|
||||
return render_template("ssup.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
|
||||
|
||||
@app.route("/changestyle", methods=["GET","POST"])
|
||||
def changeStyle():
|
||||
resp = make_response("Set style cookie")
|
||||
|
||||
if request.method == "POST":
|
||||
if "change" in request.form:
|
||||
print(request.form["stylebox"])
|
||||
#resp.set_cookie("style", request.form["stylebox"])
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
reload_jsons(True)
|
||||
app.run(host="0.0.0.0")
|
BIN
static/buttons/cc-by-sa.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
static/buttons/discord-no-way.gif
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
static/buttons/encryptyourshit.gif
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
static/buttons/f_ckfb.gif
Normal file
After Width: | Height: | Size: 780 B |
BIN
static/buttons/fftake.gif
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
static/buttons/gitea.gif
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
static/buttons/gnu-linux.gif
Normal file
After Width: | Height: | Size: 550 B |
BIN
static/buttons/internetprivacy.gif
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
static/buttons/landchad.gif
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
static/buttons/larbs.gif
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
static/buttons/latex.gif
Normal file
After Width: | Height: | Size: 457 B |
BIN
static/buttons/nftbutton.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
static/buttons/nochrome.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
static/buttons/noweb3.gif
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
static/buttons/right2repair.gif
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
static/buttons/slowuserbox.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
static/buttons/ublock.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
static/buttons/vocaloid.gif
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
static/buttons/vscodium.png
Normal file
After Width: | Height: | Size: 415 B |
BIN
static/buttons/win10no.gif
Normal file
After Width: | Height: | Size: 1.7 KiB |
65
static/docs/config.json
Normal file
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"Textlength": 512,
|
||||
"Ratelimit": 30,
|
||||
|
||||
"navbar": [
|
||||
["P", "🏠 Home", "homepage"],
|
||||
["P", "🧍 Me", "me"],
|
||||
["SEP"],
|
||||
["P", "📸 Photobook", "photobook_redirect"],
|
||||
["D", "🛠️ Projects", "projects"],
|
||||
["D", "🪧 Misc", "misc"],
|
||||
["SEP"],
|
||||
["D", "📂 Git", "https://git.weingardt.dev/explore/repos"],
|
||||
["P", "ℹ️ Website Info", "info"]
|
||||
],
|
||||
|
||||
"buttons" : [
|
||||
["CC BY-SA 4.0", "https://creativecommons.org/licenses/by-sa/4.0/", "cc-by-sa.png"],
|
||||
["Right to repair", "", "right2repair.gif"],
|
||||
["Made on Gnu/Linux", "https://www.gnu.org/home.en.html", "gnu-linux.gif"],
|
||||
["Anything but Chrome", "https://librewolf.net/", "nochrome.png"],
|
||||
["UBlock Origin Now!", "https://ublockorigin.com/", "ublock.png"],
|
||||
["Latex!", "", "latex.gif"],
|
||||
["Get a Website - Landchad", "https://landchad.net/", "landchad.gif"],
|
||||
["Discord? No Way!", "", "discord-no-way.gif"],
|
||||
["Noobuntu is Bloated!", "https://larbs.xyz/", "larbs.gif"],
|
||||
["Take back the Web", "", "fftake.gif"],
|
||||
["My Gitea", "https://git.weingardt.dev", "gitea.gif"]
|
||||
],
|
||||
|
||||
"blacklist": [
|
||||
"TECHOFF",
|
||||
"Contabo",
|
||||
"Charter",
|
||||
"DigitalOcean",
|
||||
"Censys",
|
||||
"Tencent",
|
||||
"Cyberzone",
|
||||
"Amazon",
|
||||
"Comcast",
|
||||
"Oracle",
|
||||
"CHINANET",
|
||||
"province",
|
||||
"China",
|
||||
"Internet Utilities",
|
||||
"Limited",
|
||||
"EGIHosting",
|
||||
"Henan Mobile Communications",
|
||||
"Alibaba",
|
||||
"Chongqing"
|
||||
],
|
||||
|
||||
"altbuttons": [
|
||||
["Made with VSCodium", "https://vscodium.com/", "vscodium.png"],
|
||||
["Windows 10, NO", "", "win10no.gif"],
|
||||
["No NFT's", "", "nftbutton.gif"],
|
||||
["Internet Privacy Now!", "https://anonymousplanet.org/", "internetprivacy.gif"],
|
||||
["Vocaloid Now!", "", "vocaloid.gif"],
|
||||
["Encrypt Your Shit", "https://gitlab.com/cryptsetup/cryptsetup", "encryptyourshit.gif"],
|
||||
["No Web 3!", "", "noweb3.gif"],
|
||||
"https://tosdr.org",
|
||||
|
||||
["D", "📰 Posts", "posts"]
|
||||
]
|
||||
}
|
20
static/docs/funfacts.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"funfacts" : [
|
||||
"I'm left handed!",
|
||||
"I daily a 18 y/o laptop",
|
||||
"In my head I think I'm special eventhough I'm not",
|
||||
"When I'm bored at REDACTED, I program in PowerShell",
|
||||
"I still use X11",
|
||||
"I use a minidisk player. Fuck streaming services",
|
||||
"I like public transport",
|
||||
"I lost my sence of purpose xD",
|
||||
"I write a diary",
|
||||
"I prefer pen'n paper over something digital",
|
||||
"I do electronics since I'm 14y/o",
|
||||
"I hate social media",
|
||||
"I don't watch porn",
|
||||
"I want a cabin in the woods",
|
||||
"Money doesn't make me happy",
|
||||
"I hate mainstream media and mass entertainment and avoid it"
|
||||
]
|
||||
}
|
15
static/docs/lessons.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"lessons": [
|
||||
["10.09.2025", "Clippies are a blessing"],
|
||||
["06.09.2025", "Plan before cutting"],
|
||||
["01.09.2025", "Don't loose your favorite pen :("],
|
||||
["30.08.2025", "Imagination is evil"],
|
||||
["25.08.2025", "Who would have guessed that eating hotpot also equals to a hotpot aftermath. Never. again"],
|
||||
["22.08.2025", "Underpromisse and still underdeliver is a bad strategy"],
|
||||
["21.08.2025", "As a child I was told I was a void pointer. As an adult I've come to realise that I'm actually a null pointer"],
|
||||
["20.08.2025", "<img src='../images/headbang.gif' width='80' height='80'>"],
|
||||
["19.08.2025", "Work is just daycare for adults"],
|
||||
["14.08.2025", "Is there a cheatcode for infinite motivation? Some have found it, while I'm still searching"],
|
||||
["13.08.2025", "Maybe don't be lazy '\\^^/'"]
|
||||
]
|
||||
}
|
143
static/docs/photobook.json
Normal file
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"photobook": [
|
||||
[ "18.09.2025", "Found some young <a href='https://en.wikipedia.org/wiki/Fomitopsis_betulina'>birch polypore</a> and made tea out of those. This mushroom is full of vital substances and can even be consumed raw when young and squishy. The tea tastet very spicy, but only when it's hot, as soon as it cools down it wasn't as spicy.",
|
||||
[ "mushrooms/staeublinge.jpeg", "mushrooms/birken_porling_tea.jpeg"]
|
||||
],
|
||||
[ "13.09.2025", "",
|
||||
[ "misc/tree-love.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "07.09.2025", "Butterairplane",
|
||||
[ "misc/butterfly.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "30.08.2025", "<a href='https://inv.nadeko.net/watch?v=gChOifUJZMc'>Autobahn</a>",
|
||||
[ "misc/autobahn.png" ], "dontSquish"
|
||||
],
|
||||
[ "24.08.2025", "Gamescom. PRAY!",
|
||||
[ "misc/gamescom2025.jpg", "misc/gamescom2025_enderpray.jpg",
|
||||
"misc/gamescom2025_pray.jpg", "misc/gamescom2025_stab.jpg" ]
|
||||
],
|
||||
[ "23.08.2025", "My try on a 3D renderer with triangles written in plain C. It's shit lol. Still have to implement depth and the camera.",
|
||||
[ "projects/3drenderer.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "17.08.2025", "Went again with my mum. Found alot of Hexenröhrlinge, Perlpilze and Frauentäublinge. Seems my odds with women aren't all that bad.",
|
||||
[ "mushrooms/mushrooms3.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "16.08.2025", "Wanted to collect mushrooms on my own. Found a rare one called 'Eichhase'<br>It's apparently good against lung cancer and leuchemia and one can also eat is raw. I choose to dry mine. But yes some of the others look dry. Hasn't rained in a few days.",
|
||||
[ "mushrooms/mushrooms2.jpg", "mushrooms/mushrooms2_dried.jpg",
|
||||
"misc/rodina1.jpg", "misc/rodina2.jpg" ]
|
||||
],
|
||||
[ "12.08.2025", "Found almost 2kg's of Steinpilze with ma mum. Hehe dried them all ;)",
|
||||
[ "mushrooms/mushrooms1.jpg", "mushrooms/mushrooms1_dried.jpg" ]
|
||||
],
|
||||
[ "10.08.2025", "Wandern on the Rhine with cool friends",
|
||||
[ "wandern/mirror_pic.jpg", "wandern/pain_in_feet_help.jpg",
|
||||
"wandern/marching.jpg", "wandern/cool_selfie.jpg" ]
|
||||
],
|
||||
[ "10.08.2025", "",
|
||||
[ "wandern/rail_shot.jpg", "wandern/parasol_grilled.jpg",
|
||||
"wandern/bonfire.jpg", "wandern/rhein.jpg" ]
|
||||
],
|
||||
[ "24.07.2025", "Wow this all Denmark got to offer :( ?<br>(I really tried my best lol) But idc, ate him anyway.",
|
||||
[ "misc/denmark_fish.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "16.07.2025", "Trip round the hood. I like the old syrup bottle :D",
|
||||
[ "weida/inside_long_exposure.jpg", "weida/outside.jpg",
|
||||
"weida/lift.jpg", "weida/cool_wall.jpg",
|
||||
"weida/river.jpg", "weida/sirup.jpg" ]
|
||||
],
|
||||
[ "16.07.2025", "Just a ink factory chilling there. <br>Closed ~1988",
|
||||
[ "ink-factory/sacrifice_wtf.jpg", "ink-factory/inside.jpg", "ink-factory/chimney_tree.jpg",
|
||||
"ink-factory/outside.jpg", "ink-factory/upstairs.jpg", "ink-factory/docs.jpg"
|
||||
]
|
||||
],
|
||||
[ "15.07.2025", "Rittergut in Gera. An old porzellan factory <br>Close date idk",
|
||||
[ "rittergut/ddr_sign.jpg", "rittergut/karl_marx_sign.jpg",
|
||||
"rittergut/outside.jpg", "rittergut/kitchen.jpg"
|
||||
]
|
||||
],
|
||||
[ "15.07.2025", "Always wanted to eat breakfast in school",
|
||||
[ "misc/school_breakfast.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "14.07.2024", "Now look what we found. An original UDSSR cigarette pack, but without content ofc xD",
|
||||
[ "russian-factory/udssr_ciggs_front.jpg", "russian-factory/udssr_ciggs_bottom.jpg" ]
|
||||
],
|
||||
[ "14.07.2025", "Russian factory again :D (this time with food and a proper camera). <br>Closed ~1991",
|
||||
[ "russian-factory/house.jpg", "russian-factory/roofview.jpg", "russian-factory/grownroom.jpg",
|
||||
"russian-factory/where_floor.jpg", "russian-factory/cooking.jpg", "russian-factory/food.jpg"
|
||||
]
|
||||
],
|
||||
[ "13.07.2025", "Railroad adventures",
|
||||
[ "misc/railroad-1.jpg", "misc/railroad-2.jpg" ],
|
||||
"dontSquish"
|
||||
],
|
||||
[ "11.07.2025", "Sleeping outside is like therapy<br>(Wtf, since when got ticks this fucking small?)",
|
||||
[ "camping/camping2.jpeg", "camping/cool_tree.jpeg",
|
||||
"camping/morning.jpeg", "camping/tick.jpeg" ]
|
||||
],
|
||||
[ "08.07.2025", "Thinkpad Folterbank (last photo before it's neck broke)",
|
||||
[ "projects/thinkpad_folterbank.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "03.07.2025", "Hehe random abandoned Russian factory",
|
||||
[ "russian-factory/basement.jpeg", "russian-factory/plant_room.jpeg",
|
||||
"russian-factory/rooftop_view.png", "russian-factory/pinwall.png"]
|
||||
],
|
||||
[ "29.06.2025", "Cool dude, recommend u visit him ;)",
|
||||
[ "misc/cool_dude.jpg" ], "dontSquish"
|
||||
],
|
||||
[ "23.06.2025", "Sad day.<br>Hopefully things get better",
|
||||
[ "misc/white_elster.jpeg", "misc/bridge.jpeg" ]
|
||||
],
|
||||
[ "21.06.2025", "Boy does it feel good to be home again",
|
||||
[ "misc/cherry-tree.jpeg", "misc/home.jpeg" ]
|
||||
],
|
||||
[ "10.06.2025", "If you dig hard enough, you also may end up finding a Commodore PET in your school :)",
|
||||
[ "misc/pet.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "09.06.2025", "Don't enjoy the things one used to enjoy? Then do the things you don't enjoy: Jogging",
|
||||
[ "me/walk.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "07.06.2025", "Camping!",
|
||||
[ "camping/camping.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "03.06.2025", "One of my most favorite dishes: Stroganov with Buckwheat.<br>A Russian classic fit to my liking.",
|
||||
[ "misc/stroganov.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "12.05.2025", "Thuringa in May.<br>A very beautiful view and sad day.",
|
||||
[ "misc/gera.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "06.04.2025", "LS7 computer rev. 2 PCB<br>This was a weeks worth of just PCB drawing. Will order that shit in a week or so.",
|
||||
[ "projects/ls7computer_raytraced1.png", "projects/ls7computer_raytraced2.png" ] ,
|
||||
"dontSquish"
|
||||
],
|
||||
[ "02.04.2025", "Don't mind me, just recording my Minidisks",
|
||||
[ "misc/minidisk.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "20.03.2025", "Forg!",
|
||||
[ "misc/forg.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "09.03.2025", "LS7 Wozmon! (and secret plans for the future)",
|
||||
[ "projects/ls7_wozmon.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "17.02.2025", "Look what ma (not so anymore) girlfriend made for me!",
|
||||
[ "misc/tux_plush.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "14.02.2025", "Casually testing my kernel in school",
|
||||
[ "projects/kernel_testing_in_school.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "12.01.2025", "",
|
||||
[ "misc/me_workplace.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "26.12.2024", "Testing the new video card design. Got it down from 26 to 25 chips!",
|
||||
[ "projects/video_card_testing.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "03.12.2024", "Ooooh yes, finally left Arch for good. Finally installed gentoo on my Thinkpad X61t, just how it's meant to be.",
|
||||
[ "misc/gentoo_thinkpad_x61t.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "20.11.2024", "Server Love",
|
||||
[ "me/server_love.jpeg" ], "dontSquish"
|
||||
],
|
||||
[ "19.11.2024", "All my beloved ThinkPads ;)",
|
||||
[ "misc/all_my_thinkpads.jpg" ], "dontSquish"
|
||||
]
|
||||
]
|
||||
}
|
42
static/docs/random.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"rnd" : [
|
||||
"<marquee><h1>SHIT</h1></marquee>",
|
||||
"This is random",
|
||||
"<img src='/buttons/slowuserbox.png'>",
|
||||
"<img src='/images/pixels.png'>",
|
||||
|
||||
"<img src='/images/4get.png'><br><a href='https://4get.weingardt.dev/'>4GET! EVERYTHING</a>",
|
||||
|
||||
"<img src='/images/hittingfloor.gif'>",
|
||||
"<img src='/images/keep_seeding.gif'>",
|
||||
"I'm just a arkward little person wandering back and forth",
|
||||
"Gentoo love",
|
||||
"Lucky you",
|
||||
"This site is always under construction",
|
||||
"What the fuck is wrong with me?",
|
||||
"Will someone ever read this?",
|
||||
"Orphelins are underrated 🍀",
|
||||
"I hate HTML+CSS",
|
||||
"<img src='/images/texture.png'>",
|
||||
"<img src='/images/crybitch.jpg'>",
|
||||
"<img src='/images/programming_affection.png'>",
|
||||
"<img src='/images/stallman_floor_absolute_proprietary.png'>",
|
||||
"<img src='/images/stallman_gets_bitches.png'>",
|
||||
"<img src='/images/stallman_pls_respond.png'>",
|
||||
"<img src='/images/stallman_shooting_you.png'>",
|
||||
"<img src='/images/what_humans_were_made_to_do.png'>",
|
||||
"<img src='/images/wojak_apple_consoomer.png'>",
|
||||
"<img src='/images/wojak_hates_paper_money.png'>",
|
||||
"<img src='/images/bash.webp'>",
|
||||
"1337",
|
||||
"<a href='https://dimden.dev/'>👉 ^ dimden.dev ^ 👈</a>",
|
||||
"Fuck YouTube <a href='https://inv.nadeko.net/'>inv.nadeko.net</a>",
|
||||
"<img src='/images/morrita.gif'>",
|
||||
"<img src='/images/4evar.gif'>",
|
||||
"LOLCAT HAS MY GIF ON HIS SITE!!"
|
||||
],
|
||||
|
||||
"alt": [
|
||||
""
|
||||
]
|
||||
}
|
24
static/docs/todo.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"comment": [
|
||||
"0 = NOT",
|
||||
"1 = CHECKED",
|
||||
"s = Striketrough"
|
||||
],
|
||||
|
||||
"todo" : [
|
||||
["1", "Get this shit Online"],
|
||||
["0", "Finish this Website"],
|
||||
["1", "Rework Photobook"],
|
||||
["s", "Re-Add styles with cookies"],
|
||||
["0", "Video about LS7 Computer"],
|
||||
["0", "Build ma beloved 6502 phone"],
|
||||
["0", "Build a simple wrist watch"],
|
||||
["0", "Get a drivers license lol"],
|
||||
["0", "Code a somewhat usable 3D renderer"],
|
||||
["0", "Write docs for LS7 Computer 😭"],
|
||||
["0", "Build LS7 Laptop"],
|
||||
["0", "Finish LS7 Kernel (IKARUS)"],
|
||||
["0", "Get a girlfriend lol"]
|
||||
|
||||
]
|
||||
}
|
11
static/docs/updates.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"updates" : [
|
||||
["21.09.2025", "Finally fixed my mail server and last updated label"],
|
||||
["13.09.2025", "privatebin instance now online on https://bin.weingardt.dev/"],
|
||||
["05.09.2025", "4get instance now has https"],
|
||||
["01.09.2025", "Fixed shitty spelling"],
|
||||
["29.08.2025", "Migrated to a new Server and got this shit online!"],
|
||||
["19.08.2025", "Photobook got reworked :)"],
|
||||
["14.08.2025", "Website got completly rewritten and doesn't use JavaScript anymore!"]
|
||||
]
|
||||
}
|
BIN
static/fonts/FreePixel.ttf
Normal file
29
static/robots.txt
Executable file
@@ -0,0 +1,29 @@
|
||||
# When the robots.txt is sus
|
||||
|
||||
# ⠀⠀⠀⡯⡯⡾⠝⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢊⠘⡮⣣⠪⠢⡑⡌
|
||||
# ⠀⠀⠀⠟⠝⠈⠀⠀⠀⠡⠀⠠⢈⠠⢐⢠⢂⢔⣐⢄⡂⢔⠀⡁⢉⠸⢨⢑⠕⡌
|
||||
# ⠀⠀⡀⠁⠀⠀⠀⡀⢂⠡⠈⡔⣕⢮⣳⢯⣿⣻⣟⣯⣯⢷⣫⣆⡂⠀⠀⢐⠑⡌
|
||||
# ⢀⠠⠐⠈⠀⢀⢂⠢⡂⠕⡁⣝⢮⣳⢽⡽⣾⣻⣿⣯⡯⣟⣞⢾⢜⢆⠀⡀⠀⠪
|
||||
# ⣬⠂⠀⠀⢀⢂⢪⠨⢂⠥⣺⡪⣗⢗⣽⢽⡯⣿⣽⣷⢿⡽⡾⡽⣝⢎⠀⠀⠀⢡
|
||||
# ⣿⠀⠀⠀⢂⠢⢂⢥⢱⡹⣪⢞⡵⣻⡪⡯⡯⣟⡾⣿⣻⡽⣯⡻⣪⠧⠑⠀⠁⢐
|
||||
# ⣿⠀⠀⠀⠢⢑⠠⠑⠕⡝⡎⡗⡝⡎⣞⢽⡹⣕⢯⢻⠹⡹⢚⠝⡷⡽⡨⠀⠀⢔
|
||||
# ⣿⡯⠀⢈⠈⢄⠂⠂⠐⠀⠌⠠⢑⠱⡱⡱⡑⢔⠁⠀⡀⠐⠐⠐⡡⡹⣪⠀⠀⢘
|
||||
# ⣿⣽⠀⡀⡊⠀⠐⠨⠈⡁⠂⢈⠠⡱⡽⣷⡑⠁⠠⠑⠀⢉⢇⣤⢘⣪⢽⠀⢌⢎
|
||||
# ⣿⢾⠀⢌⠌⠀⡁⠢⠂⠐⡀⠀⢀⢳⢽⣽⡺⣨⢄⣑⢉⢃⢭⡲⣕⡭⣹⠠⢐⢗
|
||||
# ⣿⡗⠀⠢⠡⡱⡸⣔⢵⢱⢸⠈⠀⡪⣳⣳⢹⢜⡵⣱⢱⡱⣳⡹⣵⣻⢔⢅⢬⡷
|
||||
# ⣷⡇⡂⠡⡑⢕⢕⠕⡑⠡⢂⢊⢐⢕⡝⡮⡧⡳⣝⢴⡐⣁⠃⡫⡒⣕⢏⡮⣷⡟
|
||||
# ⣷⣻⣅⠑⢌⠢⠁⢐⠠⠑⡐⠐⠌⡪⠮⡫⠪⡪⡪⣺⢸⠰⠡⠠⠐⢱⠨⡪⡪⡰
|
||||
# ⣯⢷⣟⣇⡂⡂⡌⡀⠀⠁⡂⠅⠂⠀⡑⡄⢇⠇⢝⡨⡠⡁⢐⠠⢀⢪⡐⡜⡪⡊
|
||||
# ⣿⢽⡾⢹⡄⠕⡅⢇⠂⠑⣴⡬⣬⣬⣆⢮⣦⣷⣵⣷⡗⢃⢮⠱⡸⢰⢱⢸⢨⢌
|
||||
# ⣯⢯⣟⠸⣳⡅⠜⠔⡌⡐⠈⠻⠟⣿⢿⣿⣿⠿⡻⣃⠢⣱⡳⡱⡩⢢⠣⡃⠢⠁
|
||||
# ⡯⣟⣞⡇⡿⣽⡪⡘⡰⠨⢐⢀⠢⢢⢄⢤⣰⠼⡾⢕⢕⡵⣝⠎⢌⢪⠪⡘⡌⠀
|
||||
# ⡯⣳⠯⠚⢊⠡⡂⢂⠨⠊⠔⡑⠬⡸⣘⢬⢪⣪⡺⡼⣕⢯⢞⢕⢝⠎⢻⢼⣀⠀
|
||||
# ⠁⡂⠔⡁⡢⠣⢀⠢⠀⠅⠱⡐⡱⡘⡔⡕⡕⣲⡹⣎⡮⡏⡑⢜⢼⡱⢩⣗⣯⣟
|
||||
# ⢀⢂⢑⠀⡂⡃⠅⠊⢄⢑⠠⠑⢕⢕⢝⢮⢺⢕⢟⢮⢊⢢⢱⢄⠃⣇⣞⢞⣞⢾
|
||||
# ⢀⠢⡑⡀⢂⢊⠠⠁⡂⡐⠀⠅⡈⠪⠪⠪⠣⠫⠑⡁⢔⠕⣜⣜⢦⡰⡎⡯⡾⡽
|
||||
|
||||
User-agent: *
|
||||
Disallow: /me
|
||||
Disallow: /info
|
||||
Disallow: /*
|
||||
host: weingardt.dev
|
13
static/styles/misc.css
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
.misc_button{
|
||||
width: 100px;
|
||||
background: gray;
|
||||
text-align: center;
|
||||
border: black;
|
||||
border-top-style: none;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
border-style: outset;
|
||||
}
|
64
static/styles/nav.css
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
|
||||
nav{
|
||||
height:40px;
|
||||
position:inherit;
|
||||
top:0;
|
||||
|
||||
z-index:1;
|
||||
|
||||
text-align: center;
|
||||
display: grid;
|
||||
|
||||
}
|
||||
|
||||
.nav{
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
align-items:center;
|
||||
min-height:32px;
|
||||
background:none;
|
||||
text-decoration:none;
|
||||
cursor:pointer;
|
||||
|
||||
float:left;
|
||||
clear:left;
|
||||
text-align:center;
|
||||
|
||||
font-size: var(--font-size);
|
||||
|
||||
width:100%;
|
||||
margin:0 0 10px 0;
|
||||
|
||||
background-color: var(--main-color);
|
||||
|
||||
color:var(--main-fg-color);
|
||||
text-decoration-color:#d4d4d4;
|
||||
border-color: #000000;
|
||||
|
||||
border-width: var(--button-border-width);
|
||||
border-style: var(--button-border-style);
|
||||
|
||||
}
|
||||
|
||||
.navSep {
|
||||
width: 100%;
|
||||
float:left;
|
||||
margin-bottom: 20px;
|
||||
background-color: var(--main-title-fg-color);
|
||||
border-color: var(--main-title-fg-color);
|
||||
}
|
||||
|
||||
.selected-nav {
|
||||
border-style: var(--button-selected-style);
|
||||
background-color: var(--main-bg-color);
|
||||
color: var(--main-title-fg-color);
|
||||
}
|
||||
|
||||
.disabled-nav {
|
||||
color: gray;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
|
||||
|
220
static/styles/newstyle.css
Normal file
@@ -0,0 +1,220 @@
|
||||
* {
|
||||
box-sizing:border-box
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: FreePixel;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("/fonts/FreePixel.ttf");
|
||||
}
|
||||
|
||||
body {
|
||||
/*font-family: "FreePixel";
|
||||
* font-size:16px;*/
|
||||
|
||||
font-family: var(--font-family);
|
||||
font-size: var(--font-size);
|
||||
color:var(--main-fg-color);
|
||||
|
||||
background-image: /*url(../images/light.png)*/var(--background-image);
|
||||
background-repeat: repeat-x;
|
||||
background-color: var(--main-bg-end-color);
|
||||
background-position: left top;
|
||||
|
||||
padding-bottom:26px;
|
||||
|
||||
text-rendering: optimizelegibility;
|
||||
text-shadow: rgba(0,0,0,.01) 0 0 1px;
|
||||
|
||||
}
|
||||
|
||||
main{
|
||||
width: 75%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.content,#footnote{
|
||||
min-height: calc(80vh - 200px);
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
background: var(--main-color);
|
||||
|
||||
padding: 10px 10px 10px 10px;
|
||||
|
||||
.titlebar {
|
||||
margin: -10px -10px 0 -10px;
|
||||
background: var(--main-bg-color);
|
||||
color: var(--main-title-fg-color);
|
||||
padding: 5px 5px 5px 10px;
|
||||
margin-bottom: 10px;
|
||||
text-align: var(--title-align);
|
||||
border-style: var(--border-style);
|
||||
border-width: var(--border-width);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.fit,#footnote{
|
||||
min-height: fit-content;
|
||||
}
|
||||
|
||||
.smol{
|
||||
max-height: 200px;
|
||||
|
||||
div{
|
||||
overflow: auto;
|
||||
max-height: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
footer{
|
||||
height:fit-content;
|
||||
background-color: var(--main-color);
|
||||
color: var(--main-fg-color);
|
||||
display:flex;
|
||||
padding:0 10px;
|
||||
align-items:center;
|
||||
overflow-x:hidden;
|
||||
position:fixed;
|
||||
|
||||
font-family: "FreePixel";
|
||||
|
||||
bottom:0;
|
||||
width:100%
|
||||
}
|
||||
|
||||
#footnote{
|
||||
margin-bottom: 20px;
|
||||
height: max-content;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
padding: 10px 10px 10px 10px;
|
||||
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
|
||||
background-color: var(--main-color);
|
||||
}
|
||||
|
||||
#gif{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
align-items: center;
|
||||
scale: 100%;
|
||||
|
||||
display:flex;
|
||||
flex-wrap:wrap;
|
||||
justify-content:center;
|
||||
gap:10px;
|
||||
|
||||
margin-bottom: 40px;
|
||||
|
||||
}
|
||||
|
||||
.text-center{
|
||||
text-align:center;
|
||||
display: block;
|
||||
width: max-content;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
.columnsplitter{
|
||||
display: grid;
|
||||
|
||||
columns: 2;
|
||||
grid-template-columns: auto 300px;
|
||||
column-gap: 20px;
|
||||
}
|
||||
|
||||
.singlecolumn{
|
||||
grid-template-columns: auto;
|
||||
}
|
||||
|
||||
.rowsplitter{
|
||||
display: grid;
|
||||
|
||||
columns: 1;
|
||||
row-gap: 20px;
|
||||
}
|
||||
|
||||
.chatbox{
|
||||
margin-top: 10px;
|
||||
|
||||
textarea {
|
||||
font-family: "FreePixel";
|
||||
resize: none;
|
||||
}
|
||||
|
||||
input{
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: black;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
background-color: red;
|
||||
color: var(--main-bg-color);
|
||||
}
|
||||
|
||||
.tworowtext {
|
||||
dl dt{
|
||||
float:left;
|
||||
clear:left;
|
||||
text-align:right;
|
||||
width:130px;
|
||||
font-weight:700
|
||||
}
|
||||
|
||||
dl dd{
|
||||
margin-left:calc(130px + 20px)
|
||||
}
|
||||
}
|
||||
|
||||
.button-container{
|
||||
display:flex;
|
||||
flex-wrap:wrap;
|
||||
justify-content:center;
|
||||
gap:20px;
|
||||
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.squeeze{
|
||||
width: auto;
|
||||
img{
|
||||
width: 100%;
|
||||
image-rendering: optimizespeed;
|
||||
}
|
||||
}
|
||||
|
||||
.leftpad{
|
||||
float: right;
|
||||
}
|
||||
|
||||
.list-left{
|
||||
ul{
|
||||
text-align: left;
|
||||
list-style: disclosure-closed;
|
||||
list-style-position: inside;
|
||||
padding-left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.centered{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.rndText {
|
||||
|
||||
|
||||
}
|
127
static/styles/photobook.css
Normal file
@@ -0,0 +1,127 @@
|
||||
* {
|
||||
box-sizing:border-box
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background-image: url(../images/gera_landschaft.jpeg);
|
||||
background-size: cover;
|
||||
|
||||
display: flex;
|
||||
}
|
||||
|
||||
main{
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.paper{
|
||||
width: 100%;
|
||||
position: relative;
|
||||
|
||||
#background {
|
||||
width: 100%;
|
||||
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: black;
|
||||
|
||||
z-index: 0;
|
||||
position: relative;
|
||||
|
||||
@media (min-width: 1080px){
|
||||
zoom: 1.8;
|
||||
}
|
||||
@media (min-width: 720px){
|
||||
zoom: 1.3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.controlbox{
|
||||
display: flex;
|
||||
|
||||
top: 0;
|
||||
position: absolute;
|
||||
|
||||
padding: 20px;
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
|
||||
z-index: 1;
|
||||
|
||||
a{
|
||||
border-style: outset;
|
||||
height: fit-content;
|
||||
background-color: #80808045;
|
||||
padding-right: 5px;
|
||||
padding-left: 5px;
|
||||
border-width: 2px;
|
||||
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.disabled{
|
||||
color: gray;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.padding{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.page{
|
||||
display: grid;
|
||||
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
|
||||
width: 50%;
|
||||
height: 100%;
|
||||
padding: 20px 20px 0px 20px;
|
||||
|
||||
.content{
|
||||
margin-top: 30px;
|
||||
overflow-y: auto;
|
||||
|
||||
img {
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
border-color: black;
|
||||
}
|
||||
}
|
||||
|
||||
.infocontainer{
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: 0 20px 0 0px;
|
||||
|
||||
.description{
|
||||
|
||||
}
|
||||
|
||||
.date{
|
||||
font-style: italic;
|
||||
text-decoration: underline;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.right{
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
.photo{
|
||||
width: 48%;
|
||||
margin: 1%;
|
||||
}
|
||||
|
||||
.dontSquish{
|
||||
width: 100%;
|
||||
}
|
548
static/styles/style.css
Normal file
@@ -0,0 +1,548 @@
|
||||
* {
|
||||
box-sizing:border-box
|
||||
}
|
||||
|
||||
body {
|
||||
/*font-family: "FreePixel";
|
||||
font-size:16px;*/
|
||||
|
||||
font-family: var(--font-family);
|
||||
|
||||
font-style: 13px/1.231;
|
||||
font-size: var(--font-size);
|
||||
|
||||
color:var(--main-fg-color);
|
||||
|
||||
background-image: var(--background-image);
|
||||
background-repeat: repeat-x;
|
||||
background-color: var(--main-bg-end-color);
|
||||
background-position: left top;
|
||||
|
||||
margin:0;
|
||||
padding-bottom:26px;
|
||||
|
||||
text-rendering: optimizelegibility;
|
||||
text-shadow: rgba(0,0,0,.01) 0 0 1px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
.linespan{
|
||||
display: flex;
|
||||
clear: both;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.linebutton{
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
align-items:center;
|
||||
min-height:48px;
|
||||
|
||||
cursor:pointer;
|
||||
|
||||
float:left;
|
||||
text-align:center;
|
||||
|
||||
color: var(--main-fg-color);
|
||||
|
||||
font-size: var(--font-size);
|
||||
|
||||
box-sizing: border-box;
|
||||
|
||||
width:40%;
|
||||
margin:0 10px 10px 0;
|
||||
|
||||
background-color: var(--main-bg-color);
|
||||
|
||||
border-style: var(--button-border-style);
|
||||
border-width: var(--button-border-width);
|
||||
|
||||
border-color: #000000;
|
||||
|
||||
text-decoration-color:#d4d4d4;
|
||||
color:var(--main-fg-color);
|
||||
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
nav{
|
||||
height:40px;
|
||||
position:inherit;
|
||||
top:0;
|
||||
|
||||
z-index:1;
|
||||
|
||||
text-align: center;
|
||||
display: grid;
|
||||
margin-top: 20px;
|
||||
|
||||
}
|
||||
|
||||
.nav{
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
align-items:center;
|
||||
min-height:32px;
|
||||
background:none;
|
||||
text-decoration:none;
|
||||
cursor:pointer;
|
||||
|
||||
float:left;
|
||||
clear:left;
|
||||
text-align:center;
|
||||
|
||||
margin-right: 20px;
|
||||
margin-top: 10px;
|
||||
|
||||
color: var(--main-fg-color);
|
||||
|
||||
font-size: var(--font-size);
|
||||
|
||||
}
|
||||
|
||||
.navSep {
|
||||
width: 100%;
|
||||
float:left;
|
||||
margin-bottom: 20px;
|
||||
background-color: var(--main-title-fg-color);
|
||||
border-color: var(--main-title-fg-color);
|
||||
}
|
||||
|
||||
main{
|
||||
width:100%;
|
||||
min-height:calc(100vh - 60px - 26px);
|
||||
|
||||
overflow-x:hidden;
|
||||
padding:20px 20px;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.content,#footnote{
|
||||
min-height: calc(80vh - 200px);
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
background: var(--main-color);
|
||||
margin-bottom: 10px;
|
||||
|
||||
padding: 10px 10px 10px 10px;
|
||||
|
||||
.titlebar {
|
||||
margin: -10px -10px 0 -10px;
|
||||
background: var(--main-bg-color);
|
||||
color: var(--main-title-fg-color);
|
||||
padding: 5px 5px 5px 10px;
|
||||
margin-bottom: 10px;
|
||||
text-align: var(--title-align);
|
||||
border-style: var(--border-style);
|
||||
border-width: var(--border-width);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.fit,#footnote{
|
||||
min-height: fit-content;
|
||||
}
|
||||
|
||||
.smol{
|
||||
max-height: 200px;
|
||||
|
||||
div{
|
||||
overflow: auto;
|
||||
max-height: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
.inline{
|
||||
|
||||
img{
|
||||
width: 200px;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
div>.inline{
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
footer{
|
||||
height:fit-content;
|
||||
background-color: var(--main-color);
|
||||
color: var(--main-fg-color);
|
||||
display:flex;
|
||||
padding:0 10px;
|
||||
align-items:center;
|
||||
overflow-x:hidden;
|
||||
position:fixed;
|
||||
|
||||
font-family: "FreePixel";
|
||||
|
||||
bottom:0;
|
||||
width:100%
|
||||
}
|
||||
|
||||
#footnote{
|
||||
margin-bottom: 20px;
|
||||
height: max-content;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
padding: 10px 10px 10px 10px;
|
||||
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
|
||||
background-color: var(--main-color);
|
||||
}
|
||||
|
||||
#gif{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
align-items: center;
|
||||
scale: 100%;
|
||||
|
||||
display:flex;
|
||||
flex-wrap:wrap;
|
||||
justify-content:center;
|
||||
gap:10px;
|
||||
|
||||
margin-bottom: 40px;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: FreePixel;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../src/FreePixel.ttf");
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: 576px) {
|
||||
.nav::before,.nav::after{
|
||||
content: "/";
|
||||
}
|
||||
|
||||
.navSep {
|
||||
scale: 0%;
|
||||
}
|
||||
|
||||
.selected-nav{
|
||||
text-decoration-color: var(--main-fg-color);
|
||||
text-decoration-line: underline;
|
||||
}
|
||||
|
||||
nav{
|
||||
position: inherit;
|
||||
width: 100%;
|
||||
height: fit-content;
|
||||
overflow: scroll;
|
||||
display: flex;
|
||||
margin-left :calc(576px - 80px * 2);
|
||||
}
|
||||
|
||||
.nav{
|
||||
white-space: nowrap;
|
||||
font-size: 12px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 576px){
|
||||
nav{
|
||||
width:250px;
|
||||
|
||||
position:absolute;
|
||||
height:auto;
|
||||
margin-left :calc(992px - 80px * 2);
|
||||
}
|
||||
|
||||
.nav{
|
||||
width:100%;
|
||||
margin:0 0 10px 0;
|
||||
|
||||
background-color: var(--main-color);
|
||||
|
||||
color:var(--main-fg-color);
|
||||
text-decoration-color:#d4d4d4;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
border-color: #000000;
|
||||
|
||||
border-width: var(--button-border-width);
|
||||
border-style: var(--button-border-style);
|
||||
}
|
||||
|
||||
main{
|
||||
width:calc(576px - 80px);
|
||||
max-width:100vw;
|
||||
min-height:calc(100vh - 26px);
|
||||
}
|
||||
|
||||
.selected-nav {
|
||||
border-style: var(--button-selected-style);
|
||||
background-color: var(--main-bg-color);
|
||||
color: var(--main-title-fg-color);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px){
|
||||
body{
|
||||
padding-left:calc((100vw - 768px - 200px)*.5)
|
||||
}
|
||||
|
||||
main{
|
||||
width:calc(768px - 80px * 2)
|
||||
}
|
||||
|
||||
footer{
|
||||
margin-left:calc((100vw - 768px - 200px)*-.5)
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px){
|
||||
body{
|
||||
padding-left:calc((100vw - 992px - 50px)*.5)
|
||||
}
|
||||
main{
|
||||
width:calc(992px - 80px * 2)
|
||||
}
|
||||
footer{
|
||||
margin-left:calc((100vw - 992px - 200px)*-.5)
|
||||
}
|
||||
}
|
||||
|
||||
div.button-container{
|
||||
display:flex;
|
||||
flex-wrap:wrap;
|
||||
justify-content:center;
|
||||
gap:20px;
|
||||
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
div.contact-text{
|
||||
margin-left:calc(130px + 20px)
|
||||
}
|
||||
|
||||
.license-img{
|
||||
height:31px;
|
||||
width:88px;
|
||||
}
|
||||
|
||||
.construction-img{
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
margin-bottom:20px;
|
||||
display:block;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.smaltext{
|
||||
font-size: xx-small;
|
||||
text-align:center
|
||||
}
|
||||
|
||||
.image-rounded{
|
||||
border-radius:50%;
|
||||
}
|
||||
|
||||
.text-center{
|
||||
text-align:center;
|
||||
display: block;
|
||||
width: max-content;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.margin-list{
|
||||
li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
dl dt{
|
||||
float:left;
|
||||
clear:left;
|
||||
text-align:right;
|
||||
width:130px;
|
||||
font-weight:700
|
||||
}
|
||||
|
||||
dl dd{
|
||||
margin-left:calc(130px + 20px)
|
||||
}
|
||||
|
||||
.inline-icon{
|
||||
display:flex;
|
||||
flex-wrap:wrap;
|
||||
justify-content:left;
|
||||
gap:10px;
|
||||
|
||||
}
|
||||
|
||||
.section-header{
|
||||
display:flex;
|
||||
justify-content:space-between;
|
||||
align-items:center
|
||||
}
|
||||
|
||||
.post-footer{
|
||||
display:flex;
|
||||
justify-content:right;
|
||||
align-items:center
|
||||
}
|
||||
|
||||
.post-footer>p{
|
||||
margin:0 5%
|
||||
}
|
||||
|
||||
p.info{
|
||||
font-size:.8rem;
|
||||
margin-top:5px
|
||||
}
|
||||
|
||||
span {
|
||||
display: block ruby;
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
.info {
|
||||
background-color: red;
|
||||
color: var(--main-bg-color);
|
||||
}
|
||||
|
||||
p.info span{
|
||||
display:block;
|
||||
margin-right:20px;
|
||||
}
|
||||
|
||||
p.info span i{
|
||||
margin-right:.5em
|
||||
}
|
||||
|
||||
@media (min-width: 768px){
|
||||
p.info span{
|
||||
display:inline
|
||||
}
|
||||
}
|
||||
h1,h2,h3,h4,h5,h6{
|
||||
margin:20px 0
|
||||
}
|
||||
|
||||
h1+p.info,h2+p.info,h3+p.info,h4+p.info,h5+p.info,h6+p.info{
|
||||
margin-top:-15px;
|
||||
margin-bottom:20px
|
||||
}
|
||||
code,pre{
|
||||
font-size:.875em;
|
||||
font-family: "FreePixel";
|
||||
font-feature-settings:"calt" 1;
|
||||
font-variant-ligatures:normal;
|
||||
border-color:var(--main-fg-color);
|
||||
border-style:solid;
|
||||
border-radius:3px;
|
||||
background-color: var(--main-bg-end-color-color);
|
||||
color: var(--main-fg-color);
|
||||
}
|
||||
|
||||
code{
|
||||
border-width:1px 0
|
||||
}
|
||||
|
||||
pre{
|
||||
border-width:1px;
|
||||
overflow-x:auto;
|
||||
padding:4px 2px
|
||||
}
|
||||
|
||||
.nobr {
|
||||
white-space: nowrap;
|
||||
white-space-collapse: nowrap;
|
||||
}
|
||||
|
||||
pre>code{
|
||||
border-width:0
|
||||
}
|
||||
|
||||
h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{
|
||||
border-width:0
|
||||
}
|
||||
|
||||
|
||||
.form-group{
|
||||
padding:5px 0
|
||||
}
|
||||
|
||||
.form-group>label{
|
||||
display:block;
|
||||
font-size:14px
|
||||
}
|
||||
|
||||
.form-group>.error{
|
||||
color:red;
|
||||
font-size:14px
|
||||
}
|
||||
|
||||
input{
|
||||
width:100%;
|
||||
padding-top:2px
|
||||
}
|
||||
|
||||
.right-div{
|
||||
width: fit-content;
|
||||
text-align: left;
|
||||
margin-left: auto;
|
||||
margin-right: 0;
|
||||
|
||||
h2{
|
||||
text-align: right;
|
||||
}
|
||||
a.right-div{
|
||||
text-align: right;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.postlist {
|
||||
margin-top: 20px;
|
||||
|
||||
a {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.prefSpan{
|
||||
display: block;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0066cc;
|
||||
}
|
||||
|
||||
.floating {
|
||||
background: var(--optional-link-background);
|
||||
}
|
||||
|
||||
.buttonToggle {
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.styleSelector {
|
||||
float:right;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
20
static/styles/theme.css
Normal file
@@ -0,0 +1,20 @@
|
||||
:root {
|
||||
--main-bg-color: "#fed6af";
|
||||
--main-bg-end-color: "#ffffee";
|
||||
--main-color: "#ffffff";
|
||||
--main-fg-color: "#800000";
|
||||
--main-title-fg-color: "#800000";
|
||||
|
||||
--title-align: left;
|
||||
--border-style: solid;
|
||||
--border-width: 0px;
|
||||
|
||||
--button-border-width: 1px;
|
||||
--button-border-style: solid;
|
||||
--button-selected-style: ridge;
|
||||
|
||||
--optional-link-background: #00000000;
|
||||
|
||||
--font-family: "Arial, Helvetica, sans-serif";
|
||||
--font-size: 13px;
|
||||
}
|
98
templates/home.html
Normal file
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
|
||||
{{style | safe}}
|
||||
<link rel="stylesheet" href="/styles/newstyle.css">
|
||||
<link rel="stylesheet" href="/styles/nav.css">
|
||||
|
||||
<title>Gabriel's personal website</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<form method="POST">
|
||||
<div class="columnsplitter">
|
||||
<div class="rowsplitter">
|
||||
<div id="home" class="content fit">
|
||||
<h2 class="titlebar">🏠 <a href="https://www.weingardt.dev/">Weingardt.dev</a> - Home</h2>
|
||||
<p>
|
||||
A visitor! It appears you have found my website (I wonder how...)<br><br>
|
||||
I'm Gabriel, a {{ ageinsert }} year old student from Germany 🇩🇪.<br>
|
||||
I mainly do programming and computer stuff. See my /<s><a>projects</a></s>/ if u wanna learn more.<br>
|
||||
You'll find more about me on <a href="{{ url_for('me') }}">/me/</a>
|
||||
<br><br>
|
||||
Also see <s><a>this</a></s>, one of my greatest projects (as of yet).
|
||||
A homebrew computer I developed over the last three years.
|
||||
Note, this projects is still ongoing and stuff is always changing.
|
||||
<br><br>
|
||||
Feel free to browse this little site.
|
||||
There is more to this site than this page!<br>
|
||||
(Refreshing the page also does some magic)
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
<p class="text-center">
|
||||
<br><br>
|
||||
<marquee><h2>Still under reconstruction!      IM LAZY AS FUCK</h2></marquee>
|
||||
<br>
|
||||
Regardless, thank you for taking a look at my little corner of the internet, and I hope you enjoy your visit.
|
||||
</p>
|
||||
|
||||
<br><br><br>
|
||||
<p>
|
||||
Due to my <i>lazy as fuck</i> state, I can't get behind my own shit.
|
||||
Including making a tutorial and page for all the LS7 stuff.
|
||||
<br>
|
||||
So if you're lookin for any of that, here ya go with the
|
||||
<a href="https://www.weingardt.dev/ls7schematic.pdf">schematics</a>,
|
||||
<a href="https://www.weingardt.dev/ls7pcb.pdf">pcb</a> and
|
||||
<a href="https://www.weingardt.dev/ls7files.zip">KiCad files</a>.
|
||||
<br>
|
||||
All this shit is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA</a>.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<!--div class="content fit">
|
||||
<h2 class="titlebar">🎯 Stuff you maybe interested in</h2>
|
||||
|
||||
<a href="{{ url_for('ssup') }}">SSUP</a>
|
||||
</div-->
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar" id="Wannasaysomething">🗯️ Wanna say something to me?</h2>
|
||||
|
||||
Wanna say something? Do it. No need for a stupid registration, you can do so anonymously.
|
||||
Your messages are only visible to me. Not to any other users of this site.
|
||||
<br>
|
||||
Messages are limited to {{textlength}} characters.
|
||||
To avoid spamming, a message can only be send every 30 seconds.
|
||||
This applies to all simuntanious users of the site. Don't be an asshole.
|
||||
<br><br>
|
||||
This is one way communication. I have no way of contacting you back, so if you want that
|
||||
please provide an adiquate solution lol.
|
||||
<br><br>
|
||||
<div class="chatbox">
|
||||
<textarea rows="8" cols="60" name="textvalue" placeholder="Message (max {{textlength}} characters)">{{ textvalue }}</textarea>
|
||||
|
||||
<div>
|
||||
<input type="submit" name="send" value="Submit">
|
||||
<input type="submit" name="clear" value="Clear">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>{{ errorValue }}</p>
|
||||
</div>
|
||||
{{footer | safe}}
|
||||
</div>
|
||||
{{navbar | safe}}
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
59
templates/info.html
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
|
||||
{{style | safe}}
|
||||
<link rel="stylesheet" href="/styles/newstyle.css">
|
||||
<link rel="stylesheet" href="/styles/nav.css">
|
||||
|
||||
<title>Website info</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<div class="columnsplitter">
|
||||
<div class="rowsplitter">
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">ℹ️ Website Info</h2>
|
||||
This wonderful website was made my <i>me</i>.<br><br>
|
||||
This site doesn't use JavaScript.
|
||||
The site uses Python Flask for it's backend to serve rendered HTML files.
|
||||
|
||||
</div>
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">⚖️ Legal</h2>
|
||||
If you wish to <a href="../contact">contact</a> me, or have any concerns about potential copyright infringement or similar, please
|
||||
do here: <a href="mailto:legal@weingardt.dev">legal@weingardt.dev</a>
|
||||
<br><br><hr><br>
|
||||
The <u>content</u> of this website is licensed under the CC BY-SA 4.0 license, which gives you the unrestricted freedom to <u>share</u> and <u>modify</u>
|
||||
copies of this website. You are even allowed to do so commercially.<br><br>
|
||||
<b>But under the following terms:</b><br>
|
||||
You have to give credit to me, <b>indicate if changes were made</b> and license the material under the same license.<br><br>
|
||||
If you want to base your work of of mine, I suggest you to <a href="https://creativecommons.org/licenses/by-sa/4.0/">read the license</a>.<br><br>
|
||||
</div>
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">💾 Website Source Code</h2>
|
||||
All the source code is readily available on my Gitea instance <a href="https://git.weingardt.dev/0xmac/Website">here</a>.<br>
|
||||
If issues occur, you want something added or something else, this is the place to make issues and pull requests.
|
||||
</div>
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">📑 Logging</h2>
|
||||
This website logs your visit with the information you give every website you visit,
|
||||
like your IP-Adress and User Agent. This is just stored for me to see if anyone actually visits this
|
||||
site. This data is not shared with anyone or anything or any third or second parties.
|
||||
</div>
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🖼️ 88x31 Buttons</h2>
|
||||
Some of the cool 88x31 buttons, located in the footer are from <a href="https://www.deadnet.se/88x31/index.html">www.deadnet.se</a>,<br>
|
||||
while some others I've yanked from other websites :P
|
||||
</div>
|
||||
{{footer | safe}}
|
||||
</div>
|
||||
{{navbar | safe}}
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
18
templates/inline/footer.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🚧 Footer</h2>
|
||||
<p class="text-center">I'm so sorry if you're viewing this shit on a phone</p>
|
||||
|
||||
<div class="centered"><img src="/images/under_construction_bar.gif"></div>
|
||||
<div class="button-container">
|
||||
{%for i in buttons%}
|
||||
<a {% if i[1] != "": %} href="{{i[1]}}" {% endif %} ><img src="/buttons/{{i[2]}}" alt="{{i[0]}}"></a>
|
||||
{%endfor%}
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<p>This site was last updated: {{updated}}</p>
|
||||
<p>Website licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>
|
||||
|
||||
<a href="{{url_for('homepage')}}">https://weingardt.dev/</a>
|
||||
</div>
|
||||
</div>
|
88
templates/inline/navbar.html
Normal file
@@ -0,0 +1,88 @@
|
||||
<nav id="navbar">
|
||||
<div class="rowsplitter">
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🔗 Navbar</h2>
|
||||
{%for i in navContent%}
|
||||
|
||||
{% if i[0] == "P": %}
|
||||
|
||||
<a class="nav {% if i[1].find(navSel) != -1: %} selected-nav {% endif %}"
|
||||
href="{{url_for(i[2])}}">{% if i[1].find(navSel) != -1: %}> {% endif %}{{i[1]}}{% if i[1].find(navSel) != -1: %} <{% endif %}</a>
|
||||
|
||||
|
||||
{% elif i[0] == "SEP": %}
|
||||
<hr class="navSep">
|
||||
{% elif i[0] == "L": %}
|
||||
<a class="nav" href="{{i[2]}}">{{i[1]}}</a>
|
||||
{% elif i[0] == "D": %}
|
||||
<a class="nav disabled-nav">{{i[1]}}</a>
|
||||
{% endif %}
|
||||
{%endfor%}
|
||||
</div>
|
||||
|
||||
<!--div class="content fit">
|
||||
<h2 class="titlebar">🔀 Site Style</h2>
|
||||
<form method="post" action="/changestyle">
|
||||
|
||||
<select name="stylebox">
|
||||
<option value="A">A</option>
|
||||
<option value="B">B</option>
|
||||
<option value="-">Other</option>
|
||||
</select>
|
||||
|
||||
<input type="submit" name="change" value="Apply">
|
||||
</form>
|
||||
</div-->
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar"><marquee>💍 Webrings</marquee></h2>
|
||||
|
||||
<p class="text-center">--- Retronaut 🖥️ Webring ---</p>
|
||||
<p>
|
||||
<a href="https://webring.dinhe.net/prev/https://weingardt.dev">⬅️ Previous</a> |
|
||||
<a href="https://webring.dinhe.net/random">Random</a> |
|
||||
<a href="https://webring.dinhe.net/next/https://weingardt.dev">Next ➡️</a>
|
||||
</p>
|
||||
|
||||
<p class="text-center">--- Hotline 📞 Webring ---</p>
|
||||
<p>
|
||||
<a href="https://hotlinewebring.club/weingardt/previous">⬅️ Previous</a> |
|
||||
<a href="https://hotlinewebring.club/weingardt/next">Next ➡️</a>
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🔀 Random Shit</h2>
|
||||
<div class="squeeze">{{rndShit | safe}}</div>
|
||||
</div>
|
||||
|
||||
<div class="content fit smol">
|
||||
<h2 class="titlebar">📖 Lesson of the Day <a class="leftpad" href="{{url_for('lessons')}}">>></a></h2>
|
||||
<div>{{randomQuote[0]}}<br><br>{{randomQuote[1] | safe}}</div>
|
||||
</div>
|
||||
|
||||
<div class="content fit smol">
|
||||
<h2 class="titlebar">🎯 Goals/Todo</h2>
|
||||
<div class="list-left">
|
||||
<ul>
|
||||
{%for i in todos%}
|
||||
{% if i[0] == "s": %} <s> {% endif %}
|
||||
<li> <input type="checkbox" disabled {% if i[0] == "1": %} checked {% endif %}>{{i[1]}}</li>
|
||||
{% if i[0] == "s": %} </s> {% endif %}
|
||||
{%endfor%}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content fit smol">
|
||||
<h2 class="titlebar">🆕 Site Updates</h2>
|
||||
<div class="list-left">
|
||||
<ul>
|
||||
{%for i in updates%} <li>{{i[0]}} {{i[1]}}</li> {%endfor%}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
33
templates/lessons.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
|
||||
{{style | safe}}
|
||||
<link rel="stylesheet" href="/styles/newstyle.css">
|
||||
|
||||
<title>Gabriel's personal website</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<form method="POST">
|
||||
<div class="columnsplitter singlecolumn">
|
||||
<div class="rowsplitter">
|
||||
<div id="home" class="content">
|
||||
<h2 class="titlebar">My stupid conclusions about certain days xD</h2>
|
||||
<h3><a href="{{ url_for('homepage') }}"><- Back Home</a></h3>
|
||||
<div class="list-left">
|
||||
<ul>
|
||||
{%for i in randomQuote%} <li>{{i[0]}} {{i[1] | safe}}</li> {%endfor%}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
37
templates/ls7.html
Normal file
@@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
<link rel="stylesheet" href="../global/theme.css">
|
||||
<script rel="text/javascript" src="../global/global.js"></script>
|
||||
<link rel="stylesheet" href="../global/style.css">
|
||||
|
||||
<title>LS7 Computer</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav id="navbar"></nav>
|
||||
<main>
|
||||
<div class="content">
|
||||
<h2 class="titlebar">LS7 Computer</h2>
|
||||
|
||||
<h1>SHIT NOTHING HERE YET</h1>
|
||||
<h2>Im lazy as fuckk</h2>
|
||||
|
||||
<!--div class="linespan">
|
||||
<a href="../dhge/" class="linebutton">🏫 School Stuff</a>
|
||||
|
||||
<a href="../services/" class="linebutton">🌐 Services</a>
|
||||
</div-->
|
||||
|
||||
</div>
|
||||
<div id="footnote"><var id="toplevel" data-="../">Please enable Javascript on this page as it's required to generate the footer and navigation bar.<br>For fear of non-free Javascript: The JS is licensed under GPL v.3</var></div>
|
||||
</main>
|
||||
<footer id="footer"></footer>
|
||||
|
||||
<!-- Some variables and script-call for global site elements -->
|
||||
<var id="selected-nav" data-="Projects"></var>
|
||||
</body>
|
||||
</html>
|
168
templates/me.html
Normal file
@@ -0,0 +1,168 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
|
||||
{{style | safe}}
|
||||
<link rel="stylesheet" href="/styles/newstyle.css">
|
||||
<link rel="stylesheet" href="/styles/nav.css">
|
||||
|
||||
<title>Contact me</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<div class="columnsplitter">
|
||||
<div class="rowsplitter">
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🚶 Me!</h2>
|
||||
|
||||
|
||||
<ul>
|
||||
<li>Age: {{ ageinsert }}</li>
|
||||
<li>Gender: Male</li>
|
||||
<li>Occupation: Employed, touching computers all day. Also studying during that</li>
|
||||
<li>Location: Somewhere in Germany</li>
|
||||
<li>Hobbies: Programming, electronics and computing, trekking, carving wood</li>
|
||||
<li>OS Affinity: <a href="https://www.gentoo.org/">Gentoo</a>, <a href="https://artixlinux.org/">Artix Linux</a></li>
|
||||
<li>Interests: Old'n wheird Computers/Technologies, Terry Davis, Getting to know Nature and Self-Sustainability</li>
|
||||
<li>Education: Computer Science, studying that aswell rn</li>
|
||||
<li class="rndText">Random: {{funfact}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content fit tworowtext">
|
||||
<h2 class="titlebar">📫 Contact and Social Media</h2>
|
||||
<img src="/images/send.gif" alt="gif" id="gif">
|
||||
|
||||
<dl>
|
||||
<dt>E-Mail</dt><dd>gabriel@weingardt.dev</dd>
|
||||
<dt>(old) E-Mail</dt><dd>gabriel.weingardt@gmail.com</dd>
|
||||
</dl>
|
||||
<div class="contact-text">
|
||||
<p class="info">
|
||||
Please use the @weingardt.dev domain for E-Mail communication.<br>
|
||||
The Googlemail E-Mail is depricated and will delete it sometime end 2025.
|
||||
</p>
|
||||
|
||||
All inquiries are welcome!
|
||||
</div>
|
||||
<hr>
|
||||
<div class="contact-text">
|
||||
<p>
|
||||
I also exist at these places:
|
||||
</p>
|
||||
</div>
|
||||
<dl>
|
||||
<dt>Odysee 🎥</dt><dd><a href="https://odysee.com/@0xMAC-8205:e">xmac</a></dd>
|
||||
<dt>YouTube 🎥</dt><dd><a href="https://www.youtube.com/@0xMAC-8205">xmac</a></dd>
|
||||
<dt>GitHub 📂</dt><dd><a href="https://github.com/0xMAC8205">0xmac8205</a></dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🔁 Everyday / 👜 Carry</h2>
|
||||
This is a list of stuff I use and take with me everyday.
|
||||
<br><br>
|
||||
My laptop currently is a <a href="https://thinkwiki.de/X220">Thinkpad X220</a>,
|
||||
serving as a replacement for my <a href="https://thinkwiki.de/X61#X61_Tablet">Thinkpad X61t</a>.
|
||||
Sadly it's neck broke, but I want to switch back to it.
|
||||
It's modified with all sorts
|
||||
of stuff like an internal USB Hub with is connected to an Arduino.
|
||||
It has a back OLED display displaying Gentoo ads and a link to my website.
|
||||
I also have a SATA harddrive reader modded where should be the PCI Express card slot
|
||||
(Taken-apart SSD's fit perfectly in that little space).
|
||||
For my Linux distribution I currently run Artix Linux, since my old Gentoo installation
|
||||
broke and I needed something quick. Will switch back to Gentoo sometime when I
|
||||
repair my X61t. My X220 has a whole 16 Gigs of RAM, a 1TB SSD which is fully LUKS encrypted
|
||||
and a 64GB MSATA drive holding data I want to quickly transfer across operating systems
|
||||
and some backup data.
|
||||
On the side of the Laptop I've also modded an external antenna port for more WIFI ;).
|
||||
<br><br>
|
||||
My main phone used to be a Nokia fliphone, but got replaced by a trusty old Google Pixel 6.
|
||||
Nothin special about it, since it's just a phone.
|
||||
<br><br>
|
||||
For my music, since piss Google decided to remove the beloved headphone jack
|
||||
I use a Sony Minidisk Walkman instead. Better choice anyway.
|
||||
It's a blue <a href="https://www.minidisc.org/part_Sony_MZ-R70.html">MZ-R70</a> model with digital audio recording capability over ADAT.
|
||||
I always carry my music library with me around, which consists of 7 Minidisks.
|
||||
It's honestly great, since it just eats a single AA battery.
|
||||
So with that I also take spare batteries with me (wich do last a long time).
|
||||
(The motor sounds on this thing are just epic)
|
||||
<br><br>
|
||||
As for money, I always carry cash with me. I don't like using and paying
|
||||
with my credit card. If I need money, I'll go to an ATM.
|
||||
I always know how much money I have and how much I can spend.
|
||||
Unlike with a credit card, where it's basically a gamble if the card
|
||||
gets accepted or not. Had that happen to me a few times, where the card
|
||||
was just declined. And you also loose the feeling of "spending"
|
||||
with a card. Physical money is something, that hurts when
|
||||
you spend alot of it, rather than just a number decreasing.
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">🚫 Nope</h2>
|
||||
<ul>
|
||||
<li>Social Media</li>
|
||||
<li>Fast food</li>
|
||||
<li>Soft drinks</li>
|
||||
<li>Windows</li>
|
||||
<li>Deoderant</li>
|
||||
<li>Coffee with sugar and or milk</li>
|
||||
<li>Overaccesive Phone use</li>
|
||||
<li>Cities</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">⚙️ How</h2>
|
||||
This site just used to be plain HTML and a JavaScipt script
|
||||
wich was basically required for the site to function.
|
||||
It would construct global elements like the navbar
|
||||
and the CSS style variables. Since I can't
|
||||
use that on terminal and old browsers it was only a temporary measure.
|
||||
I wanted to learn how to use hugo, started but decided against it.
|
||||
<br><br>
|
||||
This site now operates via Python Flask as it's backend.
|
||||
Each site is still HTML, but with tags inside them.
|
||||
The backend then constructs the global elements and other stuff.
|
||||
You may have noticed, that some elements like the random section in the navbar
|
||||
change when the site refreshes. This is the backend at work.
|
||||
This site uses no JavaScipt, the backend provides the rendered HTML and CSS files.
|
||||
<br><br>
|
||||
Some sections like the lists you see on this site and the photobook get
|
||||
constructed via a JSON, to keep things simple and expandable.
|
||||
</div>
|
||||
|
||||
<div class="content fit">
|
||||
<h2 class="titlebar">❓ Why</h2>
|
||||
|
||||
Why does this exist? I have my reasons:
|
||||
I hate social media. I think a website is the perfect way for someone
|
||||
to really express themself. Of course it requires work, but the end result
|
||||
is basically a infinite canvas to express oneself.
|
||||
I don't want to see the positive and negative feedback I get for my stuff,
|
||||
well if you actually want to share your opinion you can use the messagebox
|
||||
on the homepage or just shoot an E-mail.
|
||||
But most people won't do that because it's concidered inconvinient.
|
||||
<br><br>
|
||||
Algorythms also play a big role in my opinion.
|
||||
I don't want, be it an AI or an algorytm to dictate what I see and
|
||||
what I don't see. It's such a distopian idea but even worse
|
||||
is that most people are not only okay with it and just accept it, but actively defent it.
|
||||
<br><br>
|
||||
If you haven't tried, use webrings. They really show how people feel like
|
||||
and what they're capable of. And of course a bit of nostaliga
|
||||
(wich I didn't had, but it's still cool).
|
||||
</div>
|
||||
|
||||
{{footer | safe}}
|
||||
</div>
|
||||
{{navbar | safe}}
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
52
templates/photobook.html
Normal file
@@ -0,0 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
|
||||
|
||||
<link rel="stylesheet" href="/styles/photobook.css">
|
||||
|
||||
<title>My Photobook</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
|
||||
<div class="paper">
|
||||
<img src="/images/page2.avif" id="background">
|
||||
|
||||
<div class="controlbox">
|
||||
<a {% if previousDisabled == '' : %} href="{{url_for( request.endpoint, **request.view_args)}}&--" {%endif%} class="{{ previousDisabled }}">↩️ Previous Page</a>
|
||||
<a class="padding" href="{{ url_for('homepage') }}">🚪 Leave</a>
|
||||
<a class="padding" href="{{ url_for( request.endpoint, **request.view_args) }}&rnd">🔄 Random Page</a>
|
||||
<a {% if nextDisabled == '' : %} href="{{url_for( request.endpoint, **request.view_args)}}&++" {%endif%} class="{{ nextDisabled }}">Next Page ↪️</a>
|
||||
</div>
|
||||
|
||||
<div class="page">
|
||||
<div class="content">
|
||||
{{contentLeftInsert | safe}}
|
||||
</div>
|
||||
|
||||
<div class="infocontainer">
|
||||
<p class="date">{{pageLeftDate}}</p>
|
||||
<p class="description">{{pageLeftDesc | safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page right">
|
||||
<div class="content">
|
||||
{{contentRightInsert | safe}}
|
||||
</div>
|
||||
|
||||
<div class="infocontainer">
|
||||
<p class="date">{{pageRightDate}}</p>
|
||||
<p class="description">{{pageRightDesc | safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
19
templates/scraper.html
Normal file
@@ -0,0 +1,19 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Fuck U</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main>
|
||||
<h1>Fuck YOU</h1>
|
||||
<h2>Why? Because you fucko are on my bot/scraper blacklist</h2>
|
||||
<h2>I suggest u read my robots.txt bitch</h2>
|
||||
<h2>But who cares about my robots.txt anyway ay?</h2>
|
||||
<br><br>
|
||||
<h2>Think I was a lil too harsh to u? OK, mail me (at) <a href="mailto:unblock@weingardt.dev">unblock@weingardt.dev</a></h2>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|