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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import datetime
import itertools
import pathlib
import textwrap
import bicephalus
import htmlgenerator as h
from blog import html, page
class Entry:
def __init__(self, path: pathlib.Path):
assert path.is_relative_to(pathlib.Path("content")), f"bad path {path}"
self.path = path
self.content = path.read_text()
@property
def title(self):
return self.content.splitlines()[0][2:]
@property
def posted(self):
return datetime.date.fromisoformat(self.content.splitlines()[1])
@property
def uri(self):
return f"/{self.path.parts[1]}/{self.path.parts[2]}/{self.path.stem}/"
class Root(page.BasePage):
def entries(self):
entries = map(Entry, pathlib.Path("content").glob("*/*/*.gmi"))
return sorted(entries, key=lambda e: e.posted, reverse=True)
def get_gemini_content(self):
posts = "\n".join([f"=> {e.uri} {e.posted} {e.title}" for e in self.entries()])
content = (
textwrap.dedent(
"""\
# El blog es mío
## Hay otros como él, pero este es el mío
____
"""
)
+ posts
)
return bicephalus.Status.OK, "text/gemini", content
def get_http_content(self):
posts = [
(h.H3(h.A(f"{e.title} ({e.posted})", href=e.uri))) for e in self.entries()
]
return (
bicephalus.Status.OK,
"text/html",
html.html_template(*itertools.chain(posts)),
)
class EntryPage(page.BasePage):
def __init__(self, request, path):
super().__init__(request)
self.path = path
self.entry = Entry(path)
def get_gemini_content(self):
return bicephalus.Status.OK, "text/gemini", self.entry.content
def get_http_content(self):
return (
bicephalus.Status.OK,
"text/html",
html.html_template(
h.PRE(self.entry.content),
),
)
|