summaryrefslogtreecommitdiffstats
path: root/scripts/metadata_filter.lua
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2021-05-10 16:41:05 +0200
committerVolpeon <git@volpeon.ink>2021-05-10 16:41:05 +0200
commita48d05d1d5fcff414359c8ba6cc8f38467aebdeb (patch)
tree3542bf116c910a1bb42b40d8531f60c2c2498b08 /scripts/metadata_filter.lua
parentUpdate (diff)
downloadvolpeon.ink-a48d05d1d5fcff414359c8ba6cc8f38467aebdeb.tar.gz
volpeon.ink-a48d05d1d5fcff414359c8ba6cc8f38467aebdeb.tar.bz2
volpeon.ink-a48d05d1d5fcff414359c8ba6cc8f38467aebdeb.zip
Refactoring to fully take advantage of Make
Diffstat (limited to 'scripts/metadata_filter.lua')
-rw-r--r--scripts/metadata_filter.lua222
1 files changed, 67 insertions, 155 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua
index 90ca465..21f7759 100644
--- a/scripts/metadata_filter.lua
+++ b/scripts/metadata_filter.lua
@@ -5,27 +5,21 @@ 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 year == nil then return nil end 6 if year == nil then return nil end
7 7
8 local time = os.time({ 8 local time = os.time({year = tonumber(year), month = tonumber(month), day = tonumber(day)})
9 year = tonumber(year),
10 month = tonumber(month),
11 day = tonumber(day)
12 })
13 return pandoc.MetaMap({ 9 return pandoc.MetaMap({
14 yyyy_mm_dd = pandoc.MetaString(os.date("%F", time)), 10 yyyy_mm_dd = os.date("%F", time),
15 yyyy = pandoc.MetaString(os.date("%Y", time)), 11 yyyy = os.date("%Y", time),
16 mm = pandoc.MetaString(os.date("%m", time)), 12 mm = os.date("%m", time),
17 dd = pandoc.MetaString(os.date("%d", time)), 13 dd = os.date("%d", time),
18 rfc3339 = pandoc.MetaString(os.date("%FT%T+00:00", time)), 14 rfc3339 = os.date("%FT%T+00:00", time),
19 long = pandoc.MetaString(os.date("%B %d, %Y", time)), 15 long = os.date("%B %d, %Y", time),
20 }) 16 })
21end 17end
22 18
23function table_to_list(t, cmp) 19function table_to_list(t, cmp)
24 local l = pandoc.List() 20 local l = pandoc.List()
25 21
26 for key, value in pairs(t) do 22 for key, value in pairs(t) do l:insert(pandoc.MetaMap({key = key, value = value})) end
27 l:insert(pandoc.MetaMap({key = key, value = value}))
28 end
29 23
30 l:sort(cmp or function(i1, i2) return i1.key < i2.key end) 24 l:sort(cmp or function(i1, i2) return i1.key < i2.key end)
31 25
@@ -83,9 +77,7 @@ function relative_to(dir, target)
83 end 77 end
84 78
85 if #dir < #target then 79 if #dir < #target then
86 for i = #dir + 1, #target do 80 for i = #dir + 1, #target do path = path .. (path == "" and "" or "/") .. target[i] end
87 path = path .. (path == "" and "" or "/") .. target[i]
88 end
89 elseif #dir > #target then 81 elseif #dir > #target then
90 for _ = #target + 1, #dir do path = "../" .. path end 82 for _ = #target + 1, #dir do path = "../" .. path end
91 end 83 end
@@ -93,31 +85,8 @@ function relative_to(dir, target)
93 return path 85 return path
94end 86end
95 87
96function apply_path_rewrites(rewrites, str)
97 for i = 1, #rewrites.path do
98 local r = rewrites.path[i]
99 str = str:gsub(pandoc.utils.stringify(r.from),
100 pandoc.utils.stringify(r.to))
101 end
102 return str
103end
104
105function get_file_out(rewrites, content_dir, file_in)
106 local file_out = file_in:gsub("^" .. content_dir, ""):gsub("%.md$", ".html")
107
108 if file_out:match(".html$") and not file_out:match("/index%.html$") then
109 file_out = file_out:gsub("/(.*)%.html$", "/%1/index.html")
110 end
111
112 file_out = apply_path_rewrites(rewrites, file_out)
113
114 return pandoc.MetaString(file_out)
115end
116
117function make_absolute(rel, base) 88function make_absolute(rel, base)
118 return 89 return rel:find("^/") ~= nil and rel or base:gsub("^(.*)/.-$", "%1") .. "/" .. rel
119 rel:find("^/") ~= nil and rel or base:gsub("^(.*)/.-$", "%1") .. "/" ..
120 rel
121end 90end
122 91
123function resolve_url(site_url, ref_file, target_file) 92function resolve_url(site_url, ref_file, target_file)
@@ -127,119 +96,82 @@ function resolve_url(site_url, ref_file, target_file)
127 local abs = target_file 96 local abs = target_file
128 local rel = relative_to(ref_base_dir, abs):gsub("/index%.html$", "/") 97 local rel = relative_to(ref_base_dir, abs):gsub("/index%.html$", "/")
129 98
130 return pandoc.MetaMap({ 99 return pandoc.MetaMap({abs = abs, rel = rel, full = (site_url .. abs)})
131 abs = pandoc.MetaString(abs),
132 rel = pandoc.MetaString(rel),
133 full = pandoc.MetaString(site_url .. abs)
134 })
135end 100end
136 101
137function resolve_layout(layout) 102function resolve_layout(layout)
138 if layout then 103 if layout ~= nil then
139 layout = pandoc.utils.stringify(layout) 104 layout = pandoc.utils.stringify(layout)
140 return pandoc.MetaMap({ 105 return pandoc.MetaMap({id = layout, ["is_" .. layout] = pandoc.MetaBool(true)})
141 id = pandoc.MetaString(layout),
142 ["is_" .. layout] = pandoc.MetaBool(true)
143 })
144 end 106 end
145end 107end
146 108
147function resolve_section(content_dir, file_in) 109function resolve_namespace(namespace)
148 local section = file_in:gsub("^" .. content_dir, ""):match("^/(.-)[/.]") or 110 namespace = pandoc.utils.stringify(namespace)
149 "index" 111
112 local root = "index"
113 if namespace ~= "" then root = namespace:gsub("^/([^/]*).*$", "%1") end
114
150 return pandoc.MetaMap({ 115 return pandoc.MetaMap({
151 id = pandoc.MetaString(section), 116 root = pandoc.MetaMap({id = root, ["is_" .. root] = pandoc.MetaBool(true)}),
152 ["is_" .. section] = pandoc.MetaBool(true) 117 full = namespace,
153 }) 118 })
154end 119end
155 120
156function resolve_category(categories, category) 121function resolve_category(categories, category)
157 if categories and category then 122 if categories ~= nil and category ~= nil then
158 category = pandoc.utils.stringify(category) 123 category = pandoc.utils.stringify(category)
159 data = pandoc.MetaMap(categories[category]) 124 data = pandoc.MetaMap(categories[category])
160 data.id = pandoc.MetaString(category) 125 data.id = category
161 return data 126 return data
162 end 127 end
163end 128end
164 129
165function prep_main_menu(rewrites, section, main_menu) 130function prep_menu(active_id, main_menu)
166 local active_item = nil 131 local active_item = nil
167 132
168 for i = 1, #main_menu do 133 for i = 1, #main_menu do
169 local item = main_menu[i] 134 local item = main_menu[i]
170 local active = pandoc.utils.stringify(item.id) == section.id 135 local active = pandoc.utils.stringify(item.id) == active_id
171 item.active = pandoc.MetaBool(active) 136 item.active = pandoc.MetaBool(active)
172 item.url = apply_path_rewrites(rewrites,
173 pandoc.utils.stringify(item.url))
174 if active then active_item = item end 137 if active then active_item = item end
175 end 138 end
176 139
177 return pandoc.MetaMap({ 140 return pandoc.MetaMap({
178 items = main_menu:filter(function(item) 141 items = main_menu:filter(function(item) return not item.hidden or item.active end),
179 return not item.hidden or item.active 142 active = active_item,
180 end),
181 active = active_item
182 }) 143 })
183end 144end
184 145
185function organize_subpages(site_url, ref_file, pages) 146function process_pages(global, pages_by_id)
186 for i = 1, #pages do 147 if pages_by_id == nil then pages_by_id = {} end
187 local page = pages[i]
188 page.url = resolve_url(site_url, ref_file,
189 pandoc.utils.stringify(page.file_out))
190 end
191
192 local pages_grouped_date =
193 group_by(pages, function(p) return not p.date end)
194
195 local pages_undated = pages_grouped_date[true] or pandoc.MetaList({})
196 pages_undated:sort(function(p1, p2)
197 return pandoc.utils.stringify(p1.title) <
198 pandoc.utils.stringify(p2.title)
199 end)
200 148
201 local pages_dated = pages_grouped_date[false] or pandoc.MetaList({}) 149 local pages_list = pandoc.List()
202 pages_dated:sort(function(p1, p2)
203 return pandoc.utils.stringify(p1.date.yyyy_mm_dd) >
204 pandoc.utils.stringify(p2.date.yyyy_mm_dd)
205 end)
206 150
207 local pages_categorized = pages:filter( 151 for _, page in pairs(pages_by_id) do
208 function(p) return p.category ~= nil end) 152 page = process(global, page)
209 pages_categorized:sort(function(p1, p2) 153 pages_list:insert(page)
210 return pandoc.utils.stringify(p1.title) < 154 end
211 pandoc.utils.stringify(p2.title)
212 end)
213 155
214 local pages_by_year = group_by(pages_dated, function(p) 156 local pages_categorized = pages_list:filter(function(p) return p.category ~= nil end)
215 return pandoc.utils.stringify(p.date.yyyy) 157 pages_categorized:sort(function(p1, p2) return p1.title < p2.title end)
216 end)
217 pages_by_year = pandoc.MetaList(table_to_list(pages_by_year,
218 function(i1, i2)
219 return i1.key > i2.key
220 end))
221 158
222 local pages_by_category = group_by(pages_categorized, function(p) 159 local pages_by_category = group_by(pages_categorized,
223 return pandoc.utils.stringify(p.category.id) 160 function(p) return pandoc.utils.stringify(p.category.id) end)
224 end)
225 pages_by_category = pandoc.MetaList(table_to_list(pages_by_category, 161 pages_by_category = pandoc.MetaList(table_to_list(pages_by_category,
226 function(i1, i2) 162 function(i1, i2) return i1.key < i2.key end))
227 return i1.key < i2.key
228 end))
229 163
230 local pages_data = pandoc.MetaMap({ 164 local pages_data = pandoc.MetaMap({
231 all_dated = pages_dated, 165 all = pages_list,
232 all_undated = pages_undated, 166 by_id = pages_by_id,
233 by_year = pages_by_year,
234 by_category = pages_by_category, 167 by_category = pages_by_category,
235 last_update = #pages_dated ~= 0 and pages_dated[1].last_update
236 }) 168 })
237 169
238 local categories_data = group_by(pages_categorized, function(p) 170 local categories_data = group_by(pages_categorized, function(p)
239 return p.category and pandoc.utils.stringify(p.category.id) 171 return p.category and pandoc.utils.stringify(p.category.id)
240 end, function(stats, _, p) 172 end, function(stats, _, p)
241 if not stats then 173 if not stats then
242 return {name = pandoc.MetaString(p.category.name), count = 1} 174 return {name = p.category.name, count = 1}
243 else 175 else
244 stats.count = stats.count + 1 176 stats.count = stats.count + 1
245 end 177 end
@@ -247,72 +179,52 @@ function organize_subpages(site_url, ref_file, pages)
247 categories_data = pandoc.MetaList(table_to_list(categories_data)) 179 categories_data = pandoc.MetaList(table_to_list(categories_data))
248 180
249 for i = 1, #categories_data do 181 for i = 1, #categories_data do
250 categories_data[i].value.count = 182 categories_data[i].value.count = ("%d"):format(categories_data[i].value.count)
251 pandoc.MetaString(("%d"):format(categories_data[i].value.count))
252 end 183 end
253 184
254 return pages_data, categories_data 185 return pages_data, categories_data
255end 186end
256 187
257function Meta(meta) 188function process(global, meta)
258 meta.content_dir = meta.content_dir:gsub("/$", "") 189 meta.namespace = resolve_namespace(meta.namespace)
259 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") 190 meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "")
260 meta.rewrites = meta.rewrites or
261 pandoc.MetaMap({path = pandoc.MetaList({})})
262 meta.page_type = meta.page_type or "page"
263 meta.layout = resolve_layout(meta.layout) 191 meta.layout = resolve_layout(meta.layout)
264 meta.section = resolve_section(meta.content_dir, meta.file_in) 192 meta.url = resolve_url(global.site.url, global.file_out, meta.file_out)
265 193
266 meta.file_out = get_file_out(meta.rewrites, meta.content_dir, meta.file_in) 194 if meta.title ~= nil then
267 if meta.relative_to == nil then meta.relative_to = meta.file_in end 195 meta.title = pandoc.utils.stringify(meta.title)
268 meta.relative_to_out = get_file_out(meta.rewrites, meta.content_dir, 196 else
269 meta.relative_to) 197 meta.title = ""
198 end
270 199
271 meta.url = resolve_url(meta.site.url, meta.relative_to_out, meta.file_out)
272 if meta.preview ~= nil then 200 if meta.preview ~= nil then
273 meta.preview = resolve_url(meta.site.url, meta.relative_to_out, 201 meta.preview = make_absolute(pandoc.utils.stringify(meta.preview), meta.file_out)
274 make_absolute( 202 meta.preview = resolve_url(global.site.url, global.file_out, meta.preview)
275 pandoc.utils.stringify(meta.preview),
276 meta.file_out))
277 end 203 end
278 204
279 meta.date = format_date(meta.date) 205 if meta.date ~= nil then meta.date = format_date(meta.date) end
206
280 if meta.last_update ~= nil then 207 if meta.last_update ~= nil then
281 meta.last_update = format_date(meta.last_update) 208 meta.last_update = format_date(meta.last_update)
282 else 209 else
283 meta.last_update = meta.date 210 meta.last_update = meta.date
284 end 211 end
285 212
286 meta.category = resolve_category(meta.categories[meta.section.id], 213 meta.category = resolve_category(global.categories[meta.namespace.root.id], meta.category)
287 meta.category)
288 meta.categories = nil
289 214
290 if meta.page_type == "feed" then 215 if meta.menus ~= nil and meta.menus.main ~= nil then
291 meta.page = pandoc.MetaMap({ 216 meta.menus.main = prep_menu(meta.namespace.root.id, meta.menus.main)
292 url = resolve_url(meta.site.url, meta.relative_to_out,
293 meta.file_out:gsub("%.xml$", ".html"))
294 })
295 end 217 end
296 218
297 if meta.create_feed then 219 local pages, local_categories = process_pages(global, meta.pages)
298 meta.feed = pandoc.MetaMap({ 220 meta.pages = pages
299 url = resolve_url(meta.site.url, meta.relative_to_out, 221 meta.local_categories = local_categories
300 meta.file_out:gsub("%.html$", ".xml"))
301 })
302 end
303 222
304 if meta.menus and meta.menus.main then 223 return meta
305 meta.menus.main = prep_main_menu(meta.rewrites, meta.section, 224end
306 meta.menus.main)
307 end
308 225
309 if meta.pages then 226function Meta(meta)
310 local pages, categories = organize_subpages(meta.site.url, 227 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "")
311 meta.relative_to_out,
312 meta.pages)
313 meta.pages = pages
314 meta.categories = categories
315 end
316 228
317 return meta 229 return process(meta, meta)
318end 230end