diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/metadata_filter.lua | 96 |
1 files changed, 88 insertions, 8 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua index ebd69f1..b16d472 100644 --- a/scripts/metadata_filter.lua +++ b/scripts/metadata_filter.lua | |||
@@ -1,5 +1,14 @@ | |||
1 | local path = require 'pandoc.path' | 1 | local path = require 'pandoc.path' |
2 | 2 | ||
3 | function pandoc.List:flatMap(fn) | ||
4 | local mapped = self:map(fn) | ||
5 | local result = pandoc.List() | ||
6 | |||
7 | for i = 1, #mapped do result:extend(mapped[i]) end | ||
8 | |||
9 | return result | ||
10 | end | ||
11 | |||
3 | function format_date(date) | 12 | function format_date(date) |
4 | if not date then return date end | 13 | if not date then return date end |
5 | 14 | ||
@@ -49,14 +58,12 @@ function resolve_url(site_url, ref_file, target_file) | |||
49 | end | 58 | end |
50 | 59 | ||
51 | function resolve_layout(depth) | 60 | function resolve_layout(depth) |
52 | local layout = "deep_categorized_list" | 61 | local layout = "categorized_list" |
53 | 62 | ||
54 | if depth == "0" then | 63 | if depth == "0" then |
55 | layout = "page" | 64 | layout = "page" |
56 | elseif depth == "1" then | 65 | elseif depth == "1" then |
57 | layout = "list" | 66 | layout = "list" |
58 | elseif depth == "2" then | ||
59 | layout = "categorized_list" | ||
60 | end | 67 | end |
61 | 68 | ||
62 | return layout | 69 | return layout |
@@ -91,14 +98,14 @@ function prep_menu(active_id, main_menu) | |||
91 | return { items = items, active = active_item } | 98 | return { items = items, active = active_item } |
92 | end | 99 | end |
93 | 100 | ||
94 | function process_pages(global, order, pages_by_id) | 101 | function process_pages(global, parent, order, pages_by_id) |
95 | if not pages_by_id then return nil end | 102 | if not pages_by_id then return nil end |
96 | 103 | ||
97 | local pages_all = pandoc.List() | 104 | local pages_all = pandoc.List() |
98 | local pages_date_desc = pandoc.List() | 105 | local pages_date_desc = pandoc.List() |
99 | 106 | ||
100 | for _, page in pairs(pages_by_id) do | 107 | for _, page in pairs(pages_by_id) do |
101 | local p = process(global, page) | 108 | local p = process(global, parent, page) |
102 | if not p.unlisted then | 109 | if not p.unlisted then |
103 | pages_all:insert(p) | 110 | pages_all:insert(p) |
104 | if p.date then pages_date_desc:insert(p) end | 111 | if p.date then pages_date_desc:insert(p) end |
@@ -176,7 +183,77 @@ function find_depth(pages) | |||
176 | return tostring(depth) | 183 | return tostring(depth) |
177 | end | 184 | end |
178 | 185 | ||
179 | function process(global, meta) | 186 | function generate_list(meta) |
187 | if meta.depth == "1" then | ||
188 | return meta.pages.all:map(function(p) | ||
189 | return { | ||
190 | title = p.title, | ||
191 | subtitle = p.subtitle, | ||
192 | date = p.date, | ||
193 | url = p.url, | ||
194 | icon = p.icon or meta.icon, | ||
195 | post_icon = meta.list_post_icon, | ||
196 | indicator = meta.list_read_indicators, | ||
197 | } | ||
198 | end) | ||
199 | elseif meta.depth == "2" then | ||
200 | return meta.pages.all:map(function(cat) | ||
201 | return { | ||
202 | title = cat.title, | ||
203 | content = pandoc.utils.stringify(cat.content), | ||
204 | url = cat.url, | ||
205 | grid = cat.list_grid, | ||
206 | items = cat.pages.all:map(function(p) | ||
207 | return { | ||
208 | title = p.title, | ||
209 | subtitle = p.subtitle, | ||
210 | date = p.date, | ||
211 | url = p.url, | ||
212 | icon = p.icon or cat.icon, | ||
213 | post_icon = cat.list_post_icon or meta.list_post_icon, | ||
214 | indicator = cat.list_read_indicators, | ||
215 | } | ||
216 | end), | ||
217 | } | ||
218 | end) | ||
219 | elseif meta.depth == "3" then | ||
220 | return meta.pages.all:map(function(cat) | ||
221 | return { | ||
222 | title = cat.title, | ||
223 | content = pandoc.utils.stringify(cat.content), | ||
224 | url = cat.url, | ||
225 | grid = cat.list_grid, | ||
226 | items = cat.pages.all:flatMap(function(c) | ||
227 | if c.pages then | ||
228 | return c.pages.all:map(function(p) | ||
229 | return { | ||
230 | title = p.title, | ||
231 | subtitle = p.subtitle or c.title, | ||
232 | url = p.url, | ||
233 | icon = p.icon or c.icon, | ||
234 | post_icon = c.list_post_icon or cat.list_post_icon, | ||
235 | indicator = c.list_read_indicators, | ||
236 | } | ||
237 | end) | ||
238 | else | ||
239 | local l = pandoc.List() | ||
240 | l:insert({ | ||
241 | title = c.title, | ||
242 | subtitle = c.subtitle, | ||
243 | url = c.url, | ||
244 | icon = c.icon or meta.icon, | ||
245 | post_icon = meta.list_post_icon, | ||
246 | indicator = meta.list_read_indicators, | ||
247 | }) | ||
248 | return l | ||
249 | end | ||
250 | end), | ||
251 | } | ||
252 | end) | ||
253 | end | ||
254 | end | ||
255 | |||
256 | function process(global, parent, meta) | ||
180 | meta.namespace = resolve_namespace(meta.namespace) | 257 | meta.namespace = resolve_namespace(meta.namespace) |
181 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") | 258 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") |
182 | meta.url = meta.url and pandoc.utils.stringify(meta.url) | 259 | meta.url = meta.url and pandoc.utils.stringify(meta.url) |
@@ -209,7 +286,8 @@ function process(global, meta) | |||
209 | meta.menus.main = prep_menu(meta.namespace.root.id, meta.menus.main) | 286 | meta.menus.main = prep_menu(meta.namespace.root.id, meta.menus.main) |
210 | end | 287 | end |
211 | 288 | ||
212 | meta.pages = process_pages(global, meta.list_order, meta.pages) | 289 | meta.pages = |
290 | process_pages(global, { parent = parent, meta = meta }, meta.list_order, meta.pages) | ||
213 | meta.depth = (meta.pages and find_depth(meta.pages.all)) or "0" | 291 | meta.depth = (meta.pages and find_depth(meta.pages.all)) or "0" |
214 | meta.layout = prep_layout(meta.layout or resolve_layout(meta.depth)) | 292 | meta.layout = prep_layout(meta.layout or resolve_layout(meta.depth)) |
215 | 293 | ||
@@ -227,11 +305,13 @@ function process(global, meta) | |||
227 | meta.last_update = meta.date | 305 | meta.last_update = meta.date |
228 | end | 306 | end |
229 | 307 | ||
308 | meta.list = generate_list(meta) | ||
309 | |||
230 | return meta | 310 | return meta |
231 | end | 311 | end |
232 | 312 | ||
233 | function Meta(meta) | 313 | function Meta(meta) |
234 | meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") | 314 | meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") |
235 | 315 | ||
236 | return process(meta, meta) | 316 | return process(meta, nil, meta) |
237 | end | 317 | end |