diff --git a/docs/src/html.rs b/docs/src/html.rs index d9826848d..550e6ff80 100644 --- a/docs/src/html.rs +++ b/docs/src/html.rs @@ -48,6 +48,7 @@ impl Html { let mut raw = String::new(); md::html::push_html(&mut raw, iter); raw.truncate(raw.trim_end().len()); + Html { md: text.into(), raw, description } } @@ -171,19 +172,23 @@ impl<'a> Handler<'a> { true } - fn handle_image(&self, path: &str) -> String { - let data = IMAGES - .get_file(path) - .unwrap_or_else(|| panic!("missing image: {path}")) - .contents(); - self.resolver.image(&path, data).into() + fn handle_image(&self, link: &str) -> String { + if let Some(file) = IMAGES.get_file(link) { + self.resolver.image(&link, file.contents()).into() + } else if let Some(url) = self.resolver.link(link) { + url + } else { + panic!("missing image: {link}") + } } fn handle_link(&self, link: &str) -> Option { - if link.starts_with(['#', 'h']) { + if link.starts_with('#') || link.starts_with("http") { return Some(link.into()); - } else if !link.starts_with('$') { - return None; + } + + if !link.starts_with('$') { + return self.resolver.link(link); } let root = link.split('/').next()?; @@ -196,9 +201,10 @@ impl<'a> Handler<'a> { "$styling" => "/docs/reference/styling/", "$scripting" => "/docs/reference/scripting/", "$types" => "/docs/reference/types/", - "$community" => "/docs/community/", "$type" => "/docs/reference/types/", "$func" => "/docs/reference/", + "$changelog" => "/docs/changelog/", + "$community" => "/docs/community/", _ => panic!("unknown link root: {root}"), }; @@ -221,6 +227,7 @@ impl<'a> Handler<'a> { route.push_str(info.category); route.push('/'); route.push_str(name); + route.push('/'); if let Some(param) = param { route.push_str("#parameters--"); route.push_str(param); diff --git a/docs/src/lib.rs b/docs/src/lib.rs index 76f25250e..6cb4a89c5 100644 --- a/docs/src/lib.rs +++ b/docs/src/lib.rs @@ -60,6 +60,9 @@ pub fn provide(resolver: &dyn Resolver) -> Vec { /// Resolve consumer dependencies. pub trait Resolver { + /// Try to resolve a link that the system cannot resolve itself. + fn link(&self, link: &str) -> Option; + /// Produce an URL for an image file. fn image(&self, filename: &str, data: &[u8]) -> String; @@ -294,6 +297,7 @@ fn category_page(resolver: &dyn Resolver, category: &str) -> PageModel { #[derive(Debug, Serialize)] pub struct FuncModel { pub name: &'static str, + pub display: &'static str, pub oneliner: &'static str, pub details: Html, pub showable: bool, @@ -330,6 +334,7 @@ fn function_page( fn func_model(resolver: &dyn Resolver, func: &Func, info: &FuncInfo) -> FuncModel { FuncModel { name: info.name.into(), + display: info.display, oneliner: oneliner(info.docs), details: Html::markdown(resolver, info.docs), showable: func.select(None).is_ok() && info.category != "math", @@ -442,7 +447,7 @@ fn types_page(resolver: &dyn Resolver, parent: &str) -> PageModel { let mut items = vec![]; for model in type_models(resolver) { - let route = format!("{route}{}/", model.name); + let route = format!("{route}{}/", urlify(&model.name)); items.push(CategoryItem { name: model.name.clone(), route: route.clone(), @@ -694,7 +699,7 @@ fn details(key: &str) -> &str { } /// Turn a title into an URL fragment. -fn urlify(title: &str) -> String { +pub fn urlify(title: &str) -> String { title .chars() .map(|c| c.to_ascii_lowercase()) diff --git a/docs/src/reference/details.yml b/docs/src/reference/details.yml index 24389a241..1360b989f 100644 --- a/docs/src/reference/details.yml +++ b/docs/src/reference/details.yml @@ -39,9 +39,9 @@ math: | { x in RR | x "is natural" } $ ``` - Math mode defines a wide selection of [symbols]($category/math/symbols) like - `pi`, `dot`, or `RR`. Many mathematical symbols are available in different - variants. You can select between different variants by applying + Math mode makes a wide selection of [symbols]($category/math/symbols) like + `pi`, `dot`, or `RR` available. Many mathematical symbols are available in + different variants. You can select between different variants by applying [modifiers]($type/symbol) to the symbol. Typst further recognizes a number of shorthand sequences like `=>` that approximate a symbol. When such a shorthand exists, the symbol's documentation lists it. diff --git a/src/font/book.rs b/src/font/book.rs index 25b1fc850..ec878eded 100644 --- a/src/font/book.rs +++ b/src/font/book.rs @@ -160,6 +160,7 @@ pub struct FontInfo { bitflags::bitflags! { /// Bitflags describing characteristics of a font. #[derive(Serialize, Deserialize)] + #[serde(transparent)] pub struct FontFlags: u32 { /// All glyphs have the same width. const MONOSPACE = 1 << 0;