summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2022-08-04 21:27:32 +0200
committerVolpeon <git@volpeon.ink>2022-08-04 21:27:32 +0200
commit9acab4200ad454a030edefd0f41e39b3e4936c84 (patch)
treee8b4aed55722827a59deeef868f36f8164bd804e
parentUpdate (diff)
downloadvolpeon.ink-9acab4200ad454a030edefd0f41e39b3e4936c84.tar.gz
volpeon.ink-9acab4200ad454a030edefd0f41e39b3e4936c84.tar.bz2
volpeon.ink-9acab4200ad454a030edefd0f41e39b3e4936c84.zip
Improved metadata processing
-rw-r--r--scripts/lib/common.lua23
-rw-r--r--scripts/metadata.lua39
-rw-r--r--scripts/page.lua181
3 files changed, 147 insertions, 96 deletions
diff --git a/scripts/lib/common.lua b/scripts/lib/common.lua
index 5ed3e31..ee7c6aa 100644
--- a/scripts/lib/common.lua
+++ b/scripts/lib/common.lua
@@ -39,6 +39,20 @@ function pandoc.List:flatMap(fn)
39 return result 39 return result
40end 40end
41 41
42function pandoc.List:filterMap(fn)
43 local mapped = self:map(fn)
44 local result = pandoc.List()
45
46 for i = 1, #mapped do
47 local val = mapped[i]
48 if val then
49 result:insert(val)
50 end
51 end
52
53 return result
54end
55
42function pandoc.List:take(n) 56function pandoc.List:take(n)
43 if n >= #self then return self end 57 if n >= #self then return self end
44 58
@@ -59,6 +73,15 @@ function pandoc.List:skip(n)
59 return result 73 return result
60end 74end
61 75
76function pandoc.List:shuffle()
77 for i = #self, 2, -1 do
78 local j = math.random(i)
79 self[i], self[j] = self[j], self[i]
80 end
81
82 return self
83end
84
62return { 85return {
63 dump = dump 86 dump = dump
64} 87}
diff --git a/scripts/metadata.lua b/scripts/metadata.lua
index afd0ca5..5d372fc 100644
--- a/scripts/metadata.lua
+++ b/scripts/metadata.lua
@@ -71,13 +71,11 @@ function prep_menu(active_id, main_menu)
71 return { items = items, active = active_item } 71 return { items = items, active = active_item }
72end 72end
73 73
74function process_pages(global, build, meta) 74function process_pages(meta)
75 local pages_all = pandoc.List() 75 local pages_all = pandoc.List()
76 local pages_date_desc = pandoc.List() 76 local pages_date_desc = pandoc.List()
77 77
78 for id, p in pairs(meta.pages) do 78 for id, p in pairs(meta.pages) do
79 process(global, build, p, meta)
80
81 if not p.unlisted then 79 if not p.unlisted then
82 pages_all:insert(id) 80 pages_all:insert(id)
83 if p.last_update then pages_date_desc:insert(id) end 81 if p.last_update then pages_date_desc:insert(id) end
@@ -86,8 +84,14 @@ function process_pages(global, build, meta)
86 84
87 pages_all:sort(sort.page_sort(meta.list_order, meta.pages)) 85 pages_all:sort(sort.page_sort(meta.list_order, meta.pages))
88 pages_date_desc:sort(sort.page_sort("date_desc", meta.pages)) 86 pages_date_desc:sort(sort.page_sort("date_desc", meta.pages))
87 local pages_random = pages_all:clone():shuffle()
89 88
90 meta.pages = { all = pages_all, date_desc = pages_date_desc, by_id = meta.pages } 89 meta.pages = {
90 all = pages_all,
91 date_desc = pages_date_desc,
92 random = pages_random,
93 by_id = meta.pages
94 }
91end 95end
92 96
93function find_depth(meta) 97function find_depth(meta)
@@ -126,7 +130,7 @@ function resolve_dates(meta)
126 meta.was_updated = meta.date and meta.last_update and meta.date.yyyy_mm_dd ~= meta.last_update.yyyy_mm_dd 130 meta.was_updated = meta.date and meta.last_update and meta.date.yyyy_mm_dd ~= meta.last_update.yyyy_mm_dd
127end 131end
128 132
129function process_base(build, meta, parent) 133function process_base(build, meta)
130 meta.namespace = prep_namespace(meta.namespace) 134 meta.namespace = prep_namespace(meta.namespace)
131 meta.file_out = utils.stringify(meta.file_out) 135 meta.file_out = utils.stringify(meta.file_out)
132 meta.unlisted = meta.unlisted or (meta.draft and build.mode ~= "dev") 136 meta.unlisted = meta.unlisted or (meta.draft and build.mode ~= "dev")
@@ -140,16 +144,33 @@ function process_base(build, meta, parent)
140 meta.position = meta.position and tonumber(utils.stringify(meta.position)) 144 meta.position = meta.position and tonumber(utils.stringify(meta.position))
141 meta.thumbnail = meta.thumbnail and make_absolute("thumbnail." .. utils.stringify(meta.thumbnail), meta.file_out) 145 meta.thumbnail = meta.thumbnail and make_absolute("thumbnail." .. utils.stringify(meta.thumbnail), meta.file_out)
142 meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or resolve_layout(meta.depth)) 146 meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or resolve_layout(meta.depth))
143 meta.show_date = parent and parent.list_order == "date_desc" 147
148 meta.description = (meta.description and pandoc.MetaBlocks(pandoc.Para(meta.description))) or
149 (not meta.no_description and meta.content)
150 meta.show_date = meta.parent and meta.parent.list_order == "date_desc"
151 meta.category = meta.parent and meta.parent.title
152 meta.icon = meta.icon or (meta.parent and meta.parent.icon)
153 meta.post_icon = meta.post_icon or (meta.parent and meta.parent.list_post_icon) or
154 (meta.parent and meta.parent.parent and meta.parent.parent.list_post_icon)
155 meta.indicator = meta.parent and meta.parent.list_read_indicators
144end 156end
145 157
146function process(global, build, meta, parent) 158function process(global, build, meta)
147 process_base(build, meta, parent) 159 process_base(build, meta)
148 process_pages(global, build, meta) 160
161 for _, p in pairs(meta.pages) do
162 p.parent = meta
163 process(global, build, p)
164 p.parent = nil
165 end
166
167 process_pages(meta)
149 resolve_dates(meta) 168 resolve_dates(meta)
150end 169end
151 170
152function Meta(meta) 171function Meta(meta)
172 math.randomseed(os.time())
173
153 local build = {} 174 local build = {}
154 175
155 for key, value in pairs(meta) do 176 for key, value in pairs(meta) do
diff --git a/scripts/page.lua b/scripts/page.lua
index 417e4a0..fd12230 100644
--- a/scripts/page.lua
+++ b/scripts/page.lua
@@ -35,93 +35,60 @@ function prep_menu(namespace, main_menu)
35 return { items = items, active = active_item } 35 return { items = items, active = active_item }
36end 36end
37 37
38function process_pages(global, build, meta) 38function d1_page_to_list_item(meta)
39 for _, p in pairs(meta.pages.by_id) do
40 process_pages(global, build, p)
41 end
42
43 meta.pages = {
44 all = meta.pages.all:map(function (ref) return meta.pages.by_id[utils.stringify(ref)] end),
45 date_desc = meta.pages.date_desc:map(function (ref) return meta.pages.by_id[utils.stringify(ref)] end),
46 by_id = meta.pages.by_id
47 }
48end
49
50function resolve_urls(global, build, meta)
51 meta.url = resolve_url(global.site.url, build.file_out, meta.url)
52
53 if meta.feed then
54 if meta.file_out:match(".html$") then
55 meta.feed = {
56 url = resolve_url(global.site.url, build.file_out, meta.file_out:gsub(".html$", ".xml")),
57 }
58 else
59 meta.page = {
60 url = resolve_url(global.site.url, build.file_out, meta.file_out:gsub(".xml$", ".html")),
61 }
62 end
63 end
64
65 if meta.thumbnail then
66 meta.thumbnail = resolve_url(global.site.url, build.file_out, meta.thumbnail)
67 end
68end
69
70function d1_page_to_list_item(meta, p)
71 return { 39 return {
72 title = p.title, 40 title = meta.title,
73 subtitle = p.subtitle, 41 subtitle = meta.subtitle,
74 date = p.date, 42 date = meta.date,
75 last_update = p.last_update, 43 last_update = meta.last_update,
76 show_date = p.show_date, 44 show_date = meta.show_date,
77 schema_type = p.schema_type, 45 schema_type = meta.schema_type,
78 draft = p.draft, 46 draft = meta.draft,
79 position = p.position, 47 position = meta.position,
80 url = p.url, 48 url = meta.url,
81 rel = p.rel, 49 rel = meta.rel,
82 slug = p.slug, 50 slug = meta.slug,
83 thumbnail = p.thumbnail, 51 thumbnail = meta.thumbnail,
84 icon = p.icon or meta.icon, 52 icon = meta.icon,
85 post_icon = p.post_icon or meta.list_post_icon, 53 post_icon = meta.post_icon,
86 indicator = meta.list_read_indicators, 54 indicator = meta.indicator,
87 } 55 }
88end 56end
89 57
90function d2_page_to_list_item(meta, cat, p, set_cat_title) 58function d2_page_to_list_item(meta, with_category)
91 return { 59 return {
92 title = p.title, 60 title = meta.title,
93 subtitle = p.subtitle, 61 subtitle = meta.subtitle,
94 category = set_cat_title and cat.title, 62 category = with_category and meta.category,
95 date = p.date, 63 date = meta.date,
96 last_update = p.last_update, 64 last_update = meta.last_update,
97 show_date = p.show_date, 65 show_date = meta.show_date,
98 schema_type = p.schema_type, 66 schema_type = meta.schema_type,
99 draft = p.draft, 67 draft = meta.draft,
100 position = p.position, 68 position = meta.position,
101 url = p.url, 69 url = meta.url,
102 rel = p.rel, 70 rel = meta.rel,
103 slug = p.slug, 71 slug = meta.slug,
104 thumbnail = p.thumbnail, 72 thumbnail = meta.thumbnail,
105 icon = p.icon or cat.icon, 73 icon = meta.icon,
106 post_icon = p.post_icon or cat.list_post_icon or meta.list_post_icon, 74 post_icon = meta.post_icon,
107 indicator = cat.list_read_indicators, 75 indicator = meta.indicator,
108 } 76 }
109end 77end
110 78
111function cat_to_list_cat(cat, allItems) 79function cat_to_list_cat(meta, allItems)
112 local limit = cat.list_limit or 9999 80 local limit = meta.list_limit or 9999
113 local items = allItems:take(limit) 81 local items = allItems:take(limit)
114 local omitted = #allItems - #items 82 local omitted = #allItems - #items
115 83
116 return { 84 return {
117 title = cat.title, 85 title = meta.title,
118 description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or 86 description = meta.description,
119 (not cat.no_description and cat.content), 87 last_update = meta.last_update,
120 last_update = cat.last_update, 88 schema_type = meta.schema_type,
121 schema_type = cat.schema_type, 89 url = meta.url,
122 url = cat.url, 90 slug = meta.slug,
123 slug = cat.slug, 91 layout = meta.list_layout,
124 layout = cat.list_layout,
125 items = items, 92 items = items,
126 total = tostring(#allItems), 93 total = tostring(#allItems),
127 omitted = omitted ~= 0 and tostring(omitted), 94 omitted = omitted ~= 0 and tostring(omitted),
@@ -132,13 +99,13 @@ function generate_list(meta)
132 if meta.depth < 1 then return pandoc.List() end 99 if meta.depth < 1 then return pandoc.List() end
133 100
134 if meta.depth == 1 then 101 if meta.depth == 1 then
135 return meta.pages.all:map(function(p) return d1_page_to_list_item(meta, p) end) 102 return meta.pages.all
136 end 103 end
137 104
138 if meta.depth == 2 then 105 if meta.depth == 2 then
139 return meta.pages.all 106 return meta.pages.all
140 :map(function(cat) 107 :map(function(cat)
141 local allItems = cat.pages.all:map(function(p) return d2_page_to_list_item(meta, cat, p, false) end) 108 local allItems = cat.pages.all:map(function(p) return d2_page_to_list_item(p, false) end)
142 109
143 return cat_to_list_cat(cat, allItems) 110 return cat_to_list_cat(cat, allItems)
144 end) 111 end)
@@ -150,9 +117,9 @@ function generate_list(meta)
150 :map(function(cat) 117 :map(function(cat)
151 local allItems = cat.pages.all:flatMap(function(c) 118 local allItems = cat.pages.all:flatMap(function(c)
152 if cat.list_flatten and c.depth ~= 0 then 119 if cat.list_flatten and c.depth ~= 0 then
153 return c.pages.all:map(function(p) return d2_page_to_list_item(cat, c, p, true) end) 120 return c.pages.all:map(function(p) return d2_page_to_list_item(p, true) end)
154 else 121 else
155 return pandoc.List({ d1_page_to_list_item(cat, c) }) 122 return pandoc.List({ d1_page_to_list_item(c) })
156 end 123 end
157 end) 124 end)
158 125
@@ -166,6 +133,38 @@ function generate_list(meta)
166 end 133 end
167end 134end
168 135
136function deref_page(pages)
137 return function(ref)
138 return pages[utils.stringify(ref)]
139 end
140end
141
142function process_pages(meta)
143 meta.pages.all = meta.pages.all:filterMap(deref_page(meta.pages.by_id))
144 meta.pages.date_desc = meta.pages.date_desc:filterMap(deref_page(meta.pages.by_id))
145 -- meta.pages.random = meta.pages.random:filterMap(deref_page(meta.pages.by_id))
146end
147
148function resolve_urls(global, build, meta)
149 meta.url = resolve_url(global.site.url, build.file_out, meta.url)
150
151 if meta.feed then
152 if meta.file_out:match(".html$") then
153 meta.feed = {
154 url = resolve_url(global.site.url, build.file_out, meta.file_out:gsub(".html$", ".xml")),
155 }
156 else
157 meta.page = {
158 url = resolve_url(global.site.url, build.file_out, meta.file_out:gsub(".xml$", ".html")),
159 }
160 end
161 end
162
163 if meta.thumbnail then
164 meta.thumbnail = resolve_url(global.site.url, build.file_out, meta.thumbnail)
165 end
166end
167
169function process_base(meta) 168function process_base(meta)
170 meta.depth = tonumber(utils.stringify(meta.depth)) 169 meta.depth = tonumber(utils.stringify(meta.depth))
171 meta.file_out = utils.stringify(meta.file_out) 170 meta.file_out = utils.stringify(meta.file_out)
@@ -177,13 +176,25 @@ function process_base(meta)
177 meta.thumbnail = meta.thumbnail and utils.stringify(meta.thumbnail) 176 meta.thumbnail = meta.thumbnail and utils.stringify(meta.thumbnail)
178end 177end
179 178
180function process(global, build, meta) 179function process(global, build, meta, dir)
181 process_base(meta) 180 process_base(meta)
182 resolve_urls(global, build, meta) 181 resolve_urls(global, build, meta)
183 182
184 for _, p in pairs(meta.pages.by_id) do 183 if dir >= 0 then
185 process(global, build, p) 184 for _, p in pairs(meta.pages.by_id) do
185 p.parent = meta
186 process(global, build, p, 1)
187 p.parent = nil
188 end
186 end 189 end
190
191 process_pages(meta)
192
193 meta.list = generate_list(meta)
194
195 -- if dir <= 0 and meta.parent then
196 -- process(global, build, meta.parent, -1)
197 -- end
187end 198end
188 199
189function Meta(meta) 200function Meta(meta)
@@ -206,8 +217,6 @@ function Meta(meta)
206 217
207 meta = meta.tree 218 meta = meta.tree
208 219
209 process(global, build, meta)
210
211 local parts = utils.stringify(build.namespace):split('/'):skip(1) 220 local parts = utils.stringify(build.namespace):split('/'):skip(1)
212 for i = 1, #parts do 221 for i = 1, #parts do
213 local part = parts[i] 222 local part = parts[i]
@@ -217,9 +226,7 @@ function Meta(meta)
217 meta = p 226 meta = p
218 end 227 end
219 228
220 process_pages(global, build, meta) 229 process(global, build, meta, 0)
221
222 meta.list = generate_list(meta)
223 230
224 if global.menus and global.menus.main then 231 if global.menus and global.menus.main then
225 global.menus.main = prep_menu(meta.namespace.full, global.menus.main) 232 global.menus.main = prep_menu(meta.namespace.full, global.menus.main)