File size: 1,539 Bytes
3fb26c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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]))