120 lines
3.2 KiB
Rust
120 lines
3.2 KiB
Rust
use comrak::nodes::AstNode;
|
|
use maud::{html, Markup, PreEscaped, Render, DOCTYPE};
|
|
use std::str;
|
|
|
|
use crate::{
|
|
page::{Page, COMRAK_OPTIONS},
|
|
string_writer::StringWriter,
|
|
};
|
|
|
|
struct Comrak<'a>(&'a AstNode<'a>);
|
|
|
|
impl<'a> Render for Comrak<'a> {
|
|
fn render_to(&self, buffer: &mut String) {
|
|
comrak::format_html(self.0, &COMRAK_OPTIONS, &mut StringWriter(buffer)).unwrap();
|
|
}
|
|
}
|
|
|
|
/// Hack! Comrak wraps a single line of input in `<p>` tags, which is great in
|
|
/// general but not suitable for links in the navigation bar.
|
|
struct ComrakRemovePTags<'a>(&'a AstNode<'a>);
|
|
|
|
impl<'a> Render for ComrakRemovePTags<'a> {
|
|
fn render(&self) -> Markup {
|
|
let mut buffer = String::new();
|
|
comrak::format_html(self.0, &COMRAK_OPTIONS, &mut StringWriter(&mut buffer)).unwrap();
|
|
assert!(buffer.starts_with("<p>") && buffer.ends_with("</p>\n"));
|
|
PreEscaped(
|
|
buffer
|
|
.trim_start_matches("<p>")
|
|
.trim_end_matches("</p>\n")
|
|
.to_string(),
|
|
)
|
|
}
|
|
}
|
|
|
|
struct ComrakText<'a>(&'a AstNode<'a>);
|
|
|
|
impl<'a> Render for ComrakText<'a> {
|
|
fn render_to(&self, buffer: &mut String) {
|
|
comrak::format_commonmark(self.0, &COMRAK_OPTIONS, &mut StringWriter(buffer)).unwrap();
|
|
}
|
|
}
|
|
|
|
pub fn main<'a>(
|
|
slug: &str,
|
|
page: Page<'a>,
|
|
nav: &[(&str, &'a AstNode<'a>)],
|
|
version: &str,
|
|
hash: &str,
|
|
) -> Markup {
|
|
html! {
|
|
(DOCTYPE)
|
|
meta charset="utf-8";
|
|
title {
|
|
@if let Some(title) = page.title {
|
|
(ComrakText(title))
|
|
" \u{2013} "
|
|
}
|
|
"Maud, a macro for writing HTML"
|
|
}
|
|
link rel="stylesheet" href="styles.css";
|
|
meta name="theme-color" content="#808";
|
|
meta name="viewport" content="width=device-width";
|
|
|
|
header {
|
|
h1 {
|
|
a href="." {
|
|
"maud"
|
|
}
|
|
}
|
|
}
|
|
|
|
nav {
|
|
ul {
|
|
@for &(other_slug, other_title) in nav {
|
|
li {
|
|
@if other_slug == slug {
|
|
b {
|
|
(ComrakRemovePTags(other_title))
|
|
}
|
|
} @else {
|
|
a href={ (other_slug) ".html" } {
|
|
(ComrakRemovePTags(other_title))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ul {
|
|
li {
|
|
a href="https://docs.rs/maud/" {
|
|
"API documentation"
|
|
}
|
|
}
|
|
li {
|
|
a href="https://github.com/lambda-fairy/maud" {
|
|
"GitHub"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
main {
|
|
@if let Some(title) = page.title {
|
|
h2 {
|
|
(Comrak(title))
|
|
}
|
|
}
|
|
(Comrak(page.content))
|
|
}
|
|
|
|
footer {
|
|
p {
|
|
a href={ "https://github.com/lambda-fairy/maud/tree/" (hash) } {
|
|
(version)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|