Compare commits
8 Commits
3ac4bc2965
...
c36ce7dd20
Author | SHA1 | Date | |
---|---|---|---|
|
c36ce7dd20 | ||
|
715ddbc39f | ||
|
b8b551869f | ||
|
c9ae970a59 | ||
|
eb7b9f114e | ||
|
18098a6859 | ||
|
f1d6e8e0a2 | ||
|
f56f102530 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
**/__pycache__/*
|
**/__pycache__/
|
||||||
html/
|
html/
|
||||||
./.*/
|
./.*/
|
||||||
[articles/**/.static/]
|
[articles/**/.static/]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Title: Testing Firefox Wasm Tail Call
|
Title: Testing Firefox Wasm Tail Call
|
||||||
Brief: Or why assumptions are not always correct.
|
Brief: Or why assumptions are not always correct.
|
||||||
Date: 1708076705
|
Date: 1708076705
|
||||||
Tags: Wasm, Interpreters
|
Tags: Optimization, Wasm, Interpreters
|
||||||
CSS: /style.css
|
CSS: /style.css
|
||||||
|
|
||||||
### Lore ###
|
### Lore ###
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Title: Hand Optimized Simplex 2D
|
Title: Hand Optimized Simplex 2D
|
||||||
Brief: Results of messing around with moving and hoisting stuff around.
|
Brief: Results of messing around with moving and hoisting stuff around.
|
||||||
Date: 1688995095
|
Date: 1688995095
|
||||||
Tags: Programming, GLSL, OpenGL
|
Tags: Programming, GLSL, OpenGL, Optimization
|
||||||
CSS: /style.css
|
CSS: /style.css
|
||||||
|
|
||||||
![](/articles/hand-opt-simplex-2d/noise.png)
|
![](/articles/hand-opt-simplex-2d/noise.png)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Title: Cached Neocities Uploads
|
Title: Cached Neocities Uploads
|
||||||
Brief: Making uploading of directories to Neocities less painful.
|
Brief: Making uploading of directories to Neocities less painful.
|
||||||
Date: 1707585916
|
Date: 1707585916
|
||||||
Tags: Bash
|
Tags: Programming, Bash
|
||||||
CSS: /style.css
|
CSS: /style.css
|
||||||
|
|
||||||
Quick and dirty Bash-based sha256sum checksum solution to create stamps for later checking and rejection.
|
Quick and dirty Bash-based sha256sum checksum solution to create stamps for later checking and rejection.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
mkdir -p ./.dynamic
|
mkdir -p ./.dynamic
|
||||||
mkdir -p ./.temp
|
mkdir -p ./.temp
|
||||||
gcc -Wno-unused-result -Wno-incompatible-pointer-types waveforms.c ../../tools/gifenc/gifenc.c -I../../tools -O2 -o ./.temp/waveforms
|
$CC -Wno-unused-result -Wno-incompatible-pointer-types waveforms.c ../../tools/gifenc/gifenc.c -I../../tools -O2 -o ./.temp/waveforms
|
||||||
./.temp/waveforms
|
./.temp/waveforms
|
||||||
|
20
compile.sh
20
compile.sh
@ -1,7 +1,12 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
|
|
||||||
|
# Settings:
|
||||||
|
# =========
|
||||||
|
export CC=cc
|
||||||
|
export URL=https://mjestecko.neocities.org
|
||||||
|
|
||||||
mkdir -p ./html/articles
|
mkdir -p ./html/articles
|
||||||
|
|
||||||
./tools/main_page_generator.py ./articles | ./tools/mmd/build/multimarkdown > ./html/index.html
|
./tools/main_page_generator.py ./articles | ./tools/mmd/build/multimarkdown > ./html/index.html
|
||||||
@ -9,7 +14,7 @@ mkdir -p ./html/articles
|
|||||||
for d in ./articles/*/; do
|
for d in ./articles/*/; do
|
||||||
if [ -d "$d" ]; then
|
if [ -d "$d" ]; then
|
||||||
if test -f "$d/make"; then
|
if test -f "$d/make"; then
|
||||||
"$d/make"
|
("$d/make")
|
||||||
fi
|
fi
|
||||||
if test -d "$d/.dynamic"; then
|
if test -d "$d/.dynamic"; then
|
||||||
mkdir -p "./html/articles/$(basename -- $d)"
|
mkdir -p "./html/articles/$(basename -- $d)"
|
||||||
@ -19,8 +24,15 @@ for d in ./articles/*/; do
|
|||||||
mkdir -p "./html/articles/$(basename -- $d)"
|
mkdir -p "./html/articles/$(basename -- $d)"
|
||||||
cp -r "$d/.static/." "./html/articles/$(basename -- $d)/"
|
cp -r "$d/.static/." "./html/articles/$(basename -- $d)/"
|
||||||
fi
|
fi
|
||||||
./tools/article_wrapper.py "$d/page.mmd" https://mjestecko.neocities.org | ./tools/mmd/build/multimarkdown > "./html/articles/$(basename -- $d).html"
|
./tools/article_wrapper.py "$d/page.mmd" $URL | ./tools/mmd/build/multimarkdown > "./html/articles/$(basename -- $d).html"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
./tools/feed_generator.py ./articles/ https://mjestecko.neocities.org > ./html/feed.xml
|
mkdir -p "./html/tags/"
|
||||||
|
./tools/tag_listing_generator.py ./articles/ ./html/ | ./tools/mmd/build/multimarkdown > "./html/tags.html"
|
||||||
|
|
||||||
|
for f in ./html/tags/*.html; do
|
||||||
|
echo $(cat "$f" | ./tools/mmd/build/multimarkdown) > "$f"
|
||||||
|
done
|
||||||
|
|
||||||
|
./tools/feed_generator.py ./articles/ $URL > ./html/feed.xml
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
|
3
host.sh
Executable file
3
host.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
python3 -m http.server --directory ./html/
|
@ -16,87 +16,87 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-family: "Charter","Georgia",'Times New Roman',serif;
|
font-family: "Charter","Georgia",'Times New Roman',serif;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
background-color: var(--bg-color);
|
background-color: var(--bg-color);
|
||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
}
|
}
|
||||||
article, .container {
|
article, .container {
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
}
|
}
|
||||||
h1,h2,h3,h4 {
|
h1,h2,h3,h4 {
|
||||||
font-family: arial, sans;
|
font-family: arial, sans;
|
||||||
}
|
}
|
||||||
h2 {
|
h2 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
h3 {
|
h3 {
|
||||||
font-family: arial, sans;
|
font-family: arial, sans;
|
||||||
margin: 1.3em 0 0.9em;
|
margin: 1.3em 0 0.9em;
|
||||||
}
|
}
|
||||||
b {
|
b {
|
||||||
font-family: arial, sans;
|
font-family: arial, sans;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
}
|
}
|
||||||
pre, p {
|
pre, p {
|
||||||
margin: 0.9em 0px 0.9em;
|
margin: 0.9em 0px 0.9em;
|
||||||
}
|
}
|
||||||
pre, code {
|
pre, code {
|
||||||
background-color: var(--bg-color);
|
background-color: var(--bg-color);
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
}
|
}
|
||||||
pre {
|
pre {
|
||||||
padding: 0.5em 0.5em;
|
padding: 0.5em 0.5em;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
nav ul {
|
nav ul {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
background-color: var(--bg-color);
|
background-color: var(--bg-color);
|
||||||
border: 1px solid #bbbbdd;
|
border: 1px solid #bbbbdd;
|
||||||
}
|
}
|
||||||
nav li:first-child {
|
nav li:first-child {
|
||||||
border-left: none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
nav li {
|
nav li {
|
||||||
border-right: 1px solid #bbbbdd;
|
border-right: 1px solid #bbbbdd;
|
||||||
border-left: 1px solid #ffffff;
|
border-left: 1px solid #ffffff;
|
||||||
}
|
}
|
||||||
nav a {
|
nav a {
|
||||||
padding: 0.4em 1em;
|
padding: 0.4em 1em;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-family: arial, sans;
|
font-family: arial, sans;
|
||||||
}
|
}
|
||||||
nav a:hover {
|
nav a:hover {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
}
|
}
|
||||||
nav a:link {
|
nav a:link {
|
||||||
color: var(--link-color);
|
color: var(--link-color);
|
||||||
}
|
}
|
||||||
nav a:visited {
|
nav a:visited {
|
||||||
color: var(--link-color);
|
color: var(--link-color);
|
||||||
}
|
}
|
||||||
nav a.here {
|
nav a.here {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
}
|
}
|
||||||
@media only screen and (max-device-width: 480px) {
|
@media only screen and (max-device-width: 480px) {
|
||||||
article, .container {
|
article, .container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
html {
|
html {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
git submodule init
|
git submodule init
|
||||||
git submodule update
|
git submodule update
|
||||||
|
@ -18,7 +18,7 @@ def parse_metadata(filepath: str) -> {}:
|
|||||||
if key == "Date":
|
if key == "Date":
|
||||||
result["Date"] = time.gmtime(int(val))
|
result["Date"] = time.gmtime(int(val))
|
||||||
elif key == "Tags":
|
elif key == "Tags":
|
||||||
result["Tags"] = val.split(",")
|
result["Tags"] = [v.strip() for v in val.split(",")]
|
||||||
else:
|
else:
|
||||||
result[key] = val
|
result[key] = val
|
||||||
result["Last Edit"] = time.gmtime(int(subprocess.getoutput(r"stat -c %Y " + filepath)))
|
result["Last Edit"] = time.gmtime(int(subprocess.getoutput(r"stat -c %Y " + filepath)))
|
||||||
|
@ -24,7 +24,7 @@ with open(argv[1], "r") as f:
|
|||||||
metadata = parse_metadata(argv[1])
|
metadata = parse_metadata(argv[1])
|
||||||
directory = path.split(path.dirname(path.abspath(argv[1])))[-1]
|
directory = path.split(path.dirname(path.abspath(argv[1])))[-1]
|
||||||
|
|
||||||
title = metadata.get("Title", "Oopsie, somebody forgot to name the article!")
|
title = metadata["Title"]
|
||||||
article_head = "\n# " + title + "\n"
|
article_head = "\n# " + title + "\n"
|
||||||
|
|
||||||
brief = metadata.get("Brief")
|
brief = metadata.get("Brief")
|
||||||
@ -41,10 +41,12 @@ if not last_edit is None:
|
|||||||
last_edit.tm_mday != date.tm_mday or last_edit.tm_year != date.tm_year:
|
last_edit.tm_mday != date.tm_mday or last_edit.tm_year != date.tm_year:
|
||||||
article_head += f"-- Edited: *{MONTHS[last_edit.tm_mon]} {last_edit.tm_mday}, {last_edit.tm_year} UTC*\n\n"
|
article_head += f"-- Edited: *{MONTHS[last_edit.tm_mon]} {last_edit.tm_mday}, {last_edit.tm_year} UTC*\n\n"
|
||||||
|
|
||||||
# todo: Hyperlinks to appropriate tag pages.
|
|
||||||
tags = metadata.get("Tags")
|
tags = metadata.get("Tags")
|
||||||
if tags:
|
if tags:
|
||||||
article_head += f"""-- Tags: *{",".join(tags)}*\n\n"""
|
tag_links = []
|
||||||
|
for tag in tags:
|
||||||
|
tag_links.append(f"[{tag}](/tags/{urllib.parse.quote(tag.lower())}.html)")
|
||||||
|
article_head += f"""-- Tags: *{", ".join(tag_links)}*\n\n"""
|
||||||
|
|
||||||
article_head += "---\n\n"
|
article_head += "---\n\n"
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ HEAD_EMBED = """
|
|||||||
<li><a href="/articles/mjestečko.html">about</a></li>
|
<li><a href="/articles/mjestečko.html">about</a></li>
|
||||||
<li><a href="https://modarchive.org/index.php?request=view_artist_modules&query=96070">tracks</a></li>
|
<li><a href="https://modarchive.org/index.php?request=view_artist_modules&query=96070">tracks</a></li>
|
||||||
<li><a rel="me" href="https://poto.cafe/@veclavtalica">mastodon</a></li>
|
<li><a rel="me" href="https://poto.cafe/@veclavtalica">mastodon</a></li>
|
||||||
|
<li><a href="/tags.html">tags</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@ -17,7 +18,7 @@ HEAD_EMBED = """
|
|||||||
|
|
||||||
NOTICE = """
|
NOTICE = """
|
||||||
<footer>
|
<footer>
|
||||||
<a href="#top">Take me home ↑</a>
|
<a href="#top">^ Return</a>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
54
tools/tag_listing_generator.py
Executable file
54
tools/tag_listing_generator.py
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# todo: Problems might arise with casing if there are overlaps such as 'Tag' and 'tag'.
|
||||||
|
|
||||||
|
from sys import argv, exit
|
||||||
|
import time, urllib.parse, re
|
||||||
|
from os import walk
|
||||||
|
import os.path as path
|
||||||
|
|
||||||
|
from article_utils import the_line_after_metadata, parse_metadata
|
||||||
|
from page_shares import wrap_page
|
||||||
|
|
||||||
|
tag_listing_header = "CSS: /style.css\n\n"
|
||||||
|
main_listing_header = "CSS: /style.css\n\n"
|
||||||
|
|
||||||
|
if len(argv) <= 1:
|
||||||
|
print("No article directory was supplied")
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
if len(argv) <= 2:
|
||||||
|
print("No tag listing output directory was supplied")
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
tag_to_tag_page = {}
|
||||||
|
tag_to_articles = {}
|
||||||
|
tag_counts = {}
|
||||||
|
article_to_title = {}
|
||||||
|
|
||||||
|
for root, dirs, _ in walk(argv[1]):
|
||||||
|
for d in dirs:
|
||||||
|
metadata = parse_metadata(path.abspath(root + '/' + d + "/page.mmd"))
|
||||||
|
article = "/articles/" + urllib.parse.quote(d) + ".html"
|
||||||
|
for tag in metadata.get('Tags', []):
|
||||||
|
tag_to_articles[tag] = tag_to_articles.get(tag, []) + [article]
|
||||||
|
tag_counts[tag] = tag_counts.get(tag, 0) + 1
|
||||||
|
article_to_title[article] = metadata['Title']
|
||||||
|
break
|
||||||
|
|
||||||
|
for tag in tag_to_articles:
|
||||||
|
tag_page = f"/tags/{urllib.parse.quote(tag.lower())}.html"
|
||||||
|
tag_to_tag_page[tag] = tag_page
|
||||||
|
|
||||||
|
with open(argv[2] + tag_page, 'w') as f:
|
||||||
|
tagged_article_listing = f"\n# Tagged {tag} #\n---\n" + \
|
||||||
|
'\n'.join(f"- [{article_to_title[article]}]({article})" \
|
||||||
|
for article in tag_to_articles[tag])
|
||||||
|
f.write(tag_listing_header + wrap_page(tagged_article_listing))
|
||||||
|
|
||||||
|
main_listing = "\n# Tag Listing #\n---\n" + \
|
||||||
|
', '.join(f"[{tag}]({tag_to_tag_page[tag]}) ({tag_counts[tag]})" \
|
||||||
|
for tag in sorted(tag_counts.keys(), key=lambda x: tag_counts[x], reverse=True)) + \
|
||||||
|
'\n\n'
|
||||||
|
|
||||||
|
print(main_listing_header + wrap_page(main_listing))
|
Loading…
Reference in New Issue
Block a user