collapse side links in wiki

This commit is contained in:
Maciej Jur 2024-09-22 22:49:31 +02:00
parent 22d8866c53
commit de976814f1
Signed by: kamov
GPG key ID: 191CBFF5F72ECAFD
4 changed files with 21 additions and 41 deletions

View file

@ -0,0 +1,3 @@
---
title: Advent of Code 2021
---

View file

@ -0,0 +1,3 @@
---
title: Advent of Code
---

View file

@ -1,35 +0,0 @@
---
title: "Type Challenges"
---
## 4・Pick
Implement the built-in `Pick<T, K>` generic without using it. Constructs a type by picking the set of properties `K` from `T`.
```ts
type MyPick<T, K extends keyof T> = {
[key in K]: k extends keyof T ? T[key] : never;
}
```
## 7・Readonly
Implement the built-in `Readonly<T>` generic without using it. Constructs a type with all properties of T set to readonly, meaning the properties of the constructed type cannot be reassigned.
```ts
type MyReadonly<T> = {
readonly [key in keyof T]: T[key];
}
```
## 11・Tuple to Object
Given an array, transform it into an object type and the key/value must be in the provided array.
```ts
type TupleToObject<T extends readonly (string | number)[]> = {
[val in T[number]]: val;
}
```

View file

@ -78,18 +78,24 @@ impl TreePage {
}
/// Render the page tree
pub(crate) fn show_page_tree(sack: &MySack, glob: &str) -> impl Renderable {
pub(crate) fn show_page_tree<'a>(sack: &'a MySack, glob: &'a str) -> impl Renderable + 'a {
let tree =
TreePage::from_iter(
sack.get_meta::<Wiki>(glob)
.into_iter()
.map(|(path, meta)| Link {
path: Utf8Path::new("/").join(path),
path: Utf8Path::new("/").join(path.parent().unwrap()),
name: meta.title.clone(),
desc: None,
}),
);
let parts = {
let mut parts = sack.path.iter().skip(1).collect::<Vec<_>>();
parts.insert(0, "wiki");
parts
};
maud_move!(
h2 .link-tree__heading {
// {pages.chain(x => x.prefix)
@ -100,12 +106,15 @@ pub(crate) fn show_page_tree(sack: &MySack, glob: &str) -> impl Renderable {
// )}
}
nav .link-tree__nav {
(show_page_tree_level(&tree))
(show_page_tree_level(&tree, &parts))
}
)
}
fn show_page_tree_level(tree: &TreePage) -> impl Renderable + '_ {
fn show_page_tree_level<'a, 'b, 'c>(tree: &'a TreePage, parts: &'a [&str]) -> impl Renderable + 'b
where
'a: 'b,
{
let subs = {
let mut subs: Vec<_> = tree.subs.iter().collect();
subs.sort_by(|a, b| a.0.cmp(b.0));
@ -127,8 +136,8 @@ fn show_page_tree_level(tree: &TreePage) -> impl Renderable + '_ {
}
}
}
@if !next.subs.is_empty() {
(show_page_tree_level(next))
@if key == parts[0] && !next.subs.is_empty() {
(show_page_tree_level(next, &parts[1..]))
}
}
}