diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/metadata_filter.lua | 76 |
1 files changed, 56 insertions, 20 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua index 000fda6..ebbd6d4 100644 --- a/scripts/metadata_filter.lua +++ b/scripts/metadata_filter.lua | |||
@@ -5,7 +5,7 @@ function format_date(date) | |||
5 | local year, month, day = date:match("(%d%d%d%d)-(%d%d)-(%d%d)") | 5 | local year, month, day = date:match("(%d%d%d%d)-(%d%d)-(%d%d)") |
6 | if not year then return nil end | 6 | if not year then return nil end |
7 | 7 | ||
8 | local time = os.time({year = tonumber(year), month = tonumber(month), day = tonumber(day)}) | 8 | local time = os.time({ year = tonumber(year), month = tonumber(month), day = tonumber(day) }) |
9 | return { | 9 | return { |
10 | yyyy_mm_dd = os.date("%F", time), | 10 | yyyy_mm_dd = os.date("%F", time), |
11 | yyyy = os.date("%Y", time), | 11 | yyyy = os.date("%Y", time), |
@@ -21,7 +21,7 @@ function table_to_list(t, kv, cmp) | |||
21 | local l = pandoc.List() | 21 | local l = pandoc.List() |
22 | 22 | ||
23 | if kv then | 23 | if kv then |
24 | for key, value in pairs(t) do l:insert({key = key, value = value}) end | 24 | for key, value in pairs(t) do l:insert({ key = key, value = value }) end |
25 | else | 25 | else |
26 | for _, value in pairs(t) do l:insert(value) end | 26 | for _, value in pairs(t) do l:insert(value) end |
27 | end | 27 | end |
@@ -34,7 +34,7 @@ end | |||
34 | function group_by(l, field, insert) | 34 | function group_by(l, field, insert) |
35 | insert = insert or function(group, _, item) | 35 | insert = insert or function(group, _, item) |
36 | if not group then | 36 | if not group then |
37 | group = l:new({item}) | 37 | group = l:new({ item }) |
38 | return group | 38 | return group |
39 | end | 39 | end |
40 | group:insert(item) | 40 | group:insert(item) |
@@ -101,13 +101,13 @@ function resolve_url(site_url, ref_file, target_file) | |||
101 | local abs = target_file | 101 | local abs = target_file |
102 | local rel = relative_to(ref_base_dir, abs):gsub("/index%.html$", "/") | 102 | local rel = relative_to(ref_base_dir, abs):gsub("/index%.html$", "/") |
103 | 103 | ||
104 | return {abs = abs, rel = rel, full = (site_url .. abs)} | 104 | return { abs = abs, rel = rel, full = (site_url .. abs) } |
105 | end | 105 | end |
106 | 106 | ||
107 | function resolve_layout(layout) | 107 | function resolve_layout(layout) |
108 | if layout then | 108 | if layout then |
109 | layout = pandoc.utils.stringify(layout) | 109 | layout = pandoc.utils.stringify(layout) |
110 | return {id = layout, ["is_" .. layout] = true} | 110 | return { id = layout, ["is_" .. layout] = true } |
111 | end | 111 | end |
112 | end | 112 | end |
113 | 113 | ||
@@ -117,7 +117,7 @@ function resolve_namespace(namespace) | |||
117 | local root = "index" | 117 | local root = "index" |
118 | if namespace ~= "" then root = namespace:gsub("^/([^/]*).*$", "%1") end | 118 | if namespace ~= "" then root = namespace:gsub("^/([^/]*).*$", "%1") end |
119 | 119 | ||
120 | return {root = {id = root, ["is_" .. root] = true}, full = namespace} | 120 | return { root = { id = root, ["is_" .. root] = true }, full = namespace } |
121 | end | 121 | end |
122 | 122 | ||
123 | function prep_menu(active_id, main_menu) | 123 | function prep_menu(active_id, main_menu) |
@@ -137,17 +137,22 @@ function prep_menu(active_id, main_menu) | |||
137 | end | 137 | end |
138 | 138 | ||
139 | function process_pages(global, pages_by_id) | 139 | function process_pages(global, pages_by_id) |
140 | if not pages_by_id then pages_by_id = {} end | 140 | if not pages_by_id then return nil end |
141 | 141 | ||
142 | local pages_list = pandoc.List() | 142 | local pages_list = pandoc.List() |
143 | 143 | ||
144 | for _, page in pairs(pages_by_id) do | 144 | for _, page in pairs(pages_by_id) do pages_list:insert(process(global, page)) end |
145 | page = process(global, page) | ||
146 | pages_list:insert(page) | ||
147 | end | ||
148 | 145 | ||
149 | pages_list:sort(function(p1, p2) | 146 | pages_list:sort(function(p1, p2) |
150 | if p1.date then | 147 | if p1.position then |
148 | if p2.position then | ||
149 | return p1.position < p2.position | ||
150 | else | ||
151 | return true | ||
152 | end | ||
153 | elseif p2.position then | ||
154 | return false | ||
155 | elseif p1.date then | ||
151 | if p2.date then | 156 | if p2.date then |
152 | return p1.date.yyyy_mm_dd > p2.date.yyyy_mm_dd | 157 | return p1.date.yyyy_mm_dd > p2.date.yyyy_mm_dd |
153 | else | 158 | else |
@@ -166,7 +171,7 @@ function process_pages(global, pages_by_id) | |||
166 | if not data then | 171 | if not data then |
167 | local l = pandoc.List() | 172 | local l = pandoc.List() |
168 | l:insert(p) | 173 | l:insert(p) |
169 | return {name = pandoc.utils.stringify(p.category.name), pages = l} | 174 | return { name = pandoc.utils.stringify(p.category.name), pages = l } |
170 | else | 175 | else |
171 | data.pages:insert(p) | 176 | data.pages:insert(p) |
172 | end | 177 | end |
@@ -174,11 +179,24 @@ function process_pages(global, pages_by_id) | |||
174 | pages_by_category = table_to_list(pages_by_category, false, | 179 | pages_by_category = table_to_list(pages_by_category, false, |
175 | function(i1, i2) return i1.name < i2.name end) | 180 | function(i1, i2) return i1.name < i2.name end) |
176 | 181 | ||
177 | local pages_data = {all = pages_list, by_id = pages_by_id, by_category = pages_by_category} | 182 | local pages_data = { all = pages_list, by_id = pages_by_id, by_category = pages_by_category } |
178 | 183 | ||
179 | return pages_data | 184 | return pages_data |
180 | end | 185 | end |
181 | 186 | ||
187 | function pages_last_update(all_pages) | ||
188 | local last_update = format_date("1990-01-01") | ||
189 | |||
190 | for i = 1, #all_pages do | ||
191 | local page = all_pages[i] | ||
192 | if page.last_update and page.last_update.yyyy_mm_dd > last_update.yyyy_mm_dd then | ||
193 | last_update = page.last_update | ||
194 | end | ||
195 | end | ||
196 | |||
197 | return last_update | ||
198 | end | ||
199 | |||
182 | function process(global, meta) | 200 | function process(global, meta) |
183 | meta.namespace = resolve_namespace(meta.namespace) | 201 | meta.namespace = resolve_namespace(meta.namespace) |
184 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") | 202 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") |
@@ -186,6 +204,22 @@ function process(global, meta) | |||
186 | meta.url = resolve_url(global.site.url, global.file_out, meta.file_out) | 204 | meta.url = resolve_url(global.site.url, global.file_out, meta.file_out) |
187 | meta.title = (meta.title and pandoc.utils.stringify(meta.title)) or "" | 205 | meta.title = (meta.title and pandoc.utils.stringify(meta.title)) or "" |
188 | 206 | ||
207 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end | ||
208 | |||
209 | if meta.create_feed then | ||
210 | if meta.file_out:match(".html$") then | ||
211 | meta.feed = { | ||
212 | url = resolve_url(global.site.url, global.file_out, | ||
213 | meta.file_out:gsub(".html$", ".xml")), | ||
214 | } | ||
215 | else | ||
216 | meta.page = { | ||
217 | url = resolve_url(global.site.url, global.file_out, | ||
218 | meta.file_out:gsub(".xml$", ".html")), | ||
219 | } | ||
220 | end | ||
221 | end | ||
222 | |||
189 | if meta.preview then | 223 | if meta.preview then |
190 | meta.preview = make_absolute(pandoc.utils.stringify(meta.preview), meta.file_out) | 224 | meta.preview = make_absolute(pandoc.utils.stringify(meta.preview), meta.file_out) |
191 | meta.preview = resolve_url(global.site.url, global.file_out, meta.preview) | 225 | meta.preview = resolve_url(global.site.url, global.file_out, meta.preview) |
@@ -193,18 +227,20 @@ function process(global, meta) | |||
193 | 227 | ||
194 | if meta.date then meta.date = format_date(meta.date) end | 228 | if meta.date then meta.date = format_date(meta.date) end |
195 | 229 | ||
196 | if meta.last_update then | ||
197 | meta.last_update = format_date(meta.last_update) | ||
198 | else | ||
199 | meta.last_update = meta.date | ||
200 | end | ||
201 | |||
202 | if meta.menus and meta.menus.main then | 230 | if meta.menus and meta.menus.main then |
203 | meta.menus.main = prep_menu(meta.namespace.root.id, meta.menus.main) | 231 | meta.menus.main = prep_menu(meta.namespace.root.id, meta.menus.main) |
204 | end | 232 | end |
205 | 233 | ||
206 | meta.pages = process_pages(global, meta.pages) | 234 | meta.pages = process_pages(global, meta.pages) |
207 | 235 | ||
236 | if meta.last_update then | ||
237 | meta.last_update = format_date(meta.last_update) | ||
238 | elseif meta.date then | ||
239 | meta.last_update = meta.date | ||
240 | elseif meta.pages then | ||
241 | meta.last_update = pages_last_update(meta.pages.all) | ||
242 | end | ||
243 | |||
208 | return meta | 244 | return meta |
209 | end | 245 | end |
210 | 246 | ||