website/src/html/wiki.rs

93 lines
2.4 KiB
Rust
Raw Normal View History

2024-07-03 23:34:31 +02:00
use camino::Utf8PathBuf;
use hayagriva::Library;
2024-04-13 15:26:52 +02:00
use hypertext::{html_elements, maud_move, GlobalAttributes, Renderable};
2024-07-03 23:34:31 +02:00
use serde::Deserialize;
2024-04-21 23:02:30 +02:00
2024-07-03 23:34:31 +02:00
use crate::pipeline::{Content, Sack};
2024-04-28 00:26:19 +02:00
use crate::text::md::Outline;
2024-07-03 23:34:31 +02:00
use crate::{Link, Linkable};
2024-04-21 23:02:30 +02:00
2024-07-03 23:34:31 +02:00
/// Represents a wiki page
#[derive(Deserialize, Debug, Clone)]
pub struct Wiki {
pub title: String,
}
impl Content for Wiki {
fn transform<'f, 'm, 's, 'html, T>(
&'f self,
content: T,
outline: Outline,
sack: &'s Sack,
bib: Option<Vec<String>>,
) -> impl Renderable + 'html
where
'f: 'html,
'm: 'html,
's: 'html,
T: Renderable + 'm {
wiki(self, content, outline, sack, bib)
}
fn as_link(&self, path: Utf8PathBuf) -> Option<Linkable> {
Some(Linkable::Link(Link {
path,
name: self.title.to_owned(),
desc: None,
}))
}
fn parse(data: &str, lib: Option<&Library>) -> (Outline, String, Option<Vec<String>>) {
crate::text::md::parse(data, lib)
}
}
2024-04-21 23:02:30 +02:00
2024-07-03 23:34:31 +02:00
fn wiki<'data, 'html, 'sack, T>(
2024-04-21 11:45:19 +02:00
fm: &'data Wiki,
content: T,
2024-04-22 21:45:53 +02:00
_: Outline,
2024-04-21 23:02:30 +02:00
sack: &'sack Sack,
2024-04-28 00:26:19 +02:00
bib: Option<Vec<String>>,
2024-04-21 11:45:19 +02:00
) -> impl Renderable + 'html
2024-04-13 15:26:52 +02:00
where
2024-04-21 23:02:30 +02:00
'sack: 'html,
2024-04-13 15:26:52 +02:00
'data: 'html,
T: Renderable + 'data
{
let main = maud_move!(
main .wiki-main {
// Slide in/out for mobile
input #wiki-aside-shown type="checkbox" hidden;
aside .wiki-aside {
// Slide button
label .wiki-aside__slider for="wiki-aside-shown" {
img .wiki-icon src="/static/svg/double-arrow.svg" width="24" height="24";
}
// Navigation tree
2024-04-21 23:02:30 +02:00
section .link-tree {
div {
2024-07-03 23:34:31 +02:00
(crate::html::misc::show_page_tree(sack, "wiki/**/*.html"))
2024-04-21 23:02:30 +02:00
}
}
2024-04-13 15:26:52 +02:00
}
article .wiki-article /*class:list={classlist)*/ {
header class="markdown" {
h1 #top { (fm.title.clone()) }
}
section .wiki-article__markdown.markdown {
(content)
}
2024-04-28 00:26:19 +02:00
@if let Some(bib) = bib {
2024-07-03 23:34:31 +02:00
(crate::html::misc::show_bibliography(bib))
2024-04-28 00:26:19 +02:00
}
2024-04-13 15:26:52 +02:00
}
}
);
2024-07-03 23:34:31 +02:00
crate::html::page(&fm.title, main, sack.get_file())
2024-04-13 15:26:52 +02:00
}