diff options
author | Volpeon <git@volpeon.ink> | 2022-06-12 10:20:41 +0200 |
---|---|---|
committer | Volpeon <git@volpeon.ink> | 2022-06-12 10:20:41 +0200 |
commit | 5f6712cfc4fd9e63bff6c935665b8426ef2ba2a4 (patch) | |
tree | e6b29d833a2840d577d9a6a4c21af36300d0a1e0 | |
parent | Update (diff) | |
download | volpeon.ink-5f6712cfc4fd9e63bff6c935665b8426ef2ba2a4.tar.gz volpeon.ink-5f6712cfc4fd9e63bff6c935665b8426ef2ba2a4.tar.bz2 volpeon.ink-5f6712cfc4fd9e63bff6c935665b8426ef2ba2a4.zip |
Optimized list generation
-rw-r--r-- | assets/css/components/_card.scss | 5 | ||||
-rw-r--r-- | content/notebook/index.md | 2 | ||||
-rw-r--r-- | content/notebook/pages/about-the-notebook.md | 5 | ||||
-rw-r--r-- | content/notebook/pages/index.md (renamed from content/notebook/general/index.md) | 3 | ||||
-rw-r--r-- | scripts/metadata_filter.lua | 217 | ||||
-rw-r--r-- | templates/layouts/categorized_list.html | 6 |
6 files changed, 98 insertions, 140 deletions
diff --git a/assets/css/components/_card.scss b/assets/css/components/_card.scss index 6c15145..d317d1f 100644 --- a/assets/css/components/_card.scss +++ b/assets/css/components/_card.scss | |||
@@ -17,8 +17,8 @@ | |||
17 | --colors: ( | 17 | --colors: ( |
18 | --bg: fn.global-color(--bg-hi2), | 18 | --bg: fn.global-color(--bg-hi2), |
19 | --fg: fn.global-color(--fg), | 19 | --fg: fn.global-color(--fg), |
20 | --unread: fn.global-color(--obj-hi), | 20 | --unread: fn.global-color(--obj), |
21 | --border: fn.global-color(--obj-hi), | 21 | --border: fn.global-color(--obj), |
22 | --hover: ( | 22 | --hover: ( |
23 | --bg: fn.global-color(--fg-lo), | 23 | --bg: fn.global-color(--fg-lo), |
24 | --fg: fn.global-color(--bg-hi2), | 24 | --fg: fn.global-color(--bg-hi2), |
@@ -30,7 +30,6 @@ | |||
30 | --colors: ( | 30 | --colors: ( |
31 | --bg: fn.global-color(--obj-hi), | 31 | --bg: fn.global-color(--obj-hi), |
32 | --unread: fn.global-color(--bg), | 32 | --unread: fn.global-color(--bg), |
33 | --border: fn.global-color(--obj-hi), | ||
34 | ) | 33 | ) |
35 | ), 'colors-dark'); | 34 | ), 'colors-dark'); |
36 | 35 | ||
diff --git a/content/notebook/index.md b/content/notebook/index.md index f1b8d27..77fed0b 100644 --- a/content/notebook/index.md +++ b/content/notebook/index.md | |||
@@ -6,4 +6,4 @@ list_order: date_desc | |||
6 | feed: true | 6 | feed: true |
7 | --- | 7 | --- |
8 | 8 | ||
9 | Random thoughts, useless stuff, ordered and unordered. | 9 | Random thoughts, ordered and unordered. |
diff --git a/content/notebook/pages/about-the-notebook.md b/content/notebook/pages/about-the-notebook.md new file mode 100644 index 0000000..96fc596 --- /dev/null +++ b/content/notebook/pages/about-the-notebook.md | |||
@@ -0,0 +1,5 @@ | |||
1 | --- | ||
2 | title: What's the Notebook? | ||
3 | pinned: true | ||
4 | --- | ||
5 | |||
diff --git a/content/notebook/general/index.md b/content/notebook/pages/index.md index 9f3ed01..b32e28a 100644 --- a/content/notebook/general/index.md +++ b/content/notebook/pages/index.md | |||
@@ -1,7 +1,6 @@ | |||
1 | --- | 1 | --- |
2 | title: General | 2 | title: Pages |
3 | position: 1 | 3 | position: 1 |
4 | list_read_indicators: true | 4 | list_read_indicators: true |
5 | feed: true | 5 | feed: true |
6 | unlisted: true | ||
7 | --- | 6 | --- |
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua index fcceffa..314f2b0 100644 --- a/scripts/metadata_filter.lua +++ b/scripts/metadata_filter.lua | |||
@@ -57,15 +57,6 @@ function slug(str) | |||
57 | return str:lower():gsub("[^ a-z]", ""):gsub("[ ]+", "-") | 57 | return str:lower():gsub("[^ a-z]", ""):gsub("[ ]+", "-") |
58 | end | 58 | end |
59 | 59 | ||
60 | function file_exists(name) | ||
61 | local f = io.open(name, "r") | ||
62 | if f ~= nil then | ||
63 | io.close(f) | ||
64 | return true | ||
65 | end | ||
66 | return false | ||
67 | end | ||
68 | |||
69 | function format_date(date) | 60 | function format_date(date) |
70 | if not date then return date end | 61 | if not date then return date end |
71 | 62 | ||
@@ -85,20 +76,6 @@ function format_date(date) | |||
85 | } | 76 | } |
86 | end | 77 | end |
87 | 78 | ||
88 | function table_to_list(t, kv, cmp) | ||
89 | local l = pandoc.List() | ||
90 | |||
91 | if kv then | ||
92 | for key, value in pairs(t) do l:insert({ key = key, value = value }) end | ||
93 | else | ||
94 | for _, value in pairs(t) do l:insert(value) end | ||
95 | end | ||
96 | |||
97 | l:sort(cmp or function(i1, i2) return i1.key < i2.key end) | ||
98 | |||
99 | return l | ||
100 | end | ||
101 | |||
102 | function make_absolute(rel, base) | 79 | function make_absolute(rel, base) |
103 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) | 80 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) |
104 | end | 81 | end |
@@ -117,9 +94,9 @@ end | |||
117 | function resolve_layout(depth) | 94 | function resolve_layout(depth) |
118 | local layout = "categorized_list" | 95 | local layout = "categorized_list" |
119 | 96 | ||
120 | if depth == "0" then | 97 | if depth == 0 then |
121 | layout = "page" | 98 | layout = "page" |
122 | elseif depth == "1" then | 99 | elseif depth == 1 then |
123 | layout = "list" | 100 | layout = "list" |
124 | end | 101 | end |
125 | 102 | ||
@@ -180,124 +157,98 @@ end | |||
180 | function find_depth(pages) | 157 | function find_depth(pages) |
181 | local depth = 0 | 158 | local depth = 0 |
182 | 159 | ||
183 | for i = 1, #pages do | 160 | if pages then |
184 | local p = pages[i] | 161 | for i = 1, #pages.all do |
185 | local d = tonumber(p.depth) | 162 | local p = pages.all[i] |
186 | if d > depth then depth = d end | 163 | local d = tonumber(p.depth) |
164 | if d > depth then depth = d end | ||
165 | end | ||
166 | |||
167 | depth = depth + 1 | ||
187 | end | 168 | end |
188 | 169 | ||
189 | depth = depth + 1 | 170 | return depth |
171 | end | ||
190 | 172 | ||
191 | return tostring(depth) | 173 | function d1_page_to_list_item(meta, p) |
174 | return { | ||
175 | title = p.title, | ||
176 | subtitle = p.subtitle, | ||
177 | date = p.date, | ||
178 | position = p.position, | ||
179 | url = p.url, | ||
180 | slug = p.slug, | ||
181 | thumbnail = p.thumbnail, | ||
182 | icon = p.icon or meta.icon, | ||
183 | post_icon = p.post_icon or meta.list_post_icon, | ||
184 | indicator = meta.list_read_indicators, | ||
185 | } | ||
186 | end | ||
187 | |||
188 | function d2_page_to_list_item(meta, cat, p) | ||
189 | return { | ||
190 | title = p.title, | ||
191 | subtitle = p.subtitle, | ||
192 | date = p.date, | ||
193 | position = p.position, | ||
194 | url = p.url, | ||
195 | slug = p.slug, | ||
196 | thumbnail = p.thumbnail, | ||
197 | icon = p.icon or cat.icon, | ||
198 | post_icon = p.post_icon or cat.list_post_icon or meta.list_post_icon, | ||
199 | indicator = cat.list_read_indicators, | ||
200 | } | ||
201 | end | ||
202 | |||
203 | function cat_to_list_cat(cat, allItems) | ||
204 | local limit = cat.list_limit or 9999 | ||
205 | local items = allItems:take(limit) | ||
206 | local omitted = #allItems - #items | ||
207 | |||
208 | return { | ||
209 | title = cat.title, | ||
210 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
211 | (not cat.no_description and cat.content), | ||
212 | url = cat.url, | ||
213 | slug = cat.slug, | ||
214 | layout = cat.list_layout, | ||
215 | items = items, | ||
216 | total = tostring(#allItems), | ||
217 | omitted = omitted ~= 0 and tostring(omitted), | ||
218 | } | ||
192 | end | 219 | end |
193 | 220 | ||
194 | function generate_list(meta) | 221 | function generate_list(meta) |
195 | if not meta.pages then return nil end | 222 | if meta.depth < 1 then return nil end |
196 | 223 | ||
197 | if meta.depth == "1" then | 224 | if meta.depth == 1 then |
198 | return meta.pages.all:map(function(p) | 225 | return meta.pages.all:map(function(p) return d1_page_to_list_item(meta, p) end) |
199 | return { | 226 | end |
200 | title = p.title, | 227 | |
201 | subtitle = p.subtitle, | 228 | if meta.depth == 2 then |
202 | date = p.date, | ||
203 | position = p.position, | ||
204 | url = p.url, | ||
205 | slug = p.slug, | ||
206 | thumbnail = p.thumbnail, | ||
207 | icon = p.icon or meta.icon, | ||
208 | post_icon = p.post_icon or meta.list_post_icon, | ||
209 | indicator = meta.list_read_indicators, | ||
210 | } | ||
211 | end) | ||
212 | elseif meta.depth == "2" then | ||
213 | return meta.pages.all | 229 | return meta.pages.all |
214 | :map(function(cat) | 230 | :map(function(cat) |
215 | local limit = (cat.list_limit and tonumber(pandoc.utils.stringify(cat.list_limit))) or | 231 | local allItems = ((cat.pages and cat.pages.all) or pandoc.List()) |
216 | 9999 | 232 | :map(function(p) return d2_page_to_list_item(meta, cat, p) end) |
217 | local allItems = ((cat.pages and cat.pages.all) or pandoc.List()):map(function(p) | 233 | |
218 | return { | 234 | return cat_to_list_cat(cat, allItems) |
219 | title = p.title, | ||
220 | subtitle = p.subtitle, | ||
221 | date = p.date, | ||
222 | position = p.position, | ||
223 | url = p.url, | ||
224 | slug = p.slug, | ||
225 | thumbnail = p.thumbnail, | ||
226 | icon = p.icon or cat.icon, | ||
227 | post_icon = p.post_icon or cat.list_post_icon or meta.list_post_icon, | ||
228 | indicator = cat.list_read_indicators, | ||
229 | } | ||
230 | end) | ||
231 | local items = allItems:take(limit) | ||
232 | local omitted = #allItems - #items | ||
233 | |||
234 | return { | ||
235 | title = cat.title, | ||
236 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
237 | (not cat.no_description and cat.content), | ||
238 | url = cat.url, | ||
239 | slug = cat.slug, | ||
240 | layout = cat.list_layout, | ||
241 | items = items, | ||
242 | total = tostring(#allItems), | ||
243 | omitted = omitted ~= 0 and tostring(omitted), | ||
244 | } | ||
245 | end) | 235 | end) |
246 | :filter(function(cat) return #cat.items ~= 0 end) | 236 | :filter(function(cat) return #cat.items ~= 0 end) |
247 | elseif meta.depth == "3" then | 237 | end |
238 | |||
239 | if meta.depth == 3 then | ||
248 | return meta.pages.all | 240 | return meta.pages.all |
249 | :map(function(cat) | 241 | :map(function(cat) |
250 | local limit = (cat.list_limit and tonumber(pandoc.utils.stringify(cat.list_limit))) or | 242 | local allItems = (cat.pages and cat.pages.all or pandoc.List()):flatMap(function(c) |
251 | 9999 | 243 | if c.pages then |
252 | local allItems = (cat.pages and cat.pages.all or pandoc.List()) | 244 | return c.pages.all:map(function(p) return d2_page_to_list_item(cat, c, p) end) |
253 | :flatMap(function(c) | 245 | else |
254 | if c.pages then | 246 | return pandoc.List({ d1_page_to_list_item(cat, c) }) |
255 | return c.pages.all:map(function(p) | 247 | end |
256 | return { | 248 | end) |
257 | title = p.title, | ||
258 | subtitle = p.subtitle, | ||
259 | date = p.date, | ||
260 | position = p.position, | ||
261 | category = c.title, | ||
262 | url = p.url, | ||
263 | slug = p.slug, | ||
264 | thumbnail = p.thumbnail, | ||
265 | icon = p.icon or c.icon, | ||
266 | post_icon = p.post_icon or c.list_post_icon or cat.list_post_icon, | ||
267 | indicator = c.list_read_indicators, | ||
268 | } | ||
269 | end) | ||
270 | else | ||
271 | local l = pandoc.List() | ||
272 | l:insert({ | ||
273 | title = c.title, | ||
274 | subtitle = c.subtitle, | ||
275 | date = c.date, | ||
276 | position = c.position, | ||
277 | url = c.url, | ||
278 | slug = c.slug, | ||
279 | icon = c.icon or cat.icon, | ||
280 | post_icon = c.post_icon or cat.list_post_icon, | ||
281 | indicator = cat.list_read_indicators, | ||
282 | }) | ||
283 | return l | ||
284 | end | ||
285 | end) | ||
286 | allItems:sort(page_sort(cat.list_order)) | 249 | allItems:sort(page_sort(cat.list_order)) |
287 | local items = allItems:take(limit) | 250 | |
288 | local omitted = #allItems - #items | 251 | return cat_to_list_cat(cat, allItems) |
289 | |||
290 | return { | ||
291 | title = cat.title, | ||
292 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
293 | (not cat.no_description and cat.content), | ||
294 | url = cat.url, | ||
295 | slug = cat.slug, | ||
296 | layout = cat.list_layout, | ||
297 | items = items, | ||
298 | total = tostring(#allItems), | ||
299 | omitted = omitted ~= 0 and tostring(omitted), | ||
300 | } | ||
301 | end) | 252 | end) |
302 | :filter(function(cat) return #cat.items ~= 0 end) | 253 | :filter(function(cat) return #cat.items ~= 0 end) |
303 | end | 254 | end |
@@ -313,6 +264,7 @@ function process(global, meta) | |||
313 | meta.slug = slug(meta.title) | 264 | meta.slug = slug(meta.title) |
314 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end | 265 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end |
315 | meta.list_layout = meta.list_layout and prep_layout(meta.list_layout) | 266 | meta.list_layout = meta.list_layout and prep_layout(meta.list_layout) |
267 | if meta.list_limit then meta.list_limit = tonumber(pandoc.utils.stringify(meta.list_limit)) end | ||
316 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end | 268 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end |
317 | 269 | ||
318 | if meta.feed then | 270 | if meta.feed then |
@@ -340,9 +292,8 @@ function process(global, meta) | |||
340 | end | 292 | end |
341 | 293 | ||
342 | meta.pages = process_pages(global, meta.list_order, meta.pages) | 294 | meta.pages = process_pages(global, meta.list_order, meta.pages) |
343 | meta.depth = (meta.pages and find_depth(meta.pages.all)) or "0" | 295 | meta.depth = find_depth(meta.pages) |
344 | meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or | 296 | meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or resolve_layout(meta.depth)) |
345 | resolve_layout(meta.depth)) | ||
346 | 297 | ||
347 | if meta.date then | 298 | if meta.date then |
348 | meta.date = format_date(meta.date) | 299 | meta.date = format_date(meta.date) |
diff --git a/templates/layouts/categorized_list.html b/templates/layouts/categorized_list.html index 68decf6..e8466f7 100644 --- a/templates/layouts/categorized_list.html +++ b/templates/layouts/categorized_list.html | |||
@@ -19,7 +19,11 @@ $body$ | |||
19 | <section> | 19 | <section> |
20 | <header class="l-card-list__header"> | 20 | <header class="l-card-list__header"> |
21 | <h2 class="s-invisible-links u-mt-0" id="$it.slug$"> | 21 | <h2 class="s-invisible-links u-mt-0" id="$it.slug$"> |
22 | <a href="$it.url.rel$">$it.title$</a> | 22 | $if(it.url)$ |
23 | <a href="$it.url.rel$">$it.title$</a> | ||
24 | $else$ | ||
25 | $it.title$ | ||
26 | $endif$ | ||
23 | </h2> | 27 | </h2> |
24 | $if(it.description)$ | 28 | $if(it.description)$ |
25 | <div class="s-small s-colored-links">$it.description$</div> | 29 | <div class="s-small s-colored-links">$it.description$</div> |