me / blog.py
nbroad's picture
first
3fb26c5 verified
raw
history blame
1.54 kB
from app import *
import yaml
import functools
from pathlib import Path
from datetime import datetime, date
file_path = Path(__file__).parent
NUM_RECENT_BLOGS = 20
def full_page():
secs = Sections(["Recent Blogs"], [Div(*[blog_preview(blog_id) for blog_id in sorted_blogs[:NUM_RECENT_BLOGS]])])
return BstPage(0, '', *secs)
def blog_preview(blog_id):
details = all_blogs[blog_id]
return Div(
A(H3(details[0]["title"]), href=f"/blog/{blog_id}"),
P(details[0].get("date_published", "")),
P(details[0].get("desc", "")+"...")
)
@functools.lru_cache()
def get_blogs():
blogs = (file_path / "blogs").rglob("*.md")
blog_dict = {}
for blog in blogs:
with open(blog, 'r') as f:
id_ = blog.stem
text = f.read()
if "---" not in text:
continue
metadata, markdown = text.split("---", 2)[1:]
metadata = yaml.safe_load(metadata)
metadata["id"] = id_
blog_dict[id_] = (metadata, markdown)
blog_dict = {k:v for k, v in blog_dict.items() if v[0].get("date_published", "") != ""}
sorted_blogs = [x[0]["id"] for x in sorted(blog_dict.values(), key=lambda x: x[0].get("date_published"), reverse=True)]
return blog_dict, sorted_blogs
all_blogs, sorted_blogs = get_blogs()
def single_blog(blog_id):
"""
Return a single blog post.
"""
details = all_blogs[blog_id]
return BstPage(0, details[0]["title"], Markdown(details[1]))