summaryrefslogtreecommitdiff
path: root/crates/typst-docs/src/link.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/typst-docs/src/link.rs')
-rw-r--r--crates/typst-docs/src/link.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/crates/typst-docs/src/link.rs b/crates/typst-docs/src/link.rs
index 38730c32..e2721b95 100644
--- a/crates/typst-docs/src/link.rs
+++ b/crates/typst-docs/src/link.rs
@@ -1,5 +1,5 @@
use typst::diag::{bail, StrResult};
-use typst::eval::Func;
+use typst::foundations::Func;
use crate::{get_module, GROUPS, LIBRARY};
@@ -55,6 +55,15 @@ fn resolve_known(head: &str) -> Option<&'static str> {
fn resolve_definition(head: &str) -> StrResult<String> {
let mut parts = head.trim_start_matches('$').split('.').peekable();
let mut focus = &LIBRARY.global;
+
+ let Some(name) = parts.peek() else {
+ bail!("missing first link component");
+ };
+
+ let Some(category) = focus.scope().get_category(name) else {
+ bail!("{name} has no category");
+ };
+
while let Some(m) = parts.peek().and_then(|&name| get_module(focus, name).ok()) {
focus = m;
parts.next();
@@ -62,18 +71,15 @@ fn resolve_definition(head: &str) -> StrResult<String> {
let name = parts.next().ok_or("link is missing first part")?;
let value = focus.field(name)?;
- let Some(category) = focus.scope().get_category(name) else {
- bail!("{name} has no category");
- };
// Handle grouped functions.
- if let Some(group) = GROUPS
- .iter()
- .filter(|_| category == "math")
- .find(|group| group.functions.iter().any(|func| func == name))
- {
- let mut route =
- format!("/docs/reference/math/{}/#functions-{}", group.name, name);
+ if let Some(group) = GROUPS.iter().find(|group| {
+ group.category == category.name() && group.filter.iter().any(|func| func == name)
+ }) {
+ let mut route = format!(
+ "/docs/reference/{}/{}/#functions-{}",
+ group.category, group.name, name
+ );
if let Some(param) = parts.next() {
route.push('-');
route.push_str(param);
@@ -81,7 +87,7 @@ fn resolve_definition(head: &str) -> StrResult<String> {
return Ok(route);
}
- let mut route = format!("/docs/reference/{category}/{name}/");
+ let mut route = format!("/docs/reference/{}/{name}/", category.name());
if let Some(next) = parts.next() {
if value.field(next).is_ok() {
route.push_str("#definitions-");