collapse side links in wiki
This commit is contained in:
parent
22d8866c53
commit
de976814f1
3
content/wiki/aoc/2021/index.md
Normal file
3
content/wiki/aoc/2021/index.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: Advent of Code 2021
|
||||
---
|
3
content/wiki/aoc/index.md
Normal file
3
content/wiki/aoc/index.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: Advent of Code
|
||||
---
|
|
@ -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;
|
||||
}
|
||||
```
|
|
@ -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..]))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue