From 3ad6bd151364a3278618e3a26e21918d17680d24 Mon Sep 17 00:00:00 2001 From: Volpeon Date: Sun, 10 Jan 2021 13:24:21 +0100 Subject: Moved output filename handling into Pandoc filter, implemented path rewriting --- scripts/metadata_filter.lua | 79 ++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 22 deletions(-) (limited to 'scripts/metadata_filter.lua') 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) return path end -function resolve_url(page_type, site_url, output_dir, base_dir_out, cur_file_out) - local abs = cur_file_out:gsub("^" .. output_dir, ""):gsub("/index.html$", - "/") +function apply_path_rewrites(rewrites, str) + for i = 1, #rewrites.path do + local r = rewrites.path[i] + str = str:gsub(pandoc.utils.stringify(r.from), + pandoc.utils.stringify(r.to)) + end + return str +end + +function get_file_out(rewrites, content_dir, output_dir, file_in) + local file_out = file_in:gsub("^" .. content_dir, ""):gsub("%.md$", ".html") + + if file_out:match(".html$") and not file_out:match("/index%.html$") then + file_out = file_out:gsub("/(.*)%.html$", "/%1/index.html") + end + + file_out = apply_path_rewrites(rewrites, file_out) + + return pandoc.MetaString(output_dir .. file_out) +end + +function resolve_url(site_url, output_dir, ref_file, target_file) + local ref_base_dir = ref_file:gsub("^(.*)/.-$", "%1") + local abs = target_file:gsub("^" .. output_dir, ""):gsub("/index%.html$", + "/") local rel = - relative_to(base_dir_out, cur_file_out):gsub("/index.html$", "/") + relative_to(ref_base_dir, target_file):gsub("/index%.html$", "/") return pandoc.MetaMap({ abs = pandoc.MetaString(abs), @@ -115,8 +137,9 @@ function resolve_layout(layout) end end -function resolve_section(abs_url) - local section = abs_url:match("^/(.-)[/.]") or "index" +function resolve_section(content_dir, file_in) + local section = file_in:gsub("^" .. content_dir, ""):match("^/(.-)[/.]") or + "index" return pandoc.MetaMap({ id = pandoc.MetaString(section), ["is_" .. section] = pandoc.MetaBool(true) @@ -133,13 +156,15 @@ function resolve_category(categories, category) end end -function create_main_menu_state(section, main_menu) +function prep_main_menu(rewrites, section, main_menu) local active_item = nil for i = 1, #main_menu do local item = main_menu[i] local active = pandoc.utils.stringify(item.id) == section.id item.active = pandoc.MetaBool(active) + item.url = apply_path_rewrites(rewrites, + pandoc.utils.stringify(item.url)) if active then active_item = item end end @@ -151,7 +176,13 @@ function create_main_menu_state(section, main_menu) }) end -function organize_subpages(pages) +function organize_subpages(site_url, output_dir, ref_file, pages) + for i = 1, #pages do + local page = pages[i] + page.url = resolve_url(site_url, output_dir, ref_file, + pandoc.utils.stringify(page.file_out)) + end + local grouped_pages = group_by(pages, function(p) return not p.date end) local pages_undated = grouped_pages[true] or pandoc.MetaList({}) @@ -201,13 +232,17 @@ function organize_subpages(pages) end function Meta(meta) + meta.content_dir = meta.content_dir:gsub("/$", "") meta.output_dir = meta.output_dir:gsub("/$", "") meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") - meta.base_file_out = meta.base_file_out or meta.file_out - meta.base_dir_out = meta.base_file_out:gsub("^(.*)/.-$", "%1") + meta.rewrites = meta.rewrites or + pandoc.MetaMap({path = pandoc.MetaList({})}) meta.page_type = meta.page_type or "page" - meta.layout = resolve_layout(meta.layout) + meta.section = resolve_section(meta.content_dir, meta.file_in) + + meta.file_out = get_file_out(meta.rewrites, meta.content_dir, + meta.output_dir, meta.file_in) meta.date = format_date(meta.date) if meta.last_update ~= nil then @@ -216,26 +251,26 @@ function Meta(meta) meta.last_update = meta.date end + meta.category = resolve_category(meta.categories[meta.section.id], + meta.category) + meta.categories = nil + if meta.page_type == "feed" then meta.page = pandoc.MetaMap({ - url = resolve_url("page", meta.site.url, meta.output_dir, - meta.base_dir_out, meta.file_out) + url = resolve_url(meta.site.url, meta.output_dir, meta.file_out, + meta.file_out:gsub("%.xml$", ".html")) }) end - meta.url = resolve_url(meta.page_type, meta.site.url, meta.output_dir, - meta.base_dir_out, meta.file_out) - meta.section = resolve_section(meta.url.abs) - meta.category = resolve_category(meta.categories[meta.section.id], - meta.category) - meta.categories = nil - if meta.menus and meta.menus.main then - meta.menus.main = create_main_menu_state(meta.section, meta.menus.main) + meta.menus.main = prep_main_menu(meta.rewrites, meta.section, + meta.menus.main) end if meta.pages then - local pages, categories = organize_subpages(meta.pages) + local pages, categories = organize_subpages(meta.site.url, + meta.output_dir, + meta.file_out, meta.pages) meta.pages = pages meta.categories = categories end -- cgit v1.2.3-54-g00ecf