diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/metadata_filter.lua | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua index 7039a2c..ebd69f1 100644 --- a/scripts/metadata_filter.lua +++ b/scripts/metadata_filter.lua | |||
| @@ -33,30 +33,6 @@ function table_to_list(t, kv, cmp) | |||
| 33 | return l | 33 | return l |
| 34 | end | 34 | end |
| 35 | 35 | ||
| 36 | function group_by(l, field, insert) | ||
| 37 | insert = insert or function(group, _, item) | ||
| 38 | if not group then | ||
| 39 | group = l:new({ item }) | ||
| 40 | return group | ||
| 41 | end | ||
| 42 | group:insert(item) | ||
| 43 | end | ||
| 44 | |||
| 45 | local groups = {} | ||
| 46 | |||
| 47 | for i = 1, #l do | ||
| 48 | local item = l[i] | ||
| 49 | local f = field(item) | ||
| 50 | |||
| 51 | if f then | ||
| 52 | local out = insert(groups[f], f, item) | ||
| 53 | if out then groups[f] = out end | ||
| 54 | end | ||
| 55 | end | ||
| 56 | |||
| 57 | return groups | ||
| 58 | end | ||
| 59 | |||
| 60 | function make_absolute(rel, base) | 36 | function make_absolute(rel, base) |
| 61 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) | 37 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) |
| 62 | end | 38 | end |
| @@ -67,15 +43,28 @@ function resolve_url(site_url, ref_file, target_file) | |||
| 67 | local ref_base_dir = path.directory(ref_file) | 43 | local ref_base_dir = path.directory(ref_file) |
| 68 | local abs = target_file | 44 | local abs = target_file |
| 69 | local rel = path.make_relative(abs, ref_base_dir, true) | 45 | local rel = path.make_relative(abs, ref_base_dir, true) |
| 46 | local full = (abs[1] == "/" and (site_url .. abs)) or abs | ||
| 70 | 47 | ||
| 71 | return { abs = abs, rel = rel, full = (site_url .. abs) } | 48 | return { abs = abs, rel = rel, full = full } |
| 72 | end | 49 | end |
| 73 | 50 | ||
| 74 | function resolve_layout(layout) | 51 | function resolve_layout(depth) |
| 75 | if layout then | 52 | local layout = "deep_categorized_list" |
| 76 | layout = pandoc.utils.stringify(layout) | 53 | |
| 77 | return { id = layout, ["is_" .. layout] = true } | 54 | if depth == "0" then |
| 55 | layout = "page" | ||
| 56 | elseif depth == "1" then | ||
| 57 | layout = "list" | ||
| 58 | elseif depth == "2" then | ||
| 59 | layout = "categorized_list" | ||
| 78 | end | 60 | end |
| 61 | |||
| 62 | return layout | ||
| 63 | end | ||
| 64 | |||
| 65 | function prep_layout(layout) | ||
| 66 | layout = pandoc.utils.stringify(layout) | ||
| 67 | return { id = layout, ["is_" .. layout] = true } | ||
| 79 | end | 68 | end |
| 80 | 69 | ||
| 81 | function resolve_namespace(namespace) | 70 | function resolve_namespace(namespace) |
| @@ -110,8 +99,10 @@ function process_pages(global, order, pages_by_id) | |||
| 110 | 99 | ||
| 111 | for _, page in pairs(pages_by_id) do | 100 | for _, page in pairs(pages_by_id) do |
| 112 | local p = process(global, page) | 101 | local p = process(global, page) |
| 113 | pages_all:insert(p) | 102 | if not p.unlisted then |
| 114 | if p.date then pages_date_desc:insert(p) end | 103 | pages_all:insert(p) |
| 104 | if p.date then pages_date_desc:insert(p) end | ||
| 105 | end | ||
| 115 | end | 106 | end |
| 116 | 107 | ||
| 117 | pages_all:sort(function(p1, p2) | 108 | pages_all:sort(function(p1, p2) |
| @@ -171,12 +162,27 @@ function titlecase(str) | |||
| 171 | end) | 162 | end) |
| 172 | end | 163 | end |
| 173 | 164 | ||
| 165 | function find_depth(pages) | ||
| 166 | local depth = 0 | ||
| 167 | |||
| 168 | for i = 1, #pages do | ||
| 169 | local p = pages[i] | ||
| 170 | local d = tonumber(p.depth) | ||
| 171 | if d > depth then depth = d end | ||
| 172 | end | ||
| 173 | |||
| 174 | depth = depth + 1 | ||
| 175 | |||
| 176 | return tostring(depth) | ||
| 177 | end | ||
| 178 | |||
| 174 | function process(global, meta) | 179 | function process(global, meta) |
| 175 | meta.namespace = resolve_namespace(meta.namespace) | 180 | meta.namespace = resolve_namespace(meta.namespace) |
| 176 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") | 181 | meta.file_out = pandoc.utils.stringify(meta.file_out):gsub("^out", "") |
| 177 | meta.layout = resolve_layout(meta.layout) | 182 | meta.url = meta.url and pandoc.utils.stringify(meta.url) |
| 178 | meta.url = resolve_url(global.site.url, global.file_out, meta.file_out) | 183 | meta.url = resolve_url(global.site.url, global.file_out, meta.url or meta.file_out) |
| 179 | meta.title = (meta.title and titlecase(pandoc.utils.stringify(meta.title))) or "" | 184 | meta.title = (meta.title and pandoc.utils.stringify(meta.title)) or "" |
| 185 | if meta.titlecase ~= false then meta.title = titlecase(meta.title) end | ||
| 180 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end | 186 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end |
| 181 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end | 187 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end |
| 182 | 188 | ||
| @@ -204,6 +210,8 @@ function process(global, meta) | |||
| 204 | end | 210 | end |
| 205 | 211 | ||
| 206 | meta.pages = process_pages(global, meta.list_order, meta.pages) | 212 | meta.pages = process_pages(global, meta.list_order, meta.pages) |
| 213 | meta.depth = (meta.pages and find_depth(meta.pages.all)) or "0" | ||
| 214 | meta.layout = prep_layout(meta.layout or resolve_layout(meta.depth)) | ||
| 207 | 215 | ||
| 208 | if meta.date then | 216 | if meta.date then |
| 209 | meta.date = format_date(meta.date) | 217 | meta.date = format_date(meta.date) |
