git ssb

0+

Grey the earthling / gkn.me.uk



Tree: b99c966b8495886ec58819dbd8cc488e312fc4dc

Files: b99c966b8495886ec58819dbd8cc488e312fc4dc / generator / common.py

5723 bytesRaw
1import datetime
2import bs4
3import html as htmllib
4import marko
5import re
6import urllib.parse
7
8import parse_content
9
10days = parse_content.days
11entries = parse_content.entries
12months = parse_content.months
13series = parse_content.series
14slugify = parse_content.slugify
15tags = parse_content.tags
16updated = parse_content.updated
17years = parse_content.years
18
19
20def atom_entry(id):
21 return (
22 "<entry><title>"
23 + entries[id]["title"]
24 + "</title><id>"
25 + base_url
26 + url_of_entry(id)
27 + "</id>"
28 f"""<link href="{base_url}{url_of_entry(id)}" rel="alternate" type="text/html"/>"""
29 "<published>" + entries[id]["date"].isoformat() + "</published>"
30 "<updated>"
31 + (
32 entries[id]["modified"].isoformat()
33 if "modified" in entries[id]
34 else entries[id]["date"].isoformat()
35 )
36 + "</updated>"
37 + (
38 (
39 (
40 "<summary>"
41 + print_html_as_text(entries[id]["description"])
42 + "</summary>"
43 )
44 if "description" in entries[id]
45 else ""
46 )
47 )
48 + '<content type="html">'
49 + "\n"
50 + print_html_escaped(marko.convert(entries[id].content))
51 + "</content>"
52 + "</entry>"
53 )
54
55
56base_url = "https://gkn.me.uk"
57
58colour_class = f"month-{list(reversed(months))[0].month:02d}"
59
60
61def entries_in_series(series):
62 return dict(
63 [
64 (id, entries[id])
65 for id in entries
66 if "series" in entries[id]
67 and slugify(series) == slugify(entries[id]["series"])
68 ]
69 )
70
71
72def entries_with_tag(tag):
73 return dict(
74 [
75 (id, entries[id])
76 for id in entries
77 if "tags" in entries[id]
78 and slugify(tag) in map(slugify, entries[id]["tags"])
79 ]
80 )
81
82
83head = """
84 <meta charset="utf-8">
85 <link href="/style/tarazed.css" rel="stylesheet">
86 <link href="/style/icon.svg" rel="icon">
87 <link href="/feed" rel="alternate" type="application/atom+xml" title="Grey Nicholson">
88"""
89
90hues = [15, 30, 52, 82, 149, 187, 210, 246, 269, 291, 321, 352]
91
92link_home = '<a href="/"><strong>Home</strong></a>'
93
94link_to_all_entries = '<a href="/entries"><strong>All entries</strong></a>'
95
96link_to_feed = (
97 '<a href="/feed" rel="alternate" type="application/atom+xml">'
98 "<strong>Subscribe</strong>"
99 "</a>"
100)
101
102footer = (
103 "<footer>"
104 + "<hr/>"
105 + "<nav><ul>"
106 + "<li>"
107 + link_to_feed
108 + "</li>"
109 + "<li>"
110 + link_home
111 + "</li>"
112 + "</ul></nav>"
113 + "</footer>"
114)
115
116
117def link_to_entry(id, **kwargs):
118 return (
119 f'<a href="{url_of_entry(id)}"'
120 + (f''' rel="{kwargs["rel"]}"''' if "rel" in kwargs else "")
121 + ">"
122 + "<span>"
123 + ("<strong>" + entries[id]["title"] + "</strong>")
124 + "<span>"
125 + (
126 '<span class="hidden"> ·</span>'
127 + " "
128 + f'<time datetime="{entries[id]["date"]:%Y-%m-%dT%H:%MZ}">'
129 + entries[id]["date"].date().isoformat()
130 + "</time>"
131 )
132 + (
133 " / "
134 + f'<time datetime="{entries[id]["modified"]:%Y-%m-%dT%H:%MZ}">'
135 + entries[id]["modified"].date().isoformat()
136 + "</time>"
137 if "modified" in entries[id]
138 else ""
139 )
140 + (
141 " · " + ", ".join("<b>" + label + "</b>" for label in kwargs["labels"])
142 if "labels" in kwargs
143 else ""
144 )
145 + "</span>"
146 + (
147 (
148 '<span class="hidden"> ·</span>'
149 + " "
150 + '<i class="description">'
151 + print_html_as_text(entries[id]["description"])
152 + "</i>"
153 )
154 if "description" in entries[id]
155 else ""
156 )
157 + "</span>"
158 + "</a>"
159 )
160
161
162def link_with_details(url, title, description=None, rel=None, type=None):
163 return (
164 f'<a href="{url}"'
165 + (f' rel="{rel}"' if rel else "")
166 + ">"
167 + "<span>"
168 + ("<strong>" + title + "</strong>")
169 + (
170 (
171 '<span class="hidden"> ·</span>'
172 + " "
173 + '<i class="description">'
174 + description
175 + "</i>"
176 )
177 if description
178 else ""
179 )
180 + "</span>"
181 + "</a>"
182 )
183
184
185def offset_id(seq, id, offset):
186 part_seq = list(seq)[list(seq).index(id) :: offset]
187 if len(part_seq) > 1:
188 return part_seq[1]
189
190
191def print_html(html):
192 return str(bs4.BeautifulSoup(html, "html.parser"))
193
194
195def print_html_as_text(html):
196 return str(bs4.BeautifulSoup(html, "html.parser").get_text())
197
198
199def print_html_escaped(html):
200 return htmllib.escape(str(bs4.BeautifulSoup(html, "html.parser")))
201
202
203repeated_tags = [tag for tag in tags if len(entries_with_tag(tag)) >= 4]
204
205
206def stardate(date):
207 return format(int(date.strftime("%s")) / 100000, ".1f")
208
209
210def title(string):
211 return string + " · Grey Nicholson" if string else "Grey Nicholson"
212
213
214def url_of_day(date):
215 return f"/{date.year}/{date.month:02d}/{date.day:02d}"
216
217
218def url_of_entry(id):
219 return f"/{id}"
220
221
222def url_of_month(date):
223 return f"/{date.year}/{date.month:02d}"
224
225
226def url_of_tag(tag):
227 return f"/entries/{slugify(tag)}"
228
229
230def url_of_tag_feed(tag):
231 return f"/entries/{slugify(tag)}/feed"
232
233
234def url_of_series(series):
235 return f"/{slugify(series)}"
236
237
238def url_of_series_feed(series):
239 return f"/{slugify(series)}/feed"
240
241
242def url_of_year(date):
243 return f"/{date.year}"
244

Built with git-ssb-web