summaryrefslogtreecommitdiff
path: root/docs/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-10-18 16:11:49 +0200
committerGitHub <noreply@github.com>2024-10-18 14:11:49 +0000
commit15a26c6c45bea9a539b0dfdb3999422d8ce1f558 (patch)
tree1f7196cfb335505d7495437a48d1df4ce3e4221c /docs/src
parent711a2d88079f0b3929bbb6be97bda52139e22aa1 (diff)
Split changelog (#5237)
Diffstat (limited to 'docs/src')
-rw-r--r--docs/src/html.rs41
-rw-r--r--docs/src/lib.rs49
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()