tinymist_analysis/upstream/
mod.rs

1//! Functions from typst-ide
2
3mod tooltip;
4
5pub use tooltip::{Tooltip, tooltip_};
6
7use std::{collections::HashMap, fmt::Write, sync::LazyLock};
8
9use comemo::Tracked;
10use ecow::{EcoString, eco_format};
11use serde::Deserialize;
12use serde_yaml as yaml;
13use typst::{
14    Category, Feature, Features, Library, LibraryExt, World,
15    diag::{StrResult, bail},
16    foundations::{Binding, Content, Func, Module, Type, Value},
17    introspection::MetadataElem,
18    syntax::Span,
19    text::{FontInfo, FontStyle},
20};
21
22/// Extract the first sentence of plain text of a piece of documentation.
23///
24/// Removes Markdown formatting.
25pub fn plain_docs_sentence(docs: &str) -> EcoString {
26    crate::log_debug_ct!("plain docs {docs:?}");
27    let docs = docs.replace("```example", "```typ");
28    let mut scanner = unscanny::Scanner::new(&docs);
29    let mut output = EcoString::new();
30    let mut link = false;
31    while let Some(ch) = scanner.eat() {
32        match ch {
33            '`' => {
34                let mut raw = scanner.eat_until('`');
35                if (raw.starts_with('{') && raw.ends_with('}'))
36                    || (raw.starts_with('[') && raw.ends_with(']'))
37                {
38                    raw = &raw[1..raw.len() - 1];
39                }
40
41                scanner.eat();
42                output.push('`');
43                output.push_str(raw);
44                output.push('`');
45            }
46            '[' => {
47                link = true;
48                output.push('[');
49            }
50            ']' if link => {
51                output.push(']');
52                let cursor = scanner.cursor();
53                if scanner.eat_if('(') {
54                    scanner.eat_until(')');
55                    let link_content = scanner.from(cursor + 1);
56                    scanner.eat();
57
58                    crate::log_debug_ct!("Intra Link: {link_content}");
59                    let link = resolve(link_content, "https://typst.app/docs/").ok();
60                    let link = link.unwrap_or_else(|| {
61                        log::warn!("Failed to resolve link: {link_content}");
62                        "https://typst.app/docs/404.html".to_string()
63                    });
64
65                    output.push('(');
66                    output.push_str(&link);
67                    output.push(')');
68                } else if scanner.eat_if('[') {
69                    scanner.eat_until(']');
70                    scanner.eat();
71                    output.push_str(scanner.from(cursor));
72                }
73                link = false
74            }
75            // '*' | '_' => {}
76            // '.' => {
77            //     output.push('.');
78            //     break;
79            // }
80            _ => output.push(ch),
81        }
82    }
83
84    output
85}
86
87/// Data about a collection of functions.
88#[derive(Debug, Clone, Deserialize)]
89struct GroupData {
90    name: EcoString,
91    // title: EcoString,
92    category: EcoString,
93    #[serde(default)]
94    path: Vec<EcoString>,
95    #[serde(default)]
96    filter: Vec<EcoString>,
97    // details: EcoString,
98}
99
100impl GroupData {
101    fn module(&self) -> &'static Module {
102        let mut focus = &LIBRARY.global;
103        for path in &self.path {
104            focus = get_module(focus, path).unwrap();
105        }
106        focus
107    }
108}
109
110static GROUPS: LazyLock<Vec<GroupData>> = LazyLock::new(|| {
111    let mut groups: Vec<GroupData> = yaml::from_str(include_str!("groups.yml")).unwrap();
112    for group in &mut groups {
113        if group.filter.is_empty() && group.name != "std" {
114            group.filter = group
115                .module()
116                .scope()
117                .iter()
118                .filter(|(_, v)| matches!(v.read(), Value::Func(_)))
119                .map(|(k, _)| k.clone())
120                .collect();
121        }
122    }
123    groups
124});
125
126/// Resolve an intra-doc link.
127pub fn resolve(link: &str, base: &str) -> StrResult<String> {
128    if link.starts_with('#') || link.starts_with("http") {
129        return Ok(link.to_string());
130    }
131
132    let (head, tail) = split_link(link)?;
133    let mut route = match resolve_known(head, base) {
134        Some(route) => route,
135        None => resolve_definition(head, base)?,
136    };
137
138    if !tail.is_empty() {
139        route.push('/');
140        route.push_str(tail);
141    }
142
143    if !route.contains(['#', '?']) && !route.ends_with('/') {
144        route.push('/');
145    }
146
147    Ok(route)
148}
149
150/// Split a link at the first slash.
151fn split_link(link: &str) -> StrResult<(&str, &str)> {
152    let first = link.split('/').next().unwrap_or(link);
153    let rest = link[first.len()..].trim_start_matches('/');
154    Ok((first, rest))
155}
156
157/// Resolve a `$` link head to a known destination.
158fn resolve_known(head: &str, base: &str) -> Option<String> {
159    Some(match head {
160        "$tutorial" => format!("{base}tutorial"),
161        "$reference" => format!("{base}reference"),
162        "$category" => format!("{base}reference"),
163        "$syntax" => format!("{base}reference/syntax"),
164        "$styling" => format!("{base}reference/styling"),
165        "$scripting" => format!("{base}reference/scripting"),
166        "$context" => format!("{base}reference/context"),
167        "$guides" => format!("{base}guides"),
168        "$changelog" => format!("{base}changelog"),
169        "$community" => format!("{base}community"),
170        "$universe" => "https://typst.app/universe".into(),
171        _ => return None,
172    })
173}
174
175static LIBRARY: LazyLock<Library> = LazyLock::new(|| {
176    Library::builder()
177        .with_features(Features::from_iter([Feature::Html]))
178        .build()
179});
180
181/// Extract a module from another module.
182#[track_caller]
183fn get_module<'a>(parent: &'a Module, name: &str) -> StrResult<&'a Module> {
184    match parent.scope().get(name).map(|x| x.read()) {
185        Some(Value::Module(module)) => Ok(module),
186        _ => bail!("module doesn't contain module `{name}`"),
187    }
188}
189
190/// Resolve a `$` link to a global definition.
191fn resolve_definition(head: &str, base: &str) -> StrResult<String> {
192    let mut parts = head.trim_start_matches('$').split('.').peekable();
193    let mut focus = &LIBRARY.global;
194    let mut category = None;
195
196    while let Some(name) = parts.peek() {
197        if category.is_none() {
198            category = focus.scope().get(name).and_then(Binding::category);
199        }
200        let Ok(module) = get_module(focus, name) else {
201            break;
202        };
203        focus = module;
204        parts.next();
205    }
206
207    let Some(category) = category else {
208        bail!("{head} has no category")
209    };
210
211    let name = parts.next().ok_or("link is missing first part")?;
212    let value = focus.field(name, ())?;
213
214    // Handle grouped functions.
215    if let Some(group) = GROUPS.iter().find(|group| {
216        group.category == category.name() && group.filter.iter().any(|func| func == name)
217    }) {
218        let mut route = format!(
219            "{}reference/{}/{}/#functions-{}",
220            base, group.category, group.name, name
221        );
222        if let Some(param) = parts.next() {
223            route.push('-');
224            route.push_str(param);
225        }
226        return Ok(route);
227    }
228
229    let mut route = format!("{}reference/{}/{name}", base, category.name());
230    if let Some(next) = parts.next() {
231        if let Ok(field) = value.field(next, ()) {
232            route.push_str("/#definitions-");
233            route.push_str(next);
234            if let Some(next) = parts.next()
235                && field
236                    .cast::<Func>()
237                    .is_ok_and(|func| func.param(next).is_some())
238            {
239                route.push('-');
240                route.push_str(next);
241            }
242        } else if value
243            .clone()
244            .cast::<Func>()
245            .is_ok_and(|func| func.param(next).is_some())
246        {
247            route.push_str("/#parameters-");
248            route.push_str(next);
249        } else {
250            bail!("field {next} not found");
251        }
252    }
253
254    Ok(route)
255}
256
257#[allow(clippy::derived_hash_with_manual_eq)]
258#[derive(Debug, Clone, Hash)]
259enum CatKey {
260    Func(Func),
261    Type(Type),
262}
263
264impl PartialEq for CatKey {
265    fn eq(&self, other: &Self) -> bool {
266        use typst::foundations::func::Repr::*;
267        match (self, other) {
268            (CatKey::Func(a), CatKey::Func(b)) => match (a.inner(), b.inner()) {
269                (Native(a), Native(b)) => a == b,
270                (Element(a), Element(b)) => a == b,
271                _ => false,
272            },
273            (CatKey::Type(a), CatKey::Type(b)) => a == b,
274            _ => false,
275        }
276    }
277}
278
279impl Eq for CatKey {}
280
281// todo: category of types
282static ROUTE_MAPS: LazyLock<HashMap<CatKey, String>> = LazyLock::new(|| {
283    // todo: this is a false positive for clippy on LazyHash
284    #[allow(clippy::mutable_key_type)]
285    let mut map = HashMap::new();
286    let mut scope_to_finds = vec![
287        (LIBRARY.global.scope(), None, None),
288        (LIBRARY.math.scope(), None, None),
289    ];
290    while let Some((scope, parent_name, cat)) = scope_to_finds.pop() {
291        for (name, bind) in scope.iter() {
292            let cat = cat.or_else(|| bind.category());
293            let name = urlify(name);
294            match bind.read() {
295                Value::Func(func) => {
296                    if let Some(cat) = cat {
297                        let Some(name) = func.name() else {
298                            continue;
299                        };
300
301                        // Handle grouped functions.
302                        if let Some(group) = GROUPS.iter().find(|group| {
303                            group.category == cat.name()
304                                && group.filter.iter().any(|func| func == name)
305                        }) {
306                            let route = format!(
307                                "reference/{}/{}/#functions-{name}",
308                                group.category, group.name
309                            );
310                            map.insert(CatKey::Func(func.clone()), route);
311                            continue;
312                        }
313
314                        crate::log_debug_ct!("func: {func:?} -> {cat:?}");
315
316                        let route = format_route(parent_name.as_deref(), name, &cat);
317
318                        map.insert(CatKey::Func(func.clone()), route);
319                    }
320                    if let Some(s) = func.scope() {
321                        scope_to_finds.push((s, Some(name), cat));
322                    }
323                }
324                Value::Type(t) => {
325                    if let Some(cat) = cat {
326                        crate::log_debug_ct!("type: {t:?} -> {cat:?}");
327
328                        let route = format_route(parent_name.as_deref(), &name, &cat);
329
330                        // Some types are defined multiple times, and the first one should take
331                        // precedence.
332                        //
333                        // For example, typst 0.13.0 renamed `pattern` to `tiling`, but keep
334                        // `pattern` remains as a deprecated alias.
335                        // Therefore, `Tiling` is first defined as `tiling`, then defined as
336                        // `pattern` with deprecation again. https://typst.app/docs/changelog/0.13.0/#visualization
337                        // https://github.com/typst/typst/blob/9a6268050fb769e18c4889fa5f59d4150e8878d6/crates/typst-library/src/visualize/mod.rs#L34
338                        // https://github.com/typst/typst/blob/9a6268050fb769e18c4889fa5f59d4150e8878d6/crates/typst-library/src/visualize/mod.rs#L47-L49
339                        map.entry(CatKey::Type(*t)).or_insert(route);
340                    }
341                    scope_to_finds.push((t.scope(), Some(name), cat));
342                }
343                Value::Module(module) => {
344                    scope_to_finds.push((module.scope(), Some(name), cat));
345                }
346                _ => {}
347            }
348        }
349    }
350    map
351});
352
353fn format_route(parent_name: Option<&str>, name: &str, cat: &Category) -> String {
354    match parent_name {
355        Some(parent_name) if parent_name != cat.name() => {
356            format!("reference/{}/{parent_name}/#definitions-{name}", cat.name())
357        }
358        Some(_) | None => format!("reference/{}/{name}/", cat.name()),
359    }
360}
361
362/// Turn a title into an URL fragment.
363pub(crate) fn urlify(title: &str) -> EcoString {
364    title
365        .chars()
366        .map(|ch| ch.to_ascii_lowercase())
367        .map(|ch| match ch {
368            'a'..='z' | '0'..='9' => ch,
369            _ => '-',
370        })
371        .collect()
372}
373
374/// Get the route of a value.
375pub fn route_of_value(val: &Value) -> Option<&'static String> {
376    // ROUTE_MAPS.get(&CatKey::Func(k.clone()))
377    let key = match val {
378        Value::Func(func) => CatKey::Func(func.clone()),
379        Value::Type(ty) => CatKey::Type(*ty),
380        _ => return None,
381    };
382
383    ROUTE_MAPS.get(&key)
384}
385
386/// Create a short description of a font family.
387pub fn summarize_font_family<'a>(variants: impl Iterator<Item = &'a FontInfo>) -> EcoString {
388    let mut infos: Vec<_> = variants.collect();
389    infos.sort_by_key(|info: &&FontInfo| info.variant);
390
391    let mut has_italic = false;
392    let mut min_weight = u16::MAX;
393    let mut max_weight = 0;
394    for info in &infos {
395        let weight = info.variant.weight.to_number();
396        has_italic |= info.variant.style == FontStyle::Italic;
397        min_weight = min_weight.min(weight);
398        max_weight = min_weight.max(weight);
399    }
400
401    let count = infos.len();
402    let mut detail = eco_format!("{count} variant{}.", if count == 1 { "" } else { "s" });
403
404    if min_weight == max_weight {
405        write!(detail, " Weight {min_weight}.").unwrap();
406    } else {
407        write!(detail, " Weights {min_weight}–{max_weight}.").unwrap();
408    }
409
410    if has_italic {
411        detail.push_str(" Has italics.");
412    }
413
414    detail
415}
416
417/// Get the representation but truncated to a certain size.
418pub fn truncated_repr_<const SZ_LIMIT: usize>(value: &Value) -> EcoString {
419    use typst::foundations::Repr;
420
421    let data: Option<Content> = value.clone().cast().ok();
422    let metadata: Option<MetadataElem> = data.and_then(|content| content.unpack().ok());
423
424    // todo: early truncation
425    let repr = if let Some(metadata) = metadata {
426        metadata.value.repr()
427    } else {
428        value.repr()
429    };
430
431    if repr.len() > SZ_LIMIT {
432        eco_format!("[truncated-repr: {} bytes]", repr.len())
433    } else {
434        repr
435    }
436}
437
438/// Get the representation but truncated to a certain size.
439pub fn truncated_repr(value: &Value) -> EcoString {
440    const _10MB: usize = 10 * 1024 * 1024;
441    truncated_repr_::<_10MB>(value)
442}
443
444/// Run a function with a VM instance in the world
445pub fn with_vm<T>(
446    world: Tracked<dyn World + '_>,
447    f: impl FnOnce(&mut typst_shim::eval::Vm) -> T,
448) -> T {
449    use comemo::Track;
450    use typst::engine::*;
451    use typst::foundations::*;
452    use typst::introspection::*;
453    use typst_shim::eval::*;
454
455    let introspector = Introspector::default();
456    let traced = Traced::default();
457    let mut sink = Sink::new();
458    let engine = Engine {
459        routines: &typst::ROUTINES,
460        world,
461        route: Route::default(),
462        introspector: introspector.track(),
463        traced: traced.track(),
464        sink: sink.track_mut(),
465    };
466
467    let context = Context::none();
468    let mut vm = Vm::new(
469        engine,
470        context.track(),
471        Scopes::new(Some(world.library())),
472        Span::detached(),
473    );
474
475    f(&mut vm)
476}
477
478#[cfg(test)]
479mod tests {
480    use crate::upstream::ROUTE_MAPS;
481
482    #[test]
483    fn docs_test() {
484        assert_eq!(
485            "[citation](https://typst.app/docs/reference/model/cite/)",
486            super::plain_docs_sentence("[citation]($cite)")
487        );
488        assert_eq!(
489            "[citation][cite]",
490            super::plain_docs_sentence("[citation][cite]")
491        );
492        assert_eq!(
493            "[citation](https://typst.app/docs/reference/model/cite/)",
494            super::plain_docs_sentence("[citation]($cite)")
495        );
496        assert_eq!(
497            "[citation][cite][cite2]",
498            super::plain_docs_sentence("[citation][cite][cite2]")
499        );
500        assert_eq!(
501            "[citation][cite](test)[cite2]",
502            super::plain_docs_sentence("[citation][cite](test)[cite2]")
503        );
504    }
505
506    #[test]
507    fn routes() {
508        let access = |route: &String| format!("https://typst.app/docs/{route}");
509        let mut values = ROUTE_MAPS.values().map(access).collect::<Vec<_>>();
510        values.sort();
511
512        insta::assert_snapshot!(values.as_slice().join("\n"), @r"
513        https://typst.app/docs/reference/data-loading/cbor/
514        https://typst.app/docs/reference/data-loading/cbor/#definitions-decode
515        https://typst.app/docs/reference/data-loading/cbor/#definitions-encode
516        https://typst.app/docs/reference/data-loading/csv/
517        https://typst.app/docs/reference/data-loading/csv/#definitions-decode
518        https://typst.app/docs/reference/data-loading/json/
519        https://typst.app/docs/reference/data-loading/json/#definitions-decode
520        https://typst.app/docs/reference/data-loading/json/#definitions-encode
521        https://typst.app/docs/reference/data-loading/read/
522        https://typst.app/docs/reference/data-loading/toml/
523        https://typst.app/docs/reference/data-loading/toml/#definitions-decode
524        https://typst.app/docs/reference/data-loading/toml/#definitions-encode
525        https://typst.app/docs/reference/data-loading/xml/
526        https://typst.app/docs/reference/data-loading/xml/#definitions-decode
527        https://typst.app/docs/reference/data-loading/yaml/
528        https://typst.app/docs/reference/data-loading/yaml/#definitions-decode
529        https://typst.app/docs/reference/data-loading/yaml/#definitions-encode
530        https://typst.app/docs/reference/foundations/arguments/
531        https://typst.app/docs/reference/foundations/arguments/#definitions-at
532        https://typst.app/docs/reference/foundations/arguments/#definitions-named
533        https://typst.app/docs/reference/foundations/arguments/#definitions-pos
534        https://typst.app/docs/reference/foundations/array/
535        https://typst.app/docs/reference/foundations/array/#definitions-all
536        https://typst.app/docs/reference/foundations/array/#definitions-any
537        https://typst.app/docs/reference/foundations/array/#definitions-at
538        https://typst.app/docs/reference/foundations/array/#definitions-chunks
539        https://typst.app/docs/reference/foundations/array/#definitions-contains
540        https://typst.app/docs/reference/foundations/array/#definitions-dedup
541        https://typst.app/docs/reference/foundations/array/#definitions-enumerate
542        https://typst.app/docs/reference/foundations/array/#definitions-filter
543        https://typst.app/docs/reference/foundations/array/#definitions-find
544        https://typst.app/docs/reference/foundations/array/#definitions-first
545        https://typst.app/docs/reference/foundations/array/#definitions-flatten
546        https://typst.app/docs/reference/foundations/array/#definitions-fold
547        https://typst.app/docs/reference/foundations/array/#definitions-insert
548        https://typst.app/docs/reference/foundations/array/#definitions-intersperse
549        https://typst.app/docs/reference/foundations/array/#definitions-join
550        https://typst.app/docs/reference/foundations/array/#definitions-last
551        https://typst.app/docs/reference/foundations/array/#definitions-len
552        https://typst.app/docs/reference/foundations/array/#definitions-map
553        https://typst.app/docs/reference/foundations/array/#definitions-pop
554        https://typst.app/docs/reference/foundations/array/#definitions-position
555        https://typst.app/docs/reference/foundations/array/#definitions-product
556        https://typst.app/docs/reference/foundations/array/#definitions-push
557        https://typst.app/docs/reference/foundations/array/#definitions-range
558        https://typst.app/docs/reference/foundations/array/#definitions-reduce
559        https://typst.app/docs/reference/foundations/array/#definitions-remove
560        https://typst.app/docs/reference/foundations/array/#definitions-rev
561        https://typst.app/docs/reference/foundations/array/#definitions-slice
562        https://typst.app/docs/reference/foundations/array/#definitions-sorted
563        https://typst.app/docs/reference/foundations/array/#definitions-split
564        https://typst.app/docs/reference/foundations/array/#definitions-sum
565        https://typst.app/docs/reference/foundations/array/#definitions-to-dict
566        https://typst.app/docs/reference/foundations/array/#definitions-windows
567        https://typst.app/docs/reference/foundations/array/#definitions-zip
568        https://typst.app/docs/reference/foundations/assert/
569        https://typst.app/docs/reference/foundations/assert/#definitions-eq
570        https://typst.app/docs/reference/foundations/assert/#definitions-ne
571        https://typst.app/docs/reference/foundations/bool/
572        https://typst.app/docs/reference/foundations/bytes/
573        https://typst.app/docs/reference/foundations/bytes/#definitions-at
574        https://typst.app/docs/reference/foundations/bytes/#definitions-len
575        https://typst.app/docs/reference/foundations/bytes/#definitions-slice
576        https://typst.app/docs/reference/foundations/calc/#functions-abs
577        https://typst.app/docs/reference/foundations/calc/#functions-acos
578        https://typst.app/docs/reference/foundations/calc/#functions-asin
579        https://typst.app/docs/reference/foundations/calc/#functions-atan
580        https://typst.app/docs/reference/foundations/calc/#functions-atan2
581        https://typst.app/docs/reference/foundations/calc/#functions-binom
582        https://typst.app/docs/reference/foundations/calc/#functions-ceil
583        https://typst.app/docs/reference/foundations/calc/#functions-clamp
584        https://typst.app/docs/reference/foundations/calc/#functions-cos
585        https://typst.app/docs/reference/foundations/calc/#functions-cosh
586        https://typst.app/docs/reference/foundations/calc/#functions-div-euclid
587        https://typst.app/docs/reference/foundations/calc/#functions-even
588        https://typst.app/docs/reference/foundations/calc/#functions-exp
589        https://typst.app/docs/reference/foundations/calc/#functions-fact
590        https://typst.app/docs/reference/foundations/calc/#functions-floor
591        https://typst.app/docs/reference/foundations/calc/#functions-fract
592        https://typst.app/docs/reference/foundations/calc/#functions-gcd
593        https://typst.app/docs/reference/foundations/calc/#functions-lcm
594        https://typst.app/docs/reference/foundations/calc/#functions-ln
595        https://typst.app/docs/reference/foundations/calc/#functions-log
596        https://typst.app/docs/reference/foundations/calc/#functions-max
597        https://typst.app/docs/reference/foundations/calc/#functions-min
598        https://typst.app/docs/reference/foundations/calc/#functions-norm
599        https://typst.app/docs/reference/foundations/calc/#functions-odd
600        https://typst.app/docs/reference/foundations/calc/#functions-perm
601        https://typst.app/docs/reference/foundations/calc/#functions-pow
602        https://typst.app/docs/reference/foundations/calc/#functions-quo
603        https://typst.app/docs/reference/foundations/calc/#functions-rem
604        https://typst.app/docs/reference/foundations/calc/#functions-rem-euclid
605        https://typst.app/docs/reference/foundations/calc/#functions-root
606        https://typst.app/docs/reference/foundations/calc/#functions-round
607        https://typst.app/docs/reference/foundations/calc/#functions-sin
608        https://typst.app/docs/reference/foundations/calc/#functions-sinh
609        https://typst.app/docs/reference/foundations/calc/#functions-sqrt
610        https://typst.app/docs/reference/foundations/calc/#functions-tan
611        https://typst.app/docs/reference/foundations/calc/#functions-tanh
612        https://typst.app/docs/reference/foundations/calc/#functions-trunc
613        https://typst.app/docs/reference/foundations/content/
614        https://typst.app/docs/reference/foundations/content/#definitions-at
615        https://typst.app/docs/reference/foundations/content/#definitions-fields
616        https://typst.app/docs/reference/foundations/content/#definitions-func
617        https://typst.app/docs/reference/foundations/content/#definitions-has
618        https://typst.app/docs/reference/foundations/content/#definitions-location
619        https://typst.app/docs/reference/foundations/datetime/
620        https://typst.app/docs/reference/foundations/datetime/#definitions-day
621        https://typst.app/docs/reference/foundations/datetime/#definitions-display
622        https://typst.app/docs/reference/foundations/datetime/#definitions-hour
623        https://typst.app/docs/reference/foundations/datetime/#definitions-minute
624        https://typst.app/docs/reference/foundations/datetime/#definitions-month
625        https://typst.app/docs/reference/foundations/datetime/#definitions-ordinal
626        https://typst.app/docs/reference/foundations/datetime/#definitions-second
627        https://typst.app/docs/reference/foundations/datetime/#definitions-today
628        https://typst.app/docs/reference/foundations/datetime/#definitions-weekday
629        https://typst.app/docs/reference/foundations/datetime/#definitions-year
630        https://typst.app/docs/reference/foundations/decimal/
631        https://typst.app/docs/reference/foundations/dictionary/
632        https://typst.app/docs/reference/foundations/dictionary/#definitions-at
633        https://typst.app/docs/reference/foundations/dictionary/#definitions-insert
634        https://typst.app/docs/reference/foundations/dictionary/#definitions-keys
635        https://typst.app/docs/reference/foundations/dictionary/#definitions-len
636        https://typst.app/docs/reference/foundations/dictionary/#definitions-pairs
637        https://typst.app/docs/reference/foundations/dictionary/#definitions-remove
638        https://typst.app/docs/reference/foundations/dictionary/#definitions-values
639        https://typst.app/docs/reference/foundations/duration/
640        https://typst.app/docs/reference/foundations/duration/#definitions-days
641        https://typst.app/docs/reference/foundations/duration/#definitions-hours
642        https://typst.app/docs/reference/foundations/duration/#definitions-minutes
643        https://typst.app/docs/reference/foundations/duration/#definitions-seconds
644        https://typst.app/docs/reference/foundations/duration/#definitions-weeks
645        https://typst.app/docs/reference/foundations/eval/
646        https://typst.app/docs/reference/foundations/float/
647        https://typst.app/docs/reference/foundations/float/#definitions-from-bytes
648        https://typst.app/docs/reference/foundations/float/#definitions-is-infinite
649        https://typst.app/docs/reference/foundations/float/#definitions-is-nan
650        https://typst.app/docs/reference/foundations/float/#definitions-signum
651        https://typst.app/docs/reference/foundations/float/#definitions-to-bytes
652        https://typst.app/docs/reference/foundations/function/
653        https://typst.app/docs/reference/foundations/function/#definitions-where
654        https://typst.app/docs/reference/foundations/function/#definitions-with
655        https://typst.app/docs/reference/foundations/int/
656        https://typst.app/docs/reference/foundations/int/#definitions-bit-and
657        https://typst.app/docs/reference/foundations/int/#definitions-bit-lshift
658        https://typst.app/docs/reference/foundations/int/#definitions-bit-not
659        https://typst.app/docs/reference/foundations/int/#definitions-bit-or
660        https://typst.app/docs/reference/foundations/int/#definitions-bit-rshift
661        https://typst.app/docs/reference/foundations/int/#definitions-bit-xor
662        https://typst.app/docs/reference/foundations/int/#definitions-from-bytes
663        https://typst.app/docs/reference/foundations/int/#definitions-signum
664        https://typst.app/docs/reference/foundations/int/#definitions-to-bytes
665        https://typst.app/docs/reference/foundations/label/
666        https://typst.app/docs/reference/foundations/module/
667        https://typst.app/docs/reference/foundations/panic/
668        https://typst.app/docs/reference/foundations/plugin/
669        https://typst.app/docs/reference/foundations/plugin/#definitions-transition
670        https://typst.app/docs/reference/foundations/regex/
671        https://typst.app/docs/reference/foundations/repr/
672        https://typst.app/docs/reference/foundations/selector/
673        https://typst.app/docs/reference/foundations/selector/#definitions-after
674        https://typst.app/docs/reference/foundations/selector/#definitions-and
675        https://typst.app/docs/reference/foundations/selector/#definitions-before
676        https://typst.app/docs/reference/foundations/selector/#definitions-or
677        https://typst.app/docs/reference/foundations/str/
678        https://typst.app/docs/reference/foundations/str/#definitions-at
679        https://typst.app/docs/reference/foundations/str/#definitions-clusters
680        https://typst.app/docs/reference/foundations/str/#definitions-codepoints
681        https://typst.app/docs/reference/foundations/str/#definitions-contains
682        https://typst.app/docs/reference/foundations/str/#definitions-ends-with
683        https://typst.app/docs/reference/foundations/str/#definitions-find
684        https://typst.app/docs/reference/foundations/str/#definitions-first
685        https://typst.app/docs/reference/foundations/str/#definitions-from-unicode
686        https://typst.app/docs/reference/foundations/str/#definitions-last
687        https://typst.app/docs/reference/foundations/str/#definitions-len
688        https://typst.app/docs/reference/foundations/str/#definitions-match
689        https://typst.app/docs/reference/foundations/str/#definitions-matches
690        https://typst.app/docs/reference/foundations/str/#definitions-normalize
691        https://typst.app/docs/reference/foundations/str/#definitions-position
692        https://typst.app/docs/reference/foundations/str/#definitions-replace
693        https://typst.app/docs/reference/foundations/str/#definitions-rev
694        https://typst.app/docs/reference/foundations/str/#definitions-slice
695        https://typst.app/docs/reference/foundations/str/#definitions-split
696        https://typst.app/docs/reference/foundations/str/#definitions-starts-with
697        https://typst.app/docs/reference/foundations/str/#definitions-to-unicode
698        https://typst.app/docs/reference/foundations/str/#definitions-trim
699        https://typst.app/docs/reference/foundations/symbol/
700        https://typst.app/docs/reference/foundations/target/
701        https://typst.app/docs/reference/foundations/type/
702        https://typst.app/docs/reference/foundations/version/
703        https://typst.app/docs/reference/foundations/version/#definitions-at
704        https://typst.app/docs/reference/html/typed/#functions-a
705        https://typst.app/docs/reference/html/typed/#functions-abbr
706        https://typst.app/docs/reference/html/typed/#functions-address
707        https://typst.app/docs/reference/html/typed/#functions-area
708        https://typst.app/docs/reference/html/typed/#functions-article
709        https://typst.app/docs/reference/html/typed/#functions-aside
710        https://typst.app/docs/reference/html/typed/#functions-audio
711        https://typst.app/docs/reference/html/typed/#functions-b
712        https://typst.app/docs/reference/html/typed/#functions-base
713        https://typst.app/docs/reference/html/typed/#functions-bdi
714        https://typst.app/docs/reference/html/typed/#functions-bdo
715        https://typst.app/docs/reference/html/typed/#functions-blockquote
716        https://typst.app/docs/reference/html/typed/#functions-body
717        https://typst.app/docs/reference/html/typed/#functions-br
718        https://typst.app/docs/reference/html/typed/#functions-button
719        https://typst.app/docs/reference/html/typed/#functions-canvas
720        https://typst.app/docs/reference/html/typed/#functions-caption
721        https://typst.app/docs/reference/html/typed/#functions-cite
722        https://typst.app/docs/reference/html/typed/#functions-code
723        https://typst.app/docs/reference/html/typed/#functions-col
724        https://typst.app/docs/reference/html/typed/#functions-colgroup
725        https://typst.app/docs/reference/html/typed/#functions-data
726        https://typst.app/docs/reference/html/typed/#functions-datalist
727        https://typst.app/docs/reference/html/typed/#functions-dd
728        https://typst.app/docs/reference/html/typed/#functions-del
729        https://typst.app/docs/reference/html/typed/#functions-details
730        https://typst.app/docs/reference/html/typed/#functions-dfn
731        https://typst.app/docs/reference/html/typed/#functions-dialog
732        https://typst.app/docs/reference/html/typed/#functions-div
733        https://typst.app/docs/reference/html/typed/#functions-dl
734        https://typst.app/docs/reference/html/typed/#functions-dt
735        https://typst.app/docs/reference/html/typed/#functions-elem
736        https://typst.app/docs/reference/html/typed/#functions-em
737        https://typst.app/docs/reference/html/typed/#functions-embed
738        https://typst.app/docs/reference/html/typed/#functions-fieldset
739        https://typst.app/docs/reference/html/typed/#functions-figcaption
740        https://typst.app/docs/reference/html/typed/#functions-figure
741        https://typst.app/docs/reference/html/typed/#functions-footer
742        https://typst.app/docs/reference/html/typed/#functions-form
743        https://typst.app/docs/reference/html/typed/#functions-frame
744        https://typst.app/docs/reference/html/typed/#functions-h1
745        https://typst.app/docs/reference/html/typed/#functions-h2
746        https://typst.app/docs/reference/html/typed/#functions-h3
747        https://typst.app/docs/reference/html/typed/#functions-h4
748        https://typst.app/docs/reference/html/typed/#functions-h5
749        https://typst.app/docs/reference/html/typed/#functions-h6
750        https://typst.app/docs/reference/html/typed/#functions-head
751        https://typst.app/docs/reference/html/typed/#functions-header
752        https://typst.app/docs/reference/html/typed/#functions-hgroup
753        https://typst.app/docs/reference/html/typed/#functions-hr
754        https://typst.app/docs/reference/html/typed/#functions-html
755        https://typst.app/docs/reference/html/typed/#functions-i
756        https://typst.app/docs/reference/html/typed/#functions-iframe
757        https://typst.app/docs/reference/html/typed/#functions-img
758        https://typst.app/docs/reference/html/typed/#functions-input
759        https://typst.app/docs/reference/html/typed/#functions-ins
760        https://typst.app/docs/reference/html/typed/#functions-kbd
761        https://typst.app/docs/reference/html/typed/#functions-label
762        https://typst.app/docs/reference/html/typed/#functions-legend
763        https://typst.app/docs/reference/html/typed/#functions-li
764        https://typst.app/docs/reference/html/typed/#functions-link
765        https://typst.app/docs/reference/html/typed/#functions-main
766        https://typst.app/docs/reference/html/typed/#functions-map
767        https://typst.app/docs/reference/html/typed/#functions-mark
768        https://typst.app/docs/reference/html/typed/#functions-menu
769        https://typst.app/docs/reference/html/typed/#functions-meta
770        https://typst.app/docs/reference/html/typed/#functions-meter
771        https://typst.app/docs/reference/html/typed/#functions-nav
772        https://typst.app/docs/reference/html/typed/#functions-noscript
773        https://typst.app/docs/reference/html/typed/#functions-object
774        https://typst.app/docs/reference/html/typed/#functions-ol
775        https://typst.app/docs/reference/html/typed/#functions-optgroup
776        https://typst.app/docs/reference/html/typed/#functions-option
777        https://typst.app/docs/reference/html/typed/#functions-output
778        https://typst.app/docs/reference/html/typed/#functions-p
779        https://typst.app/docs/reference/html/typed/#functions-picture
780        https://typst.app/docs/reference/html/typed/#functions-pre
781        https://typst.app/docs/reference/html/typed/#functions-progress
782        https://typst.app/docs/reference/html/typed/#functions-q
783        https://typst.app/docs/reference/html/typed/#functions-rp
784        https://typst.app/docs/reference/html/typed/#functions-rt
785        https://typst.app/docs/reference/html/typed/#functions-ruby
786        https://typst.app/docs/reference/html/typed/#functions-s
787        https://typst.app/docs/reference/html/typed/#functions-samp
788        https://typst.app/docs/reference/html/typed/#functions-script
789        https://typst.app/docs/reference/html/typed/#functions-search
790        https://typst.app/docs/reference/html/typed/#functions-section
791        https://typst.app/docs/reference/html/typed/#functions-select
792        https://typst.app/docs/reference/html/typed/#functions-slot
793        https://typst.app/docs/reference/html/typed/#functions-small
794        https://typst.app/docs/reference/html/typed/#functions-source
795        https://typst.app/docs/reference/html/typed/#functions-span
796        https://typst.app/docs/reference/html/typed/#functions-strong
797        https://typst.app/docs/reference/html/typed/#functions-style
798        https://typst.app/docs/reference/html/typed/#functions-sub
799        https://typst.app/docs/reference/html/typed/#functions-summary
800        https://typst.app/docs/reference/html/typed/#functions-sup
801        https://typst.app/docs/reference/html/typed/#functions-table
802        https://typst.app/docs/reference/html/typed/#functions-tbody
803        https://typst.app/docs/reference/html/typed/#functions-td
804        https://typst.app/docs/reference/html/typed/#functions-template
805        https://typst.app/docs/reference/html/typed/#functions-textarea
806        https://typst.app/docs/reference/html/typed/#functions-tfoot
807        https://typst.app/docs/reference/html/typed/#functions-th
808        https://typst.app/docs/reference/html/typed/#functions-thead
809        https://typst.app/docs/reference/html/typed/#functions-time
810        https://typst.app/docs/reference/html/typed/#functions-title
811        https://typst.app/docs/reference/html/typed/#functions-tr
812        https://typst.app/docs/reference/html/typed/#functions-track
813        https://typst.app/docs/reference/html/typed/#functions-u
814        https://typst.app/docs/reference/html/typed/#functions-ul
815        https://typst.app/docs/reference/html/typed/#functions-var
816        https://typst.app/docs/reference/html/typed/#functions-video
817        https://typst.app/docs/reference/html/typed/#functions-wbr
818        https://typst.app/docs/reference/introspection/counter/
819        https://typst.app/docs/reference/introspection/counter/#definitions-at
820        https://typst.app/docs/reference/introspection/counter/#definitions-display
821        https://typst.app/docs/reference/introspection/counter/#definitions-final
822        https://typst.app/docs/reference/introspection/counter/#definitions-get
823        https://typst.app/docs/reference/introspection/counter/#definitions-step
824        https://typst.app/docs/reference/introspection/counter/#definitions-update
825        https://typst.app/docs/reference/introspection/here/
826        https://typst.app/docs/reference/introspection/locate/
827        https://typst.app/docs/reference/introspection/location/
828        https://typst.app/docs/reference/introspection/location/#definitions-page
829        https://typst.app/docs/reference/introspection/location/#definitions-page-numbering
830        https://typst.app/docs/reference/introspection/location/#definitions-position
831        https://typst.app/docs/reference/introspection/metadata/
832        https://typst.app/docs/reference/introspection/query/
833        https://typst.app/docs/reference/introspection/state/
834        https://typst.app/docs/reference/introspection/state/#definitions-at
835        https://typst.app/docs/reference/introspection/state/#definitions-final
836        https://typst.app/docs/reference/introspection/state/#definitions-get
837        https://typst.app/docs/reference/introspection/state/#definitions-update
838        https://typst.app/docs/reference/layout/align/
839        https://typst.app/docs/reference/layout/alignment/
840        https://typst.app/docs/reference/layout/alignment/#definitions-axis
841        https://typst.app/docs/reference/layout/alignment/#definitions-inv
842        https://typst.app/docs/reference/layout/angle/
843        https://typst.app/docs/reference/layout/angle/#definitions-deg
844        https://typst.app/docs/reference/layout/angle/#definitions-rad
845        https://typst.app/docs/reference/layout/block/
846        https://typst.app/docs/reference/layout/box/
847        https://typst.app/docs/reference/layout/colbreak/
848        https://typst.app/docs/reference/layout/columns/
849        https://typst.app/docs/reference/layout/direction/
850        https://typst.app/docs/reference/layout/direction/#definitions-axis
851        https://typst.app/docs/reference/layout/direction/#definitions-end
852        https://typst.app/docs/reference/layout/direction/#definitions-from
853        https://typst.app/docs/reference/layout/direction/#definitions-inv
854        https://typst.app/docs/reference/layout/direction/#definitions-sign
855        https://typst.app/docs/reference/layout/direction/#definitions-start
856        https://typst.app/docs/reference/layout/direction/#definitions-to
857        https://typst.app/docs/reference/layout/fraction/
858        https://typst.app/docs/reference/layout/grid/
859        https://typst.app/docs/reference/layout/grid/#definitions-cell
860        https://typst.app/docs/reference/layout/grid/#definitions-footer
861        https://typst.app/docs/reference/layout/grid/#definitions-header
862        https://typst.app/docs/reference/layout/grid/#definitions-hline
863        https://typst.app/docs/reference/layout/grid/#definitions-vline
864        https://typst.app/docs/reference/layout/h/
865        https://typst.app/docs/reference/layout/hide/
866        https://typst.app/docs/reference/layout/layout/
867        https://typst.app/docs/reference/layout/length/
868        https://typst.app/docs/reference/layout/length/#definitions-cm
869        https://typst.app/docs/reference/layout/length/#definitions-inches
870        https://typst.app/docs/reference/layout/length/#definitions-mm
871        https://typst.app/docs/reference/layout/length/#definitions-pt
872        https://typst.app/docs/reference/layout/length/#definitions-to-absolute
873        https://typst.app/docs/reference/layout/measure/
874        https://typst.app/docs/reference/layout/move/
875        https://typst.app/docs/reference/layout/pad/
876        https://typst.app/docs/reference/layout/page/
877        https://typst.app/docs/reference/layout/pagebreak/
878        https://typst.app/docs/reference/layout/place/
879        https://typst.app/docs/reference/layout/place/#definitions-flush
880        https://typst.app/docs/reference/layout/ratio/
881        https://typst.app/docs/reference/layout/relative/
882        https://typst.app/docs/reference/layout/repeat/
883        https://typst.app/docs/reference/layout/rotate/
884        https://typst.app/docs/reference/layout/scale/
885        https://typst.app/docs/reference/layout/skew/
886        https://typst.app/docs/reference/layout/stack/
887        https://typst.app/docs/reference/layout/v/
888        https://typst.app/docs/reference/math/accent/
889        https://typst.app/docs/reference/math/attach/#functions-attach
890        https://typst.app/docs/reference/math/attach/#functions-limits
891        https://typst.app/docs/reference/math/attach/#functions-scripts
892        https://typst.app/docs/reference/math/binom/
893        https://typst.app/docs/reference/math/cancel/
894        https://typst.app/docs/reference/math/cases/
895        https://typst.app/docs/reference/math/class/
896        https://typst.app/docs/reference/math/equation/
897        https://typst.app/docs/reference/math/frac/
898        https://typst.app/docs/reference/math/lr/#functions-abs
899        https://typst.app/docs/reference/math/lr/#functions-lr
900        https://typst.app/docs/reference/math/lr/#functions-mid
901        https://typst.app/docs/reference/math/lr/#functions-norm
902        https://typst.app/docs/reference/math/lr/#functions-round
903        https://typst.app/docs/reference/math/mat/
904        https://typst.app/docs/reference/math/op/
905        https://typst.app/docs/reference/math/primes/
906        https://typst.app/docs/reference/math/roots/#functions-root
907        https://typst.app/docs/reference/math/roots/#functions-sqrt
908        https://typst.app/docs/reference/math/sizes/#functions-display
909        https://typst.app/docs/reference/math/sizes/#functions-inline
910        https://typst.app/docs/reference/math/sizes/#functions-script
911        https://typst.app/docs/reference/math/sizes/#functions-sscript
912        https://typst.app/docs/reference/math/stretch/
913        https://typst.app/docs/reference/math/styles/#functions-bold
914        https://typst.app/docs/reference/math/styles/#functions-italic
915        https://typst.app/docs/reference/math/styles/#functions-upright
916        https://typst.app/docs/reference/math/text/
917        https://typst.app/docs/reference/math/underover/#functions-overbrace
918        https://typst.app/docs/reference/math/underover/#functions-overbracket
919        https://typst.app/docs/reference/math/underover/#functions-overline
920        https://typst.app/docs/reference/math/underover/#functions-overparen
921        https://typst.app/docs/reference/math/underover/#functions-overshell
922        https://typst.app/docs/reference/math/underover/#functions-underbrace
923        https://typst.app/docs/reference/math/underover/#functions-underbracket
924        https://typst.app/docs/reference/math/underover/#functions-underline
925        https://typst.app/docs/reference/math/underover/#functions-underparen
926        https://typst.app/docs/reference/math/underover/#functions-undershell
927        https://typst.app/docs/reference/math/variants/#functions-bb
928        https://typst.app/docs/reference/math/variants/#functions-cal
929        https://typst.app/docs/reference/math/variants/#functions-frak
930        https://typst.app/docs/reference/math/variants/#functions-mono
931        https://typst.app/docs/reference/math/variants/#functions-sans
932        https://typst.app/docs/reference/math/variants/#functions-scr
933        https://typst.app/docs/reference/math/variants/#functions-serif
934        https://typst.app/docs/reference/math/vec/
935        https://typst.app/docs/reference/model/bibliography/
936        https://typst.app/docs/reference/model/cite/
937        https://typst.app/docs/reference/model/document/
938        https://typst.app/docs/reference/model/emph/
939        https://typst.app/docs/reference/model/entry/#definitions-body
940        https://typst.app/docs/reference/model/entry/#definitions-indented
941        https://typst.app/docs/reference/model/entry/#definitions-inner
942        https://typst.app/docs/reference/model/entry/#definitions-page
943        https://typst.app/docs/reference/model/entry/#definitions-prefix
944        https://typst.app/docs/reference/model/enum/
945        https://typst.app/docs/reference/model/enum/#definitions-item
946        https://typst.app/docs/reference/model/figure/
947        https://typst.app/docs/reference/model/figure/#definitions-caption
948        https://typst.app/docs/reference/model/footnote/
949        https://typst.app/docs/reference/model/footnote/#definitions-entry
950        https://typst.app/docs/reference/model/heading/
951        https://typst.app/docs/reference/model/link/
952        https://typst.app/docs/reference/model/list/
953        https://typst.app/docs/reference/model/list/#definitions-item
954        https://typst.app/docs/reference/model/numbering/
955        https://typst.app/docs/reference/model/outline/
956        https://typst.app/docs/reference/model/outline/#definitions-entry
957        https://typst.app/docs/reference/model/par/
958        https://typst.app/docs/reference/model/par/#definitions-line
959        https://typst.app/docs/reference/model/parbreak/
960        https://typst.app/docs/reference/model/quote/
961        https://typst.app/docs/reference/model/ref/
962        https://typst.app/docs/reference/model/strong/
963        https://typst.app/docs/reference/model/table/
964        https://typst.app/docs/reference/model/table/#definitions-cell
965        https://typst.app/docs/reference/model/table/#definitions-footer
966        https://typst.app/docs/reference/model/table/#definitions-header
967        https://typst.app/docs/reference/model/table/#definitions-hline
968        https://typst.app/docs/reference/model/table/#definitions-vline
969        https://typst.app/docs/reference/model/terms/
970        https://typst.app/docs/reference/model/terms/#definitions-item
971        https://typst.app/docs/reference/model/title/
972        https://typst.app/docs/reference/pdf/artifact/
973        https://typst.app/docs/reference/pdf/attach/
974        https://typst.app/docs/reference/text/highlight/
975        https://typst.app/docs/reference/text/linebreak/
976        https://typst.app/docs/reference/text/lorem/
977        https://typst.app/docs/reference/text/lower/
978        https://typst.app/docs/reference/text/overline/
979        https://typst.app/docs/reference/text/raw/
980        https://typst.app/docs/reference/text/raw/#definitions-line
981        https://typst.app/docs/reference/text/smallcaps/
982        https://typst.app/docs/reference/text/smartquote/
983        https://typst.app/docs/reference/text/strike/
984        https://typst.app/docs/reference/text/sub/
985        https://typst.app/docs/reference/text/super/
986        https://typst.app/docs/reference/text/underline/
987        https://typst.app/docs/reference/text/upper/
988        https://typst.app/docs/reference/visualize/circle/
989        https://typst.app/docs/reference/visualize/color/
990        https://typst.app/docs/reference/visualize/color/#definitions-cmyk
991        https://typst.app/docs/reference/visualize/color/#definitions-components
992        https://typst.app/docs/reference/visualize/color/#definitions-darken
993        https://typst.app/docs/reference/visualize/color/#definitions-desaturate
994        https://typst.app/docs/reference/visualize/color/#definitions-hsl
995        https://typst.app/docs/reference/visualize/color/#definitions-hsv
996        https://typst.app/docs/reference/visualize/color/#definitions-lighten
997        https://typst.app/docs/reference/visualize/color/#definitions-linear-rgb
998        https://typst.app/docs/reference/visualize/color/#definitions-luma
999        https://typst.app/docs/reference/visualize/color/#definitions-mix
1000        https://typst.app/docs/reference/visualize/color/#definitions-negate
1001        https://typst.app/docs/reference/visualize/color/#definitions-oklab
1002        https://typst.app/docs/reference/visualize/color/#definitions-oklch
1003        https://typst.app/docs/reference/visualize/color/#definitions-opacify
1004        https://typst.app/docs/reference/visualize/color/#definitions-rgb
1005        https://typst.app/docs/reference/visualize/color/#definitions-rotate
1006        https://typst.app/docs/reference/visualize/color/#definitions-saturate
1007        https://typst.app/docs/reference/visualize/color/#definitions-space
1008        https://typst.app/docs/reference/visualize/color/#definitions-to-hex
1009        https://typst.app/docs/reference/visualize/color/#definitions-transparentize
1010        https://typst.app/docs/reference/visualize/curve/
1011        https://typst.app/docs/reference/visualize/curve/#definitions-close
1012        https://typst.app/docs/reference/visualize/curve/#definitions-cubic
1013        https://typst.app/docs/reference/visualize/curve/#definitions-line
1014        https://typst.app/docs/reference/visualize/curve/#definitions-move
1015        https://typst.app/docs/reference/visualize/curve/#definitions-quad
1016        https://typst.app/docs/reference/visualize/ellipse/
1017        https://typst.app/docs/reference/visualize/gradient/
1018        https://typst.app/docs/reference/visualize/gradient/#definitions-angle
1019        https://typst.app/docs/reference/visualize/gradient/#definitions-center
1020        https://typst.app/docs/reference/visualize/gradient/#definitions-conic
1021        https://typst.app/docs/reference/visualize/gradient/#definitions-focal-center
1022        https://typst.app/docs/reference/visualize/gradient/#definitions-focal-radius
1023        https://typst.app/docs/reference/visualize/gradient/#definitions-kind
1024        https://typst.app/docs/reference/visualize/gradient/#definitions-linear
1025        https://typst.app/docs/reference/visualize/gradient/#definitions-radial
1026        https://typst.app/docs/reference/visualize/gradient/#definitions-radius
1027        https://typst.app/docs/reference/visualize/gradient/#definitions-relative
1028        https://typst.app/docs/reference/visualize/gradient/#definitions-repeat
1029        https://typst.app/docs/reference/visualize/gradient/#definitions-sample
1030        https://typst.app/docs/reference/visualize/gradient/#definitions-samples
1031        https://typst.app/docs/reference/visualize/gradient/#definitions-sharp
1032        https://typst.app/docs/reference/visualize/gradient/#definitions-space
1033        https://typst.app/docs/reference/visualize/gradient/#definitions-stops
1034        https://typst.app/docs/reference/visualize/image/
1035        https://typst.app/docs/reference/visualize/image/#definitions-decode
1036        https://typst.app/docs/reference/visualize/line/
1037        https://typst.app/docs/reference/visualize/path/
1038        https://typst.app/docs/reference/visualize/polygon/
1039        https://typst.app/docs/reference/visualize/polygon/#definitions-regular
1040        https://typst.app/docs/reference/visualize/rect/
1041        https://typst.app/docs/reference/visualize/square/
1042        https://typst.app/docs/reference/visualize/stroke/
1043        https://typst.app/docs/reference/visualize/tiling/
1044        ");
1045    }
1046}