diff options
| -rw-r--r-- | assets/css/components/_card.scss | 5 | ||||
| -rw-r--r-- | content/notebook/index.md | 2 | ||||
| -rw-r--r-- | content/notebook/pages/about-the-notebook.md | 5 | ||||
| -rw-r--r-- | content/notebook/pages/index.md (renamed from content/notebook/general/index.md) | 3 | ||||
| -rw-r--r-- | scripts/metadata_filter.lua | 211 | ||||
| -rw-r--r-- | templates/layouts/categorized_list.html | 6 |
6 files changed, 95 insertions, 137 deletions
diff --git a/assets/css/components/_card.scss b/assets/css/components/_card.scss index 6c15145..d317d1f 100644 --- a/assets/css/components/_card.scss +++ b/assets/css/components/_card.scss | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | --colors: ( | 17 | --colors: ( |
| 18 | --bg: fn.global-color(--bg-hi2), | 18 | --bg: fn.global-color(--bg-hi2), |
| 19 | --fg: fn.global-color(--fg), | 19 | --fg: fn.global-color(--fg), |
| 20 | --unread: fn.global-color(--obj-hi), | 20 | --unread: fn.global-color(--obj), |
| 21 | --border: fn.global-color(--obj-hi), | 21 | --border: fn.global-color(--obj), |
| 22 | --hover: ( | 22 | --hover: ( |
| 23 | --bg: fn.global-color(--fg-lo), | 23 | --bg: fn.global-color(--fg-lo), |
| 24 | --fg: fn.global-color(--bg-hi2), | 24 | --fg: fn.global-color(--bg-hi2), |
| @@ -30,7 +30,6 @@ | |||
| 30 | --colors: ( | 30 | --colors: ( |
| 31 | --bg: fn.global-color(--obj-hi), | 31 | --bg: fn.global-color(--obj-hi), |
| 32 | --unread: fn.global-color(--bg), | 32 | --unread: fn.global-color(--bg), |
| 33 | --border: fn.global-color(--obj-hi), | ||
| 34 | ) | 33 | ) |
| 35 | ), 'colors-dark'); | 34 | ), 'colors-dark'); |
| 36 | 35 | ||
diff --git a/content/notebook/index.md b/content/notebook/index.md index f1b8d27..77fed0b 100644 --- a/content/notebook/index.md +++ b/content/notebook/index.md | |||
| @@ -6,4 +6,4 @@ list_order: date_desc | |||
| 6 | feed: true | 6 | feed: true |
| 7 | --- | 7 | --- |
| 8 | 8 | ||
| 9 | Random thoughts, useless stuff, ordered and unordered. | 9 | Random thoughts, ordered and unordered. |
diff --git a/content/notebook/pages/about-the-notebook.md b/content/notebook/pages/about-the-notebook.md new file mode 100644 index 0000000..96fc596 --- /dev/null +++ b/content/notebook/pages/about-the-notebook.md | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | --- | ||
| 2 | title: What's the Notebook? | ||
| 3 | pinned: true | ||
| 4 | --- | ||
| 5 | |||
diff --git a/content/notebook/general/index.md b/content/notebook/pages/index.md index 9f3ed01..b32e28a 100644 --- a/content/notebook/general/index.md +++ b/content/notebook/pages/index.md | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | --- | 1 | --- |
| 2 | title: General | 2 | title: Pages |
| 3 | position: 1 | 3 | position: 1 |
| 4 | list_read_indicators: true | 4 | list_read_indicators: true |
| 5 | feed: true | 5 | feed: true |
| 6 | unlisted: true | ||
| 7 | --- | 6 | --- |
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua index fcceffa..314f2b0 100644 --- a/scripts/metadata_filter.lua +++ b/scripts/metadata_filter.lua | |||
| @@ -57,15 +57,6 @@ function slug(str) | |||
| 57 | return str:lower():gsub("[^ a-z]", ""):gsub("[ ]+", "-") | 57 | return str:lower():gsub("[^ a-z]", ""):gsub("[ ]+", "-") |
| 58 | end | 58 | end |
| 59 | 59 | ||
| 60 | function file_exists(name) | ||
| 61 | local f = io.open(name, "r") | ||
| 62 | if f ~= nil then | ||
| 63 | io.close(f) | ||
| 64 | return true | ||
| 65 | end | ||
| 66 | return false | ||
| 67 | end | ||
| 68 | |||
| 69 | function format_date(date) | 60 | function format_date(date) |
| 70 | if not date then return date end | 61 | if not date then return date end |
| 71 | 62 | ||
| @@ -85,20 +76,6 @@ function format_date(date) | |||
| 85 | } | 76 | } |
| 86 | end | 77 | end |
| 87 | 78 | ||
| 88 | function table_to_list(t, kv, cmp) | ||
| 89 | local l = pandoc.List() | ||
| 90 | |||
| 91 | if kv then | ||
| 92 | for key, value in pairs(t) do l:insert({ key = key, value = value }) end | ||
| 93 | else | ||
| 94 | for _, value in pairs(t) do l:insert(value) end | ||
| 95 | end | ||
| 96 | |||
| 97 | l:sort(cmp or function(i1, i2) return i1.key < i2.key end) | ||
| 98 | |||
| 99 | return l | ||
| 100 | end | ||
| 101 | |||
| 102 | function make_absolute(rel, base) | 79 | function make_absolute(rel, base) |
| 103 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) | 80 | return path.is_absolute(rel) and rel or path.join({ path.directory(base), rel }) |
| 104 | end | 81 | end |
| @@ -117,9 +94,9 @@ end | |||
| 117 | function resolve_layout(depth) | 94 | function resolve_layout(depth) |
| 118 | local layout = "categorized_list" | 95 | local layout = "categorized_list" |
| 119 | 96 | ||
| 120 | if depth == "0" then | 97 | if depth == 0 then |
| 121 | layout = "page" | 98 | layout = "page" |
| 122 | elseif depth == "1" then | 99 | elseif depth == 1 then |
| 123 | layout = "list" | 100 | layout = "list" |
| 124 | end | 101 | end |
| 125 | 102 | ||
| @@ -180,124 +157,98 @@ end | |||
| 180 | function find_depth(pages) | 157 | function find_depth(pages) |
| 181 | local depth = 0 | 158 | local depth = 0 |
| 182 | 159 | ||
| 183 | for i = 1, #pages do | 160 | if pages then |
| 184 | local p = pages[i] | 161 | for i = 1, #pages.all do |
| 185 | local d = tonumber(p.depth) | 162 | local p = pages.all[i] |
| 186 | if d > depth then depth = d end | 163 | local d = tonumber(p.depth) |
| 164 | if d > depth then depth = d end | ||
| 165 | end | ||
| 166 | |||
| 167 | depth = depth + 1 | ||
| 187 | end | 168 | end |
| 188 | 169 | ||
| 189 | depth = depth + 1 | 170 | return depth |
| 171 | end | ||
| 172 | |||
| 173 | function d1_page_to_list_item(meta, p) | ||
| 174 | return { | ||
| 175 | title = p.title, | ||
| 176 | subtitle = p.subtitle, | ||
| 177 | date = p.date, | ||
| 178 | position = p.position, | ||
| 179 | url = p.url, | ||
| 180 | slug = p.slug, | ||
| 181 | thumbnail = p.thumbnail, | ||
| 182 | icon = p.icon or meta.icon, | ||
| 183 | post_icon = p.post_icon or meta.list_post_icon, | ||
| 184 | indicator = meta.list_read_indicators, | ||
| 185 | } | ||
| 186 | end | ||
| 187 | |||
| 188 | function d2_page_to_list_item(meta, cat, p) | ||
| 189 | return { | ||
| 190 | title = p.title, | ||
| 191 | subtitle = p.subtitle, | ||
| 192 | date = p.date, | ||
| 193 | position = p.position, | ||
| 194 | url = p.url, | ||
| 195 | slug = p.slug, | ||
| 196 | thumbnail = p.thumbnail, | ||
| 197 | icon = p.icon or cat.icon, | ||
| 198 | post_icon = p.post_icon or cat.list_post_icon or meta.list_post_icon, | ||
| 199 | indicator = cat.list_read_indicators, | ||
| 200 | } | ||
| 201 | end | ||
| 202 | |||
| 203 | function cat_to_list_cat(cat, allItems) | ||
| 204 | local limit = cat.list_limit or 9999 | ||
| 205 | local items = allItems:take(limit) | ||
| 206 | local omitted = #allItems - #items | ||
| 190 | 207 | ||
| 191 | return tostring(depth) | 208 | return { |
| 209 | title = cat.title, | ||
| 210 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
| 211 | (not cat.no_description and cat.content), | ||
| 212 | url = cat.url, | ||
| 213 | slug = cat.slug, | ||
| 214 | layout = cat.list_layout, | ||
| 215 | items = items, | ||
| 216 | total = tostring(#allItems), | ||
| 217 | omitted = omitted ~= 0 and tostring(omitted), | ||
| 218 | } | ||
| 192 | end | 219 | end |
| 193 | 220 | ||
| 194 | function generate_list(meta) | 221 | function generate_list(meta) |
| 195 | if not meta.pages then return nil end | 222 | if meta.depth < 1 then return nil end |
| 196 | 223 | ||
| 197 | if meta.depth == "1" then | 224 | if meta.depth == 1 then |
| 198 | return meta.pages.all:map(function(p) | 225 | return meta.pages.all:map(function(p) return d1_page_to_list_item(meta, p) end) |
| 199 | return { | 226 | end |
| 200 | title = p.title, | 227 | |
| 201 | subtitle = p.subtitle, | 228 | if meta.depth == 2 then |
| 202 | date = p.date, | ||
| 203 | position = p.position, | ||
| 204 | url = p.url, | ||
| 205 | slug = p.slug, | ||
| 206 | thumbnail = p.thumbnail, | ||
| 207 | icon = p.icon or meta.icon, | ||
| 208 | post_icon = p.post_icon or meta.list_post_icon, | ||
| 209 | indicator = meta.list_read_indicators, | ||
| 210 | } | ||
| 211 | end) | ||
| 212 | elseif meta.depth == "2" then | ||
| 213 | return meta.pages.all | 229 | return meta.pages.all |
| 214 | :map(function(cat) | 230 | :map(function(cat) |
| 215 | local limit = (cat.list_limit and tonumber(pandoc.utils.stringify(cat.list_limit))) or | 231 | local allItems = ((cat.pages and cat.pages.all) or pandoc.List()) |
| 216 | 9999 | 232 | :map(function(p) return d2_page_to_list_item(meta, cat, p) end) |
| 217 | local allItems = ((cat.pages and cat.pages.all) or pandoc.List()):map(function(p) | ||
| 218 | return { | ||
| 219 | title = p.title, | ||
| 220 | subtitle = p.subtitle, | ||
| 221 | date = p.date, | ||
| 222 | position = p.position, | ||
| 223 | url = p.url, | ||
| 224 | slug = p.slug, | ||
| 225 | thumbnail = p.thumbnail, | ||
| 226 | icon = p.icon or cat.icon, | ||
| 227 | post_icon = p.post_icon or cat.list_post_icon or meta.list_post_icon, | ||
| 228 | indicator = cat.list_read_indicators, | ||
| 229 | } | ||
| 230 | end) | ||
| 231 | local items = allItems:take(limit) | ||
| 232 | local omitted = #allItems - #items | ||
| 233 | 233 | ||
| 234 | return { | 234 | return cat_to_list_cat(cat, allItems) |
| 235 | title = cat.title, | ||
| 236 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
| 237 | (not cat.no_description and cat.content), | ||
| 238 | url = cat.url, | ||
| 239 | slug = cat.slug, | ||
| 240 | layout = cat.list_layout, | ||
| 241 | items = items, | ||
| 242 | total = tostring(#allItems), | ||
| 243 | omitted = omitted ~= 0 and tostring(omitted), | ||
| 244 | } | ||
| 245 | end) | 235 | end) |
| 246 | :filter(function(cat) return #cat.items ~= 0 end) | 236 | :filter(function(cat) return #cat.items ~= 0 end) |
| 247 | elseif meta.depth == "3" then | 237 | end |
| 238 | |||
| 239 | if meta.depth == 3 then | ||
| 248 | return meta.pages.all | 240 | return meta.pages.all |
| 249 | :map(function(cat) | 241 | :map(function(cat) |
| 250 | local limit = (cat.list_limit and tonumber(pandoc.utils.stringify(cat.list_limit))) or | 242 | local allItems = (cat.pages and cat.pages.all or pandoc.List()):flatMap(function(c) |
| 251 | 9999 | 243 | if c.pages then |
| 252 | local allItems = (cat.pages and cat.pages.all or pandoc.List()) | 244 | return c.pages.all:map(function(p) return d2_page_to_list_item(cat, c, p) end) |
| 253 | :flatMap(function(c) | 245 | else |
| 254 | if c.pages then | 246 | return pandoc.List({ d1_page_to_list_item(cat, c) }) |
| 255 | return c.pages.all:map(function(p) | 247 | end |
| 256 | return { | 248 | end) |
| 257 | title = p.title, | ||
| 258 | subtitle = p.subtitle, | ||
| 259 | date = p.date, | ||
| 260 | position = p.position, | ||
| 261 | category = c.title, | ||
| 262 | url = p.url, | ||
| 263 | slug = p.slug, | ||
| 264 | thumbnail = p.thumbnail, | ||
| 265 | icon = p.icon or c.icon, | ||
| 266 | post_icon = p.post_icon or c.list_post_icon or cat.list_post_icon, | ||
| 267 | indicator = c.list_read_indicators, | ||
| 268 | } | ||
| 269 | end) | ||
| 270 | else | ||
| 271 | local l = pandoc.List() | ||
| 272 | l:insert({ | ||
| 273 | title = c.title, | ||
| 274 | subtitle = c.subtitle, | ||
| 275 | date = c.date, | ||
| 276 | position = c.position, | ||
| 277 | url = c.url, | ||
| 278 | slug = c.slug, | ||
| 279 | icon = c.icon or cat.icon, | ||
| 280 | post_icon = c.post_icon or cat.list_post_icon, | ||
| 281 | indicator = cat.list_read_indicators, | ||
| 282 | }) | ||
| 283 | return l | ||
| 284 | end | ||
| 285 | end) | ||
| 286 | allItems:sort(page_sort(cat.list_order)) | 249 | allItems:sort(page_sort(cat.list_order)) |
| 287 | local items = allItems:take(limit) | ||
| 288 | local omitted = #allItems - #items | ||
| 289 | 250 | ||
| 290 | return { | 251 | return cat_to_list_cat(cat, allItems) |
| 291 | title = cat.title, | ||
| 292 | description = (cat.description and pandoc.MetaBlocks(pandoc.Para(cat.description))) or | ||
| 293 | (not cat.no_description and cat.content), | ||
| 294 | url = cat.url, | ||
| 295 | slug = cat.slug, | ||
| 296 | layout = cat.list_layout, | ||
| 297 | items = items, | ||
| 298 | total = tostring(#allItems), | ||
| 299 | omitted = omitted ~= 0 and tostring(omitted), | ||
| 300 | } | ||
| 301 | end) | 252 | end) |
| 302 | :filter(function(cat) return #cat.items ~= 0 end) | 253 | :filter(function(cat) return #cat.items ~= 0 end) |
| 303 | end | 254 | end |
| @@ -313,6 +264,7 @@ function process(global, meta) | |||
| 313 | meta.slug = slug(meta.title) | 264 | meta.slug = slug(meta.title) |
| 314 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end | 265 | if meta.list_order then meta.list_order = pandoc.utils.stringify(meta.list_order) end |
| 315 | meta.list_layout = meta.list_layout and prep_layout(meta.list_layout) | 266 | meta.list_layout = meta.list_layout and prep_layout(meta.list_layout) |
| 267 | if meta.list_limit then meta.list_limit = tonumber(pandoc.utils.stringify(meta.list_limit)) end | ||
| 316 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end | 268 | if meta.position then meta.position = pandoc.utils.stringify(meta.position) end |
| 317 | 269 | ||
| 318 | if meta.feed then | 270 | if meta.feed then |
| @@ -340,9 +292,8 @@ function process(global, meta) | |||
| 340 | end | 292 | end |
| 341 | 293 | ||
| 342 | meta.pages = process_pages(global, meta.list_order, meta.pages) | 294 | meta.pages = process_pages(global, meta.list_order, meta.pages) |
| 343 | meta.depth = (meta.pages and find_depth(meta.pages.all)) or "0" | 295 | meta.depth = find_depth(meta.pages) |
| 344 | meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or | 296 | meta.layout = prep_layout(meta.layout or (meta.redirect and "redirect") or resolve_layout(meta.depth)) |
| 345 | resolve_layout(meta.depth)) | ||
| 346 | 297 | ||
| 347 | if meta.date then | 298 | if meta.date then |
| 348 | meta.date = format_date(meta.date) | 299 | meta.date = format_date(meta.date) |
diff --git a/templates/layouts/categorized_list.html b/templates/layouts/categorized_list.html index 68decf6..e8466f7 100644 --- a/templates/layouts/categorized_list.html +++ b/templates/layouts/categorized_list.html | |||
| @@ -19,7 +19,11 @@ $body$ | |||
| 19 | <section> | 19 | <section> |
| 20 | <header class="l-card-list__header"> | 20 | <header class="l-card-list__header"> |
| 21 | <h2 class="s-invisible-links u-mt-0" id="$it.slug$"> | 21 | <h2 class="s-invisible-links u-mt-0" id="$it.slug$"> |
| 22 | <a href="$it.url.rel$">$it.title$</a> | 22 | $if(it.url)$ |
| 23 | <a href="$it.url.rel$">$it.title$</a> | ||
| 24 | $else$ | ||
| 25 | $it.title$ | ||
| 26 | $endif$ | ||
| 23 | </h2> | 27 | </h2> |
| 24 | $if(it.description)$ | 28 | $if(it.description)$ |
| 25 | <div class="s-small s-colored-links">$it.description$</div> | 29 | <div class="s-small s-colored-links">$it.description$</div> |
