tag listings

This commit is contained in:
veclav talica 2024-02-16 18:29:50 +05:00
parent 715ddbc39f
commit c36ce7dd20
5 changed files with 68 additions and 4 deletions

View File

@ -28,4 +28,11 @@ for d in ./articles/*/; do
fi fi
done done
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 ./tools/feed_generator.py ./articles/ $URL > ./html/feed.xml

View File

@ -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)))

View File

@ -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"

View File

@ -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>

54
tools/tag_listing_generator.py Executable file
View 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))