git ssb

0+

Grey the earthling / gkn.me.uk



Tree: 30c0128a864b5c20c2b5f87e29a40f0c8e230a06

Files: 30c0128a864b5c20c2b5f87e29a40f0c8e230a06 / generator / common.py

5864 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 " · " + "<b>" + entries[id]["series"] + "</b>"
142 if "series" in entries[id]
143 else ""
144 )
145 + (
146 " · " + ", ".join("<b>" + label + "</b>" for label in kwargs["labels"])
147 if "labels" in kwargs
148 else ""
149 )
150 + "</span>"
151 + (
152 (
153 '<span class="hidden"> ·</span>'
154 + " "
155 + '<i class="description">'
156 + print_html_as_text(entries[id]["description"])
157 + "</i>"
158 )
159 if "description" in entries[id]
160 else ""
161 )
162 + "</span>"
163 + "</a>"
164 )
165
166
167def link_with_details(url, title, description=None, rel=None, type=None):
168 return (
169 f'<a href="{url}"'
170 + (f' rel="{rel}"' if rel else "")
171 + ">"
172 + "<span>"
173 + ("<strong>" + title + "</strong>")
174 + (
175 (
176 '<span class="hidden"> ·</span>'
177 + " "
178 + '<i class="description">'
179 + description
180 + "</i>"
181 )
182 if description
183 else ""
184 )
185 + "</span>"
186 + "</a>"
187 )
188
189
190def offset_id(seq, id, offset):
191 part_seq = list(seq)[list(seq).index(id) :: offset]
192 if len(part_seq) > 1:
193 return part_seq[1]
194
195
196def print_html(html):
197 return str(bs4.BeautifulSoup(html, "html.parser"))
198
199
200def print_html_as_text(html):
201 return str(bs4.BeautifulSoup(html, "html.parser").get_text())
202
203
204def print_html_escaped(html):
205 return htmllib.escape(str(bs4.BeautifulSoup(html, "html.parser")))
206
207
208repeated_tags = [tag for tag in tags if len(entries_with_tag(tag)) >= 4]
209
210
211def stardate(date):
212 return format(int(date.strftime("%s")) / 100000, ".1f")
213
214
215def title(string):
216 return string + " · Grey Nicholson" if string else "Grey Nicholson"
217
218
219def url_of_day(date):
220 return f"/{date.year}/{date.month:02d}/{date.day:02d}"
221
222
223def url_of_entry(id):
224 return f"/{id}"
225
226
227def url_of_month(date):
228 return f"/{date.year}/{date.month:02d}"
229
230
231def url_of_tag(tag):
232 return f"/entries/{slugify(tag)}"
233
234
235def url_of_tag_feed(tag):
236 return f"/entries/{slugify(tag)}/feed"
237
238
239def url_of_series(series):
240 return f"/{slugify(series)}"
241
242
243def url_of_series_feed(series):
244 return f"/{slugify(series)}/feed"
245
246
247def url_of_year(date):
248 return f"/{date.year}"
249

Built with git-ssb-web