summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2021-01-07 08:50:48 +0100
committerVolpeon <git@volpeon.ink>2021-01-07 08:50:48 +0100
commitad478954cf77842364d03e1d5ee85e366e699ee7 (patch)
tree90359dfec83694a758878b37510d9dca1493ef43 /scripts
parentImproved subpage organization code in metadata filter (diff)
downloadvolpeon.ink-ad478954cf77842364d03e1d5ee85e366e699ee7.tar.gz
volpeon.ink-ad478954cf77842364d03e1d5ee85e366e699ee7.tar.bz2
volpeon.ink-ad478954cf77842364d03e1d5ee85e366e699ee7.zip
Improved general structure, resolve category name in metadata filter, added hideable nav items, added header for page layout
Diffstat (limited to 'scripts')
-rw-r--r--scripts/metadata_filter.lua108
1 files changed, 62 insertions, 46 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua
index d6379b9..4abb716 100644
--- a/scripts/metadata_filter.lua
+++ b/scripts/metadata_filter.lua
@@ -1,13 +1,9 @@
1function format_date(date) 1function format_date(date)
2 if date == nil then 2 if date == nil then return date end
3 return date
4 end
5 3
6 date = pandoc.utils.normalize_date(pandoc.utils.stringify(date)) 4 date = pandoc.utils.normalize_date(pandoc.utils.stringify(date))
7 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)")
8 if year == nil then 6 if year == nil then return nil end
9 return nil
10 end
11 7
12 local time = os.time({ 8 local time = os.time({
13 year = tonumber(year), 9 year = tonumber(year),
@@ -26,15 +22,10 @@ function table_to_list(t, cmp)
26 local l = pandoc.List() 22 local l = pandoc.List()
27 23
28 for key, value in pairs(t) do 24 for key, value in pairs(t) do
29 l:insert(pandoc.MetaMap({ 25 l:insert(pandoc.MetaMap({key = key, value = value}))
30 key = key,
31 value = value
32 }))
33 end 26 end
34 27
35 l:sort(cmp or function(i1, i2) 28 l:sort(cmp or function(i1, i2) return i1.key < i2.key end)
36 return i1.key < i2.key
37 end)
38 29
39 return l 30 return l
40end 31end
@@ -56,9 +47,7 @@ function group_by(l, field, insert)
56 47
57 if f ~= nil then 48 if f ~= nil then
58 local out = insert(groups[f], f, item) 49 local out = insert(groups[f], f, item)
59 if out ~= nil then 50 if out ~= nil then groups[f] = out end
60 groups[f] = out
61 end
62 end 51 end
63 end 52 end
64 53
@@ -68,9 +57,7 @@ end
68function splitstr(input, sep) 57function splitstr(input, sep)
69 sep = sep or "%s" 58 sep = sep or "%s"
70 local t = {} 59 local t = {}
71 for str in input:gmatch("([^" .. sep .. "]+)") do 60 for str in input:gmatch("([^" .. sep .. "]+)") do table.insert(t, str) end
72 table.insert(t, str)
73 end
74 return t 61 return t
75end 62end
76 63
@@ -98,9 +85,7 @@ function relative_to(dir, target)
98 path = path .. (path == "" and "" or "/") .. target[i] 85 path = path .. (path == "" and "" or "/") .. target[i]
99 end 86 end
100 elseif #dir > #target then 87 elseif #dir > #target then
101 for i = #target + 1, #dir do 88 for _ = #target + 1, #dir do path = "../" .. path end
102 path = "../" .. path
103 end
104 end 89 end
105 90
106 return path 91 return path
@@ -123,6 +108,16 @@ function resolve_url(page_type, site_url, content_dir, base_dir, cur_file)
123 }) 108 })
124end 109end
125 110
111function resolve_layout(layout)
112 if layout then
113 layout = pandoc.utils.stringify(layout)
114 return pandoc.MetaMap({
115 id = pandoc.MetaString(layout),
116 ["is_" .. layout] = pandoc.MetaBool(true)
117 })
118 end
119end
120
126function resolve_section(abs_url) 121function resolve_section(abs_url)
127 local section = abs_url:match("^/(.-)[/.]") or "index" 122 local section = abs_url:match("^/(.-)[/.]") or "index"
128 return pandoc.MetaMap({ 123 return pandoc.MetaMap({
@@ -131,25 +126,48 @@ function resolve_section(abs_url)
131 }) 126 })
132end 127end
133 128
134function organize_subpages(site_url, content_dir, base_dir, pages, categories) 129function resolve_category(categories, category)
135 local grouped_pages = group_by(pages, function(p) 130 if categories and category then
136 return not p.date 131 category = pandoc.utils.stringify(category)
132 return pandoc.MetaMap({
133 id = pandoc.MetaString(category),
134 name = pandoc.MetaString(categories[category] or category)
135 })
136 end
137end
138
139function create_main_menu_state(section, main_menu)
140 for i = 1, #main_menu do
141 local item = main_menu[i]
142 local active = pandoc.utils.stringify(item.id) == section.id
143 item.active = pandoc.MetaBool(active)
144 end
145
146 return main_menu:filter(function(item)
147 return not item.hidden or item.active
137 end) 148 end)
149end
150
151function organize_subpages(pages)
152 local grouped_pages = group_by(pages, function(p) return not p.date end)
138 153
139 local pages_undated = grouped_pages[true] or pandoc.MetaList({}) 154 local pages_undated = grouped_pages[true] or pandoc.MetaList({})
140 pages_undated:sort(function(p1, p2) 155 pages_undated:sort(function(p1, p2)
141 return pandoc.utils.stringify(p1.title) < pandoc.utils.stringify(p2.title) 156 return pandoc.utils.stringify(p1.title) <
157 pandoc.utils.stringify(p2.title)
142 end) 158 end)
143 159
144 local pages_dated = grouped_pages[false] or pandoc.MetaList({}) 160 local pages_dated = grouped_pages[false] or pandoc.MetaList({})
145 pages_dated:sort(function(p1, p2) 161 pages_dated:sort(function(p1, p2)
146 return pandoc.utils.stringify(p1.date.yyyy_mm_dd) > pandoc.utils.stringify(p2.date.yyyy_mm_dd) 162 return pandoc.utils.stringify(p1.date.yyyy_mm_dd) >
163 pandoc.utils.stringify(p2.date.yyyy_mm_dd)
147 end) 164 end)
148 165
149 local pages_by_year = group_by(pages_dated, function(p) 166 local pages_by_year = group_by(pages_dated, function(p)
150 return pandoc.utils.stringify(p.date.yyyy) 167 return pandoc.utils.stringify(p.date.yyyy)
151 end) 168 end)
152 pages_by_year = pandoc.MetaList(table_to_list(pages_by_year, function(i1, i2) 169 pages_by_year = pandoc.MetaList(table_to_list(pages_by_year,
170 function(i1, i2)
153 return i1.key > i2.key 171 return i1.key > i2.key
154 end)) 172 end))
155 173
@@ -161,13 +179,10 @@ function organize_subpages(site_url, content_dir, base_dir, pages, categories)
161 }) 179 })
162 180
163 local categories_data = group_by(pages_dated, function(p) 181 local categories_data = group_by(pages_dated, function(p)
164 return p.category and pandoc.utils.stringify(p.category) 182 return p.category and pandoc.utils.stringify(p.category.id)
165 end, function(stats, category) 183 end, function(stats, _, p)
166 if not stats then 184 if not stats then
167 return { 185 return {name = pandoc.MetaString(p.category.name), count = 1}
168 name = pandoc.MetaString(categories[category] or category),
169 count = 1
170 }
171 else 186 else
172 stats.count = stats.count + 1 187 stats.count = stats.count + 1
173 end 188 end
@@ -175,7 +190,8 @@ function organize_subpages(site_url, content_dir, base_dir, pages, categories)
175 categories_data = pandoc.MetaList(table_to_list(categories_data)) 190 categories_data = pandoc.MetaList(table_to_list(categories_data))
176 191
177 for i = 1, #categories_data do 192 for i = 1, #categories_data do
178 categories_data[i].value.count = pandoc.MetaString(("%d"):format(categories_data[i].value.count)) 193 categories_data[i].value.count =
194 pandoc.MetaString(("%d"):format(categories_data[i].value.count))
179 end 195 end
180 196
181 return pages_data, categories_data 197 return pages_data, categories_data
@@ -188,6 +204,8 @@ function Meta(meta)
188 meta.base_dir = meta.base_file:gsub("^(.*)/.-$", "%1") 204 meta.base_dir = meta.base_file:gsub("^(.*)/.-$", "%1")
189 meta.page_type = meta.page_type or "page" 205 meta.page_type = meta.page_type or "page"
190 206
207 meta.layout = resolve_layout(meta.layout)
208
191 meta.date = format_date(meta.date) 209 meta.date = format_date(meta.date)
192 if meta.last_update ~= nil then 210 if meta.last_update ~= nil then
193 meta.last_update = format_date(meta.last_update) 211 meta.last_update = format_date(meta.last_update)
@@ -197,28 +215,26 @@ function Meta(meta)
197 215
198 if meta.page_type == "feed" then 216 if meta.page_type == "feed" then
199 meta.page = pandoc.MetaMap({ 217 meta.page = pandoc.MetaMap({
200 url = resolve_url("page", meta.site.url, meta.content_dir, meta.base_dir, meta.file) 218 url = resolve_url("page", meta.site.url, meta.content_dir,
219 meta.base_dir, meta.file)
201 }) 220 })
202 end 221 end
203 222
204 meta.url = resolve_url(meta.page_type, meta.site.url, meta.content_dir, meta.base_dir, meta.file) 223 meta.url = resolve_url(meta.page_type, meta.site.url, meta.content_dir,
224 meta.base_dir, meta.file)
205 meta.section = resolve_section(meta.url.abs) 225 meta.section = resolve_section(meta.url.abs)
206 meta.categories = meta.categories[meta.section.id] 226 meta.category = resolve_category(meta.categories[meta.section.id],
227 meta.category)
228 meta.categories = nil
207 229
208 if meta.menus and meta.menus.main then 230 if meta.menus and meta.menus.main then
209 for i = 1, #meta.menus.main do 231 meta.menus.main = create_main_menu_state(meta.section, meta.menus.main)
210 local item = meta.menus.main[i]
211 item.active = pandoc.MetaBool(pandoc.utils.stringify(item.id) == meta.section.id)
212 end
213 end 232 end
214 233
215 if meta.pages then 234 if meta.pages then
216 local pages, categories = organize_subpages(meta.site.url, meta.content_dir, meta.base_dir, meta.pages, 235 local pages, categories = organize_subpages(meta.pages)
217 meta.categories)
218 meta.pages = pages 236 meta.pages = pages
219 meta.categories = categories 237 meta.categories = categories
220 else
221 meta.categories = nil
222 end 238 end
223 239
224 return meta 240 return meta