diff options
Diffstat (limited to 'docs/src')
| -rw-r--r-- | docs/src/html.rs | 41 | ||||
| -rw-r--r-- | docs/src/lib.rs | 49 |
2 files changed, 52 insertions, 38 deletions
diff --git a/docs/src/html.rs b/docs/src/html.rs index d702d115..c9ed7a7f 100644 --- a/docs/src/html.rs +++ b/docs/src/html.rs @@ -26,9 +26,11 @@ pub struct Html { #[serde(skip)] md: String, #[serde(skip)] - description: Option<EcoString>, - #[serde(skip)] outline: Vec<OutlineItem>, + #[serde(skip)] + title: Option<EcoString>, + #[serde(skip)] + description: Option<EcoString>, } impl Html { @@ -37,8 +39,9 @@ impl Html { Self { md: String::new(), raw, - description: None, outline: vec![], + title: None, + description: None, } } @@ -47,10 +50,12 @@ impl Html { pub fn markdown(resolver: &dyn Resolver, md: &str, nesting: Option<usize>) -> Self { let mut text = md; let mut description = None; + let mut title = None; let document = YamlFrontMatter::parse::<Metadata>(md); if let Ok(document) = &document { text = &document.content; - description = Some(document.metadata.description.clone()) + title = document.metadata.title.clone(); + description = document.metadata.description.clone(); } let options = md::Options::ENABLE_TABLES @@ -97,8 +102,9 @@ impl Html { Html { md: text.into(), raw, - description, outline: handler.outline, + title, + description, } } @@ -112,23 +118,25 @@ impl Html { &self.md } + /// The outline of the HTML. + pub fn outline(&self) -> Vec<OutlineItem> { + self.outline.clone() + } + /// The title of the HTML. /// /// Returns `None` if the HTML doesn't start with an `h1` tag. pub fn title(&self) -> Option<&str> { - let mut s = Scanner::new(&self.raw); - s.eat_if("<h1").then(|| { - s.eat_until('>'); - s.eat_if('>'); - s.eat_until("</h1>") + self.title.as_deref().or_else(|| { + let mut s = Scanner::new(&self.raw); + s.eat_if("<h1").then(|| { + s.eat_until('>'); + s.eat_if('>'); + s.eat_until("</h1>") + }) }) } - /// The outline of the HTML. - pub fn outline(&self) -> Vec<OutlineItem> { - self.outline.clone() - } - /// The description from the front matter. pub fn description(&self) -> Option<EcoString> { self.description.clone() @@ -144,7 +152,8 @@ impl Debug for Html { /// Front matter metadata. #[derive(Deserialize)] struct Metadata { - description: EcoString, + title: Option<EcoString>, + description: Option<EcoString>, } struct Handler<'a> { diff --git a/docs/src/lib.rs b/docs/src/lib.rs index 4ee6d50d..a30ed088 100644 --- a/docs/src/lib.rs +++ b/docs/src/lib.rs @@ -91,8 +91,7 @@ pub fn provide(resolver: &dyn Resolver) -> Vec<PageModel> { tutorial_pages(resolver), reference_pages(resolver), guide_pages(resolver), - packages_page(resolver), - md_page(resolver, base, load!("changelog.md")), + changelog_pages(resolver), ] } @@ -120,11 +119,11 @@ pub trait Resolver { fn md_page(resolver: &dyn Resolver, parent: &str, md: &str) -> PageModel { assert!(parent.starts_with('/') && parent.ends_with('/')); let html = Html::markdown(resolver, md, Some(0)); - let title: EcoString = html.title().expect("chapter lacks a title").into(); + let title = html.title().expect("chapter lacks a title"); PageModel { - route: eco_format!("{parent}{}/", urlify(&title)), - title, - description: html.description().unwrap(), + route: eco_format!("{parent}{}/", urlify(title)), + title: title.into(), + description: html.description().expect("chapter lacks a description"), part: None, outline: html.outline(), body: BodyModel::Html(html), @@ -179,21 +178,27 @@ fn guide_pages(resolver: &dyn Resolver) -> PageModel { page } -/// Build the packages section. -fn packages_page(resolver: &dyn Resolver) -> PageModel { - PageModel { - route: eco_format!("{}packages/", resolver.base()), - title: "Packages".into(), - description: "Packages for Typst.".into(), - part: None, - outline: vec![], - body: BodyModel::Packages(Html::markdown( - resolver, - load!("reference/packages.md"), - Some(1), - )), - children: vec![], - } +/// Build the changelog section. +fn changelog_pages(resolver: &dyn Resolver) -> PageModel { + let mut page = md_page(resolver, resolver.base(), load!("changelog/welcome.md")); + let base = format!("{}changelog/", resolver.base()); + page.children = vec![ + md_page(resolver, &base, load!("changelog/unreleased.md")), + md_page(resolver, &base, load!("changelog/0.11.1.md")), + md_page(resolver, &base, load!("changelog/0.11.0.md")), + md_page(resolver, &base, load!("changelog/0.10.0.md")), + md_page(resolver, &base, load!("changelog/0.9.0.md")), + md_page(resolver, &base, load!("changelog/0.8.0.md")), + md_page(resolver, &base, load!("changelog/0.7.0.md")), + md_page(resolver, &base, load!("changelog/0.6.0.md")), + md_page(resolver, &base, load!("changelog/0.5.0.md")), + md_page(resolver, &base, load!("changelog/0.4.0.md")), + md_page(resolver, &base, load!("changelog/0.3.0.md")), + md_page(resolver, &base, load!("changelog/0.2.0.md")), + md_page(resolver, &base, load!("changelog/0.1.0.md")), + md_page(resolver, &base, load!("changelog/earlier.md")), + ]; + page } /// Create a page for a category. @@ -707,7 +712,7 @@ pub fn urlify(title: &str) -> EcoString { .chars() .map(|c| c.to_ascii_lowercase()) .map(|c| match c { - 'a'..='z' | '0'..='9' => c, + 'a'..='z' | '0'..='9' | '.' => c, _ => '-', }) .collect() |
