summaryrefslogtreecommitdiffstats
path: root/scripts/metadata_filter.lua
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/metadata_filter.lua')
-rw-r--r--scripts/metadata_filter.lua79
1 files changed, 57 insertions, 22 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua
index 61fe90f..5ed5382 100644
--- a/scripts/metadata_filter.lua
+++ b/scripts/metadata_filter.lua
@@ -92,11 +92,33 @@ function relative_to(dir, target)
92 return path 92 return path
93end 93end
94 94
95function resolve_url(page_type, site_url, output_dir, base_dir_out, cur_file_out) 95function apply_path_rewrites(rewrites, str)
96 local abs = cur_file_out:gsub("^" .. output_dir, ""):gsub("/index.html$", 96 for i = 1, #rewrites.path do
97 "/") 97 local r = rewrites.path[i]
98 str = str:gsub(pandoc.utils.stringify(r.from),
99 pandoc.utils.stringify(r.to))
100 end
101 return str
102end
103
104function get_file_out(rewrites, content_dir, output_dir, file_in)
105 local file_out = file_in:gsub("^" .. content_dir, ""):gsub("%.md$", ".html")
106
107 if file_out:match(".html$") and not file_out:match("/index%.html$") then
108 file_out = file_out:gsub("/(.*)%.html$", "/%1/index.html")
109 end
110
111 file_out = apply_path_rewrites(rewrites, file_out)
112
113 return pandoc.MetaString(output_dir .. file_out)
114end
115
116function resolve_url(site_url, output_dir, ref_file, target_file)
117 local ref_base_dir = ref_file:gsub("^(.*)/.-$", "%1")
118 local abs = target_file:gsub("^" .. output_dir, ""):gsub("/index%.html$",
119 "/")
98 local rel = 120 local rel =
99 relative_to(base_dir_out, cur_file_out):gsub("/index.html$", "/") 121 relative_to(ref_base_dir, target_file):gsub("/index%.html$", "/")
100 122
101 return pandoc.MetaMap({ 123 return pandoc.MetaMap({
102 abs = pandoc.MetaString(abs), 124 abs = pandoc.MetaString(abs),
@@ -115,8 +137,9 @@ function resolve_layout(layout)
115 end 137 end
116end 138end
117 139
118function resolve_section(abs_url) 140function resolve_section(content_dir, file_in)
119 local section = abs_url:match("^/(.-)[/.]") or "index" 141 local section = file_in:gsub("^" .. content_dir, ""):match("^/(.-)[/.]") or
142 "index"
120 return pandoc.MetaMap({ 143 return pandoc.MetaMap({
121 id = pandoc.MetaString(section), 144 id = pandoc.MetaString(section),
122 ["is_" .. section] = pandoc.MetaBool(true) 145 ["is_" .. section] = pandoc.MetaBool(true)
@@ -133,13 +156,15 @@ function resolve_category(categories, category)
133 end 156 end
134end 157end
135 158
136function create_main_menu_state(section, main_menu) 159function prep_main_menu(rewrites, section, main_menu)
137 local active_item = nil 160 local active_item = nil
138 161
139 for i = 1, #main_menu do 162 for i = 1, #main_menu do
140 local item = main_menu[i] 163 local item = main_menu[i]
141 local active = pandoc.utils.stringify(item.id) == section.id 164 local active = pandoc.utils.stringify(item.id) == section.id
142 item.active = pandoc.MetaBool(active) 165 item.active = pandoc.MetaBool(active)
166 item.url = apply_path_rewrites(rewrites,
167 pandoc.utils.stringify(item.url))
143 if active then active_item = item end 168 if active then active_item = item end
144 end 169 end
145 170
@@ -151,7 +176,13 @@ function create_main_menu_state(section, main_menu)
151 }) 176 })
152end 177end
153 178
154function organize_subpages(pages) 179function organize_subpages(site_url, output_dir, ref_file, pages)
180 for i = 1, #pages do
181 local page = pages[i]
182 page.url = resolve_url(site_url, output_dir, ref_file,
183 pandoc.utils.stringify(page.file_out))
184 end
185
155 local grouped_pages = group_by(pages, function(p) return not p.date end) 186 local grouped_pages = group_by(pages, function(p) return not p.date end)
156 187
157 local pages_undated = grouped_pages[true] or pandoc.MetaList({}) 188 local pages_undated = grouped_pages[true] or pandoc.MetaList({})
@@ -201,13 +232,17 @@ function organize_subpages(pages)
201end 232end
202 233
203function Meta(meta) 234function Meta(meta)
235 meta.content_dir = meta.content_dir:gsub("/$", "")
204 meta.output_dir = meta.output_dir:gsub("/$", "") 236 meta.output_dir = meta.output_dir:gsub("/$", "")
205 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") 237 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "")
206 meta.base_file_out = meta.base_file_out or meta.file_out 238 meta.rewrites = meta.rewrites or
207 meta.base_dir_out = meta.base_file_out:gsub("^(.*)/.-$", "%1") 239 pandoc.MetaMap({path = pandoc.MetaList({})})
208 meta.page_type = meta.page_type or "page" 240 meta.page_type = meta.page_type or "page"
209
210 meta.layout = resolve_layout(meta.layout) 241 meta.layout = resolve_layout(meta.layout)
242 meta.section = resolve_section(meta.content_dir, meta.file_in)
243
244 meta.file_out = get_file_out(meta.rewrites, meta.content_dir,
245 meta.output_dir, meta.file_in)
211 246
212 meta.date = format_date(meta.date) 247 meta.date = format_date(meta.date)
213 if meta.last_update ~= nil then 248 if meta.last_update ~= nil then
@@ -216,26 +251,26 @@ function Meta(meta)
216 meta.last_update = meta.date 251 meta.last_update = meta.date
217 end 252 end
218 253
254 meta.category = resolve_category(meta.categories[meta.section.id],
255 meta.category)
256 meta.categories = nil
257
219 if meta.page_type == "feed" then 258 if meta.page_type == "feed" then
220 meta.page = pandoc.MetaMap({ 259 meta.page = pandoc.MetaMap({
221 url = resolve_url("page", meta.site.url, meta.output_dir, 260 url = resolve_url(meta.site.url, meta.output_dir, meta.file_out,
222 meta.base_dir_out, meta.file_out) 261 meta.file_out:gsub("%.xml$", ".html"))
223 }) 262 })
224 end 263 end
225 264
226 meta.url = resolve_url(meta.page_type, meta.site.url, meta.output_dir,
227 meta.base_dir_out, meta.file_out)
228 meta.section = resolve_section(meta.url.abs)
229 meta.category = resolve_category(meta.categories[meta.section.id],
230 meta.category)
231 meta.categories = nil
232
233 if meta.menus and meta.menus.main then 265 if meta.menus and meta.menus.main then
234 meta.menus.main = create_main_menu_state(meta.section, meta.menus.main) 266 meta.menus.main = prep_main_menu(meta.rewrites, meta.section,
267 meta.menus.main)
235 end 268 end
236 269
237 if meta.pages then 270 if meta.pages then
238 local pages, categories = organize_subpages(meta.pages) 271 local pages, categories = organize_subpages(meta.site.url,
272 meta.output_dir,
273 meta.file_out, meta.pages)
239 meta.pages = pages 274 meta.pages = pages
240 meta.categories = categories 275 meta.categories = categories
241 end 276 end