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
|
/// 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 =
|
let tree =
|
||||||
TreePage::from_iter(
|
TreePage::from_iter(
|
||||||
sack.get_meta::<Wiki>(glob)
|
sack.get_meta::<Wiki>(glob)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(path, meta)| Link {
|
.map(|(path, meta)| Link {
|
||||||
path: Utf8Path::new("/").join(path),
|
path: Utf8Path::new("/").join(path.parent().unwrap()),
|
||||||
name: meta.title.clone(),
|
name: meta.title.clone(),
|
||||||
desc: None,
|
desc: None,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let parts = {
|
||||||
|
let mut parts = sack.path.iter().skip(1).collect::<Vec<_>>();
|
||||||
|
parts.insert(0, "wiki");
|
||||||
|
parts
|
||||||
|
};
|
||||||
|
|
||||||
maud_move!(
|
maud_move!(
|
||||||
h2 .link-tree__heading {
|
h2 .link-tree__heading {
|
||||||
// {pages.chain(x => x.prefix)
|
// {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 {
|
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 subs = {
|
||||||
let mut subs: Vec<_> = tree.subs.iter().collect();
|
let mut subs: Vec<_> = tree.subs.iter().collect();
|
||||||
subs.sort_by(|a, b| a.0.cmp(b.0));
|
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() {
|
@if key == parts[0] && !next.subs.is_empty() {
|
||||||
(show_page_tree_level(next))
|
(show_page_tree_level(next, &parts[1..]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue