tinymist/crates/tinymist-analysis/src/upstream/mod.rs
QuadnucYard ce447185d1
Some checks are pending
tinymist::auto_tag / auto-tag (push) Waiting to run
tinymist::ci / Duplicate Actions Detection (push) Waiting to run
tinymist::ci / Check Clippy, Formatting, Completion, Documentation, and Tests (Linux) (push) Waiting to run
tinymist::ci / Check Minimum Rust version and Tests (Windows) (push) Waiting to run
tinymist::ci / prepare-build (push) Waiting to run
tinymist::ci / announce (push) Blocked by required conditions
tinymist::ci / build (push) Blocked by required conditions
tinymist::gh_pages / build-gh-pages (push) Waiting to run
dev: drop if_chain and collapse if statements (#2097)
2025-09-01 16:46:54 +08:00

917 lines
44 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! Functions from typst-ide
use std::{collections::HashMap, fmt::Write, sync::LazyLock};
use comemo::Tracked;
use ecow::{EcoString, eco_format};
use serde::Deserialize;
use serde_yaml as yaml;
use typst::{
Category, Library, World,
diag::{StrResult, bail},
foundations::{Binding, Content, Func, Module, Type, Value},
introspection::MetadataElem,
syntax::Span,
text::{FontInfo, FontStyle},
};
mod tooltip;
pub use tooltip::*;
/// Extract the first sentence of plain text of a piece of documentation.
///
/// Removes Markdown formatting.
pub fn plain_docs_sentence(docs: &str) -> EcoString {
crate::log_debug_ct!("plain docs {docs:?}");
let docs = docs.replace("```example", "```typ");
let mut scanner = unscanny::Scanner::new(&docs);
let mut output = EcoString::new();
let mut link = false;
while let Some(ch) = scanner.eat() {
match ch {
'`' => {
let mut raw = scanner.eat_until('`');
if (raw.starts_with('{') && raw.ends_with('}'))
|| (raw.starts_with('[') && raw.ends_with(']'))
{
raw = &raw[1..raw.len() - 1];
}
scanner.eat();
output.push('`');
output.push_str(raw);
output.push('`');
}
'[' => {
link = true;
output.push('[');
}
']' if link => {
output.push(']');
let cursor = scanner.cursor();
if scanner.eat_if('(') {
scanner.eat_until(')');
let link_content = scanner.from(cursor + 1);
scanner.eat();
crate::log_debug_ct!("Intra Link: {link_content}");
let link = resolve(link_content, "https://typst.app/docs/").ok();
let link = link.unwrap_or_else(|| {
log::warn!("Failed to resolve link: {link_content}");
"https://typst.app/docs/404.html".to_string()
});
output.push('(');
output.push_str(&link);
output.push(')');
} else if scanner.eat_if('[') {
scanner.eat_until(']');
scanner.eat();
output.push_str(scanner.from(cursor));
}
link = false
}
// '*' | '_' => {}
// '.' => {
// output.push('.');
// break;
// }
_ => output.push(ch),
}
}
output
}
/// Data about a collection of functions.
#[derive(Debug, Clone, Deserialize)]
struct GroupData {
name: EcoString,
// title: EcoString,
category: EcoString,
#[serde(default)]
path: Vec<EcoString>,
#[serde(default)]
filter: Vec<EcoString>,
// details: EcoString,
}
impl GroupData {
fn module(&self) -> &'static Module {
let mut focus = &LIBRARY.global;
for path in &self.path {
focus = get_module(focus, path).unwrap();
}
focus
}
}
static GROUPS: LazyLock<Vec<GroupData>> = LazyLock::new(|| {
let mut groups: Vec<GroupData> = yaml::from_str(include_str!("groups.yml")).unwrap();
for group in &mut groups {
if group.filter.is_empty() {
group.filter = group
.module()
.scope()
.iter()
.filter(|(_, v)| matches!(v.read(), Value::Func(_)))
.map(|(k, _)| k.clone())
.collect();
}
}
groups
});
/// Resolve an intra-doc link.
pub fn resolve(link: &str, base: &str) -> StrResult<String> {
if link.starts_with('#') || link.starts_with("http") {
return Ok(link.to_string());
}
let (head, tail) = split_link(link)?;
let mut route = match resolve_known(head, base) {
Some(route) => route,
None => resolve_definition(head, base)?,
};
if !tail.is_empty() {
route.push('/');
route.push_str(tail);
}
if !route.contains(['#', '?']) && !route.ends_with('/') {
route.push('/');
}
Ok(route)
}
/// Split a link at the first slash.
fn split_link(link: &str) -> StrResult<(&str, &str)> {
let first = link.split('/').next().unwrap_or(link);
let rest = link[first.len()..].trim_start_matches('/');
Ok((first, rest))
}
/// Resolve a `$` link head to a known destination.
fn resolve_known(head: &str, base: &str) -> Option<String> {
Some(match head {
"$tutorial" => format!("{base}tutorial"),
"$reference" => format!("{base}reference"),
"$category" => format!("{base}reference"),
"$syntax" => format!("{base}reference/syntax"),
"$styling" => format!("{base}reference/styling"),
"$scripting" => format!("{base}reference/scripting"),
"$context" => format!("{base}reference/context"),
"$guides" => format!("{base}guides"),
"$changelog" => format!("{base}changelog"),
"$community" => format!("{base}community"),
"$universe" => "https://typst.app/universe".into(),
_ => return None,
})
}
static LIBRARY: LazyLock<Library> = LazyLock::new(Library::default);
/// Extract a module from another module.
#[track_caller]
fn get_module<'a>(parent: &'a Module, name: &str) -> StrResult<&'a Module> {
match parent.scope().get(name).map(|x| x.read()) {
Some(Value::Module(module)) => Ok(module),
_ => bail!("module doesn't contain module `{name}`"),
}
}
/// Resolve a `$` link to a global definition.
fn resolve_definition(head: &str, base: &str) -> StrResult<String> {
let mut parts = head.trim_start_matches('$').split('.').peekable();
let mut focus = &LIBRARY.global;
let mut category = None;
while let Some(name) = parts.peek() {
if category.is_none() {
category = focus.scope().get(name).and_then(Binding::category);
}
let Ok(module) = get_module(focus, name) else {
break;
};
focus = module;
parts.next();
}
let Some(category) = category else {
bail!("{head} has no category")
};
let name = parts.next().ok_or("link is missing first part")?;
let value = focus.field(name, ())?;
// Handle grouped functions.
if let Some(group) = GROUPS.iter().find(|group| {
group.category == category.name() && group.filter.iter().any(|func| func == name)
}) {
let mut route = format!(
"{}reference/{}/{}/#functions-{}",
base, group.category, group.name, name
);
if let Some(param) = parts.next() {
route.push('-');
route.push_str(param);
}
return Ok(route);
}
let mut route = format!("{}reference/{}/{name}", base, category.name());
if let Some(next) = parts.next() {
if let Ok(field) = value.field(next, ()) {
route.push_str("/#definitions-");
route.push_str(next);
if let Some(next) = parts.next()
&& field
.cast::<Func>()
.is_ok_and(|func| func.param(next).is_some())
{
route.push('-');
route.push_str(next);
}
} else if value
.clone()
.cast::<Func>()
.is_ok_and(|func| func.param(next).is_some())
{
route.push_str("/#parameters-");
route.push_str(next);
} else {
bail!("field {next} not found");
}
}
Ok(route)
}
#[allow(clippy::derived_hash_with_manual_eq)]
#[derive(Debug, Clone, Hash)]
enum CatKey {
Func(Func),
Type(Type),
}
impl PartialEq for CatKey {
fn eq(&self, other: &Self) -> bool {
use typst::foundations::func::Repr::*;
match (self, other) {
(CatKey::Func(a), CatKey::Func(b)) => match (a.inner(), b.inner()) {
(Native(a), Native(b)) => a == b,
(Element(a), Element(b)) => a == b,
_ => false,
},
(CatKey::Type(a), CatKey::Type(b)) => a == b,
_ => false,
}
}
}
impl Eq for CatKey {}
// todo: category of types
static ROUTE_MAPS: LazyLock<HashMap<CatKey, String>> = LazyLock::new(|| {
// todo: this is a false positive for clippy on LazyHash
#[allow(clippy::mutable_key_type)]
let mut map = HashMap::new();
let mut scope_to_finds = vec![
(LIBRARY.global.scope(), None, None),
(LIBRARY.math.scope(), None, None),
];
while let Some((scope, parent_name, cat)) = scope_to_finds.pop() {
for (name, bind) in scope.iter() {
let cat = cat.or_else(|| bind.category());
let name = urlify(name);
match bind.read() {
Value::Func(func) => {
if let Some(cat) = cat {
let Some(name) = func.name() else {
continue;
};
// Handle grouped functions.
if let Some(group) = GROUPS.iter().find(|group| {
group.category == cat.name()
&& group.filter.iter().any(|func| func == name)
}) {
let route = format!(
"reference/{}/{}/#functions-{name}",
group.category, group.name
);
map.insert(CatKey::Func(func.clone()), route);
continue;
}
crate::log_debug_ct!("func: {func:?} -> {cat:?}");
let route = format_route(parent_name.as_deref(), name, &cat);
map.insert(CatKey::Func(func.clone()), route);
}
if let Some(s) = func.scope() {
scope_to_finds.push((s, Some(name), cat));
}
}
Value::Type(t) => {
if let Some(cat) = cat {
crate::log_debug_ct!("type: {t:?} -> {cat:?}");
let route = format_route(parent_name.as_deref(), &name, &cat);
// Some types are defined multiple times, and the first one should take precedence.
//
// For example, typst 0.13.0 renamed `pattern` to `tiling`, but keep `pattern` remains as a deprecated alias.
// Therefore, `Tiling` is first defined as `tiling`, then defined as `pattern` with deprecation again.
// https://typst.app/docs/changelog/0.13.0/#visualization
// https://github.com/typst/typst/blob/9a6268050fb769e18c4889fa5f59d4150e8878d6/crates/typst-library/src/visualize/mod.rs#L34
// https://github.com/typst/typst/blob/9a6268050fb769e18c4889fa5f59d4150e8878d6/crates/typst-library/src/visualize/mod.rs#L47-L49
map.entry(CatKey::Type(*t)).or_insert(route);
}
scope_to_finds.push((t.scope(), Some(name), cat));
}
Value::Module(module) => {
scope_to_finds.push((module.scope(), Some(name), cat));
}
_ => {}
}
}
}
map
});
fn format_route(parent_name: Option<&str>, name: &str, cat: &Category) -> String {
match parent_name {
Some(parent_name) if parent_name != cat.name() => {
format!("reference/{}/{parent_name}/#definitions-{name}", cat.name())
}
Some(_) | None => format!("reference/{}/{name}/", cat.name()),
}
}
/// Turn a title into an URL fragment.
pub(crate) fn urlify(title: &str) -> EcoString {
title
.chars()
.map(|ch| ch.to_ascii_lowercase())
.map(|ch| match ch {
'a'..='z' | '0'..='9' => ch,
_ => '-',
})
.collect()
}
/// Get the route of a value.
pub fn route_of_value(val: &Value) -> Option<&'static String> {
// ROUTE_MAPS.get(&CatKey::Func(k.clone()))
let key = match val {
Value::Func(func) => CatKey::Func(func.clone()),
Value::Type(ty) => CatKey::Type(*ty),
_ => return None,
};
ROUTE_MAPS.get(&key)
}
/// Create a short description of a font family.
pub fn summarize_font_family<'a>(variants: impl Iterator<Item = &'a FontInfo>) -> EcoString {
let mut infos: Vec<_> = variants.collect();
infos.sort_by_key(|info: &&FontInfo| info.variant);
let mut has_italic = false;
let mut min_weight = u16::MAX;
let mut max_weight = 0;
for info in &infos {
let weight = info.variant.weight.to_number();
has_italic |= info.variant.style == FontStyle::Italic;
min_weight = min_weight.min(weight);
max_weight = min_weight.max(weight);
}
let count = infos.len();
let mut detail = eco_format!("{count} variant{}.", if count == 1 { "" } else { "s" });
if min_weight == max_weight {
write!(detail, " Weight {min_weight}.").unwrap();
} else {
write!(detail, " Weights {min_weight}{max_weight}.").unwrap();
}
if has_italic {
detail.push_str(" Has italics.");
}
detail
}
/// Get the representation but truncated to a certain size.
pub fn truncated_repr_<const SZ_LIMIT: usize>(value: &Value) -> EcoString {
use typst::foundations::Repr;
let data: Option<Content> = value.clone().cast().ok();
let metadata: Option<MetadataElem> = data.and_then(|content| content.unpack().ok());
// todo: early truncation
let repr = if let Some(metadata) = metadata {
metadata.value.repr()
} else {
value.repr()
};
if repr.len() > SZ_LIMIT {
eco_format!("[truncated-repr: {} bytes]", repr.len())
} else {
repr
}
}
/// Get the representation but truncated to a certain size.
pub fn truncated_repr(value: &Value) -> EcoString {
const _10MB: usize = 10 * 1024 * 1024;
truncated_repr_::<_10MB>(value)
}
/// Run a function with a VM instance in the world
pub fn with_vm<T>(
world: Tracked<dyn World + '_>,
f: impl FnOnce(&mut typst_shim::eval::Vm) -> T,
) -> T {
use comemo::Track;
use typst::engine::*;
use typst::foundations::*;
use typst::introspection::*;
use typst_shim::eval::*;
let introspector = Introspector::default();
let traced = Traced::default();
let mut sink = Sink::new();
let engine = Engine {
routines: &typst::ROUTINES,
world,
route: Route::default(),
introspector: introspector.track(),
traced: traced.track(),
sink: sink.track_mut(),
};
let context = Context::none();
let mut vm = Vm::new(
engine,
context.track(),
Scopes::new(Some(world.library())),
Span::detached(),
);
f(&mut vm)
}
#[cfg(test)]
mod tests {
use crate::upstream::ROUTE_MAPS;
#[test]
fn docs_test() {
assert_eq!(
"[citation](https://typst.app/docs/reference/model/cite/)",
super::plain_docs_sentence("[citation]($cite)")
);
assert_eq!(
"[citation][cite]",
super::plain_docs_sentence("[citation][cite]")
);
assert_eq!(
"[citation](https://typst.app/docs/reference/model/cite/)",
super::plain_docs_sentence("[citation]($cite)")
);
assert_eq!(
"[citation][cite][cite2]",
super::plain_docs_sentence("[citation][cite][cite2]")
);
assert_eq!(
"[citation][cite](test)[cite2]",
super::plain_docs_sentence("[citation][cite](test)[cite2]")
);
}
#[test]
fn routes() {
let access = |route: &String| format!("https://typst.app/docs/{route}");
let mut values = ROUTE_MAPS.values().map(access).collect::<Vec<_>>();
values.sort();
insta::assert_snapshot!(values.as_slice().join("\n"), @r###"
https://typst.app/docs/reference/data-loading/cbor/
https://typst.app/docs/reference/data-loading/cbor/#definitions-decode
https://typst.app/docs/reference/data-loading/cbor/#definitions-encode
https://typst.app/docs/reference/data-loading/csv/
https://typst.app/docs/reference/data-loading/csv/#definitions-decode
https://typst.app/docs/reference/data-loading/json/
https://typst.app/docs/reference/data-loading/json/#definitions-decode
https://typst.app/docs/reference/data-loading/json/#definitions-encode
https://typst.app/docs/reference/data-loading/read/
https://typst.app/docs/reference/data-loading/toml/
https://typst.app/docs/reference/data-loading/toml/#definitions-decode
https://typst.app/docs/reference/data-loading/toml/#definitions-encode
https://typst.app/docs/reference/data-loading/xml/
https://typst.app/docs/reference/data-loading/xml/#definitions-decode
https://typst.app/docs/reference/data-loading/yaml/
https://typst.app/docs/reference/data-loading/yaml/#definitions-decode
https://typst.app/docs/reference/data-loading/yaml/#definitions-encode
https://typst.app/docs/reference/foundations/arguments/
https://typst.app/docs/reference/foundations/arguments/#definitions-at
https://typst.app/docs/reference/foundations/arguments/#definitions-named
https://typst.app/docs/reference/foundations/arguments/#definitions-pos
https://typst.app/docs/reference/foundations/array/
https://typst.app/docs/reference/foundations/array/#definitions-all
https://typst.app/docs/reference/foundations/array/#definitions-any
https://typst.app/docs/reference/foundations/array/#definitions-at
https://typst.app/docs/reference/foundations/array/#definitions-chunks
https://typst.app/docs/reference/foundations/array/#definitions-contains
https://typst.app/docs/reference/foundations/array/#definitions-dedup
https://typst.app/docs/reference/foundations/array/#definitions-enumerate
https://typst.app/docs/reference/foundations/array/#definitions-filter
https://typst.app/docs/reference/foundations/array/#definitions-find
https://typst.app/docs/reference/foundations/array/#definitions-first
https://typst.app/docs/reference/foundations/array/#definitions-flatten
https://typst.app/docs/reference/foundations/array/#definitions-fold
https://typst.app/docs/reference/foundations/array/#definitions-insert
https://typst.app/docs/reference/foundations/array/#definitions-intersperse
https://typst.app/docs/reference/foundations/array/#definitions-join
https://typst.app/docs/reference/foundations/array/#definitions-last
https://typst.app/docs/reference/foundations/array/#definitions-len
https://typst.app/docs/reference/foundations/array/#definitions-map
https://typst.app/docs/reference/foundations/array/#definitions-pop
https://typst.app/docs/reference/foundations/array/#definitions-position
https://typst.app/docs/reference/foundations/array/#definitions-product
https://typst.app/docs/reference/foundations/array/#definitions-push
https://typst.app/docs/reference/foundations/array/#definitions-range
https://typst.app/docs/reference/foundations/array/#definitions-reduce
https://typst.app/docs/reference/foundations/array/#definitions-remove
https://typst.app/docs/reference/foundations/array/#definitions-rev
https://typst.app/docs/reference/foundations/array/#definitions-slice
https://typst.app/docs/reference/foundations/array/#definitions-sorted
https://typst.app/docs/reference/foundations/array/#definitions-split
https://typst.app/docs/reference/foundations/array/#definitions-sum
https://typst.app/docs/reference/foundations/array/#definitions-to-dict
https://typst.app/docs/reference/foundations/array/#definitions-windows
https://typst.app/docs/reference/foundations/array/#definitions-zip
https://typst.app/docs/reference/foundations/assert/
https://typst.app/docs/reference/foundations/assert/#definitions-eq
https://typst.app/docs/reference/foundations/assert/#definitions-ne
https://typst.app/docs/reference/foundations/bool/
https://typst.app/docs/reference/foundations/bytes/
https://typst.app/docs/reference/foundations/bytes/#definitions-at
https://typst.app/docs/reference/foundations/bytes/#definitions-len
https://typst.app/docs/reference/foundations/bytes/#definitions-slice
https://typst.app/docs/reference/foundations/calc/#functions-abs
https://typst.app/docs/reference/foundations/calc/#functions-acos
https://typst.app/docs/reference/foundations/calc/#functions-asin
https://typst.app/docs/reference/foundations/calc/#functions-atan
https://typst.app/docs/reference/foundations/calc/#functions-atan2
https://typst.app/docs/reference/foundations/calc/#functions-binom
https://typst.app/docs/reference/foundations/calc/#functions-ceil
https://typst.app/docs/reference/foundations/calc/#functions-clamp
https://typst.app/docs/reference/foundations/calc/#functions-cos
https://typst.app/docs/reference/foundations/calc/#functions-cosh
https://typst.app/docs/reference/foundations/calc/#functions-div-euclid
https://typst.app/docs/reference/foundations/calc/#functions-even
https://typst.app/docs/reference/foundations/calc/#functions-exp
https://typst.app/docs/reference/foundations/calc/#functions-fact
https://typst.app/docs/reference/foundations/calc/#functions-floor
https://typst.app/docs/reference/foundations/calc/#functions-fract
https://typst.app/docs/reference/foundations/calc/#functions-gcd
https://typst.app/docs/reference/foundations/calc/#functions-lcm
https://typst.app/docs/reference/foundations/calc/#functions-ln
https://typst.app/docs/reference/foundations/calc/#functions-log
https://typst.app/docs/reference/foundations/calc/#functions-max
https://typst.app/docs/reference/foundations/calc/#functions-min
https://typst.app/docs/reference/foundations/calc/#functions-norm
https://typst.app/docs/reference/foundations/calc/#functions-odd
https://typst.app/docs/reference/foundations/calc/#functions-perm
https://typst.app/docs/reference/foundations/calc/#functions-pow
https://typst.app/docs/reference/foundations/calc/#functions-quo
https://typst.app/docs/reference/foundations/calc/#functions-rem
https://typst.app/docs/reference/foundations/calc/#functions-rem-euclid
https://typst.app/docs/reference/foundations/calc/#functions-root
https://typst.app/docs/reference/foundations/calc/#functions-round
https://typst.app/docs/reference/foundations/calc/#functions-sin
https://typst.app/docs/reference/foundations/calc/#functions-sinh
https://typst.app/docs/reference/foundations/calc/#functions-sqrt
https://typst.app/docs/reference/foundations/calc/#functions-tan
https://typst.app/docs/reference/foundations/calc/#functions-tanh
https://typst.app/docs/reference/foundations/calc/#functions-trunc
https://typst.app/docs/reference/foundations/content/
https://typst.app/docs/reference/foundations/content/#definitions-at
https://typst.app/docs/reference/foundations/content/#definitions-fields
https://typst.app/docs/reference/foundations/content/#definitions-func
https://typst.app/docs/reference/foundations/content/#definitions-has
https://typst.app/docs/reference/foundations/content/#definitions-location
https://typst.app/docs/reference/foundations/datetime/
https://typst.app/docs/reference/foundations/datetime/#definitions-day
https://typst.app/docs/reference/foundations/datetime/#definitions-display
https://typst.app/docs/reference/foundations/datetime/#definitions-hour
https://typst.app/docs/reference/foundations/datetime/#definitions-minute
https://typst.app/docs/reference/foundations/datetime/#definitions-month
https://typst.app/docs/reference/foundations/datetime/#definitions-ordinal
https://typst.app/docs/reference/foundations/datetime/#definitions-second
https://typst.app/docs/reference/foundations/datetime/#definitions-today
https://typst.app/docs/reference/foundations/datetime/#definitions-weekday
https://typst.app/docs/reference/foundations/datetime/#definitions-year
https://typst.app/docs/reference/foundations/decimal/
https://typst.app/docs/reference/foundations/dictionary/
https://typst.app/docs/reference/foundations/dictionary/#definitions-at
https://typst.app/docs/reference/foundations/dictionary/#definitions-insert
https://typst.app/docs/reference/foundations/dictionary/#definitions-keys
https://typst.app/docs/reference/foundations/dictionary/#definitions-len
https://typst.app/docs/reference/foundations/dictionary/#definitions-pairs
https://typst.app/docs/reference/foundations/dictionary/#definitions-remove
https://typst.app/docs/reference/foundations/dictionary/#definitions-values
https://typst.app/docs/reference/foundations/duration/
https://typst.app/docs/reference/foundations/duration/#definitions-days
https://typst.app/docs/reference/foundations/duration/#definitions-hours
https://typst.app/docs/reference/foundations/duration/#definitions-minutes
https://typst.app/docs/reference/foundations/duration/#definitions-seconds
https://typst.app/docs/reference/foundations/duration/#definitions-weeks
https://typst.app/docs/reference/foundations/eval/
https://typst.app/docs/reference/foundations/float/
https://typst.app/docs/reference/foundations/float/#definitions-from-bytes
https://typst.app/docs/reference/foundations/float/#definitions-is-infinite
https://typst.app/docs/reference/foundations/float/#definitions-is-nan
https://typst.app/docs/reference/foundations/float/#definitions-signum
https://typst.app/docs/reference/foundations/float/#definitions-to-bytes
https://typst.app/docs/reference/foundations/function/
https://typst.app/docs/reference/foundations/function/#definitions-where
https://typst.app/docs/reference/foundations/function/#definitions-with
https://typst.app/docs/reference/foundations/int/
https://typst.app/docs/reference/foundations/int/#definitions-bit-and
https://typst.app/docs/reference/foundations/int/#definitions-bit-lshift
https://typst.app/docs/reference/foundations/int/#definitions-bit-not
https://typst.app/docs/reference/foundations/int/#definitions-bit-or
https://typst.app/docs/reference/foundations/int/#definitions-bit-rshift
https://typst.app/docs/reference/foundations/int/#definitions-bit-xor
https://typst.app/docs/reference/foundations/int/#definitions-from-bytes
https://typst.app/docs/reference/foundations/int/#definitions-signum
https://typst.app/docs/reference/foundations/int/#definitions-to-bytes
https://typst.app/docs/reference/foundations/label/
https://typst.app/docs/reference/foundations/module/
https://typst.app/docs/reference/foundations/panic/
https://typst.app/docs/reference/foundations/plugin/
https://typst.app/docs/reference/foundations/plugin/#definitions-transition
https://typst.app/docs/reference/foundations/regex/
https://typst.app/docs/reference/foundations/repr/
https://typst.app/docs/reference/foundations/selector/
https://typst.app/docs/reference/foundations/selector/#definitions-after
https://typst.app/docs/reference/foundations/selector/#definitions-and
https://typst.app/docs/reference/foundations/selector/#definitions-before
https://typst.app/docs/reference/foundations/selector/#definitions-or
https://typst.app/docs/reference/foundations/str/
https://typst.app/docs/reference/foundations/str/#definitions-at
https://typst.app/docs/reference/foundations/str/#definitions-clusters
https://typst.app/docs/reference/foundations/str/#definitions-codepoints
https://typst.app/docs/reference/foundations/str/#definitions-contains
https://typst.app/docs/reference/foundations/str/#definitions-ends-with
https://typst.app/docs/reference/foundations/str/#definitions-find
https://typst.app/docs/reference/foundations/str/#definitions-first
https://typst.app/docs/reference/foundations/str/#definitions-from-unicode
https://typst.app/docs/reference/foundations/str/#definitions-last
https://typst.app/docs/reference/foundations/str/#definitions-len
https://typst.app/docs/reference/foundations/str/#definitions-match
https://typst.app/docs/reference/foundations/str/#definitions-matches
https://typst.app/docs/reference/foundations/str/#definitions-position
https://typst.app/docs/reference/foundations/str/#definitions-replace
https://typst.app/docs/reference/foundations/str/#definitions-rev
https://typst.app/docs/reference/foundations/str/#definitions-slice
https://typst.app/docs/reference/foundations/str/#definitions-split
https://typst.app/docs/reference/foundations/str/#definitions-starts-with
https://typst.app/docs/reference/foundations/str/#definitions-to-unicode
https://typst.app/docs/reference/foundations/str/#definitions-trim
https://typst.app/docs/reference/foundations/symbol/
https://typst.app/docs/reference/foundations/type/
https://typst.app/docs/reference/foundations/version/
https://typst.app/docs/reference/foundations/version/#definitions-at
https://typst.app/docs/reference/introspection/counter/
https://typst.app/docs/reference/introspection/counter/#definitions-at
https://typst.app/docs/reference/introspection/counter/#definitions-display
https://typst.app/docs/reference/introspection/counter/#definitions-final
https://typst.app/docs/reference/introspection/counter/#definitions-get
https://typst.app/docs/reference/introspection/counter/#definitions-step
https://typst.app/docs/reference/introspection/counter/#definitions-update
https://typst.app/docs/reference/introspection/here/
https://typst.app/docs/reference/introspection/locate/
https://typst.app/docs/reference/introspection/location/
https://typst.app/docs/reference/introspection/location/#definitions-page
https://typst.app/docs/reference/introspection/location/#definitions-page-numbering
https://typst.app/docs/reference/introspection/location/#definitions-position
https://typst.app/docs/reference/introspection/metadata/
https://typst.app/docs/reference/introspection/query/
https://typst.app/docs/reference/introspection/state/
https://typst.app/docs/reference/introspection/state/#definitions-at
https://typst.app/docs/reference/introspection/state/#definitions-final
https://typst.app/docs/reference/introspection/state/#definitions-get
https://typst.app/docs/reference/introspection/state/#definitions-update
https://typst.app/docs/reference/layout/align/
https://typst.app/docs/reference/layout/alignment/
https://typst.app/docs/reference/layout/alignment/#definitions-axis
https://typst.app/docs/reference/layout/alignment/#definitions-inv
https://typst.app/docs/reference/layout/angle/
https://typst.app/docs/reference/layout/angle/#definitions-deg
https://typst.app/docs/reference/layout/angle/#definitions-rad
https://typst.app/docs/reference/layout/block/
https://typst.app/docs/reference/layout/box/
https://typst.app/docs/reference/layout/colbreak/
https://typst.app/docs/reference/layout/columns/
https://typst.app/docs/reference/layout/direction/
https://typst.app/docs/reference/layout/direction/#definitions-axis
https://typst.app/docs/reference/layout/direction/#definitions-end
https://typst.app/docs/reference/layout/direction/#definitions-inv
https://typst.app/docs/reference/layout/direction/#definitions-start
https://typst.app/docs/reference/layout/fraction/
https://typst.app/docs/reference/layout/grid/
https://typst.app/docs/reference/layout/grid/#definitions-cell
https://typst.app/docs/reference/layout/grid/#definitions-footer
https://typst.app/docs/reference/layout/grid/#definitions-header
https://typst.app/docs/reference/layout/grid/#definitions-hline
https://typst.app/docs/reference/layout/grid/#definitions-vline
https://typst.app/docs/reference/layout/h/
https://typst.app/docs/reference/layout/hide/
https://typst.app/docs/reference/layout/layout/
https://typst.app/docs/reference/layout/length/
https://typst.app/docs/reference/layout/length/#definitions-cm
https://typst.app/docs/reference/layout/length/#definitions-inches
https://typst.app/docs/reference/layout/length/#definitions-mm
https://typst.app/docs/reference/layout/length/#definitions-pt
https://typst.app/docs/reference/layout/length/#definitions-to-absolute
https://typst.app/docs/reference/layout/measure/
https://typst.app/docs/reference/layout/move/
https://typst.app/docs/reference/layout/pad/
https://typst.app/docs/reference/layout/page/
https://typst.app/docs/reference/layout/pagebreak/
https://typst.app/docs/reference/layout/place/
https://typst.app/docs/reference/layout/place/#definitions-flush
https://typst.app/docs/reference/layout/ratio/
https://typst.app/docs/reference/layout/relative/
https://typst.app/docs/reference/layout/repeat/
https://typst.app/docs/reference/layout/rotate/
https://typst.app/docs/reference/layout/scale/
https://typst.app/docs/reference/layout/skew/
https://typst.app/docs/reference/layout/stack/
https://typst.app/docs/reference/layout/v/
https://typst.app/docs/reference/math/accent/
https://typst.app/docs/reference/math/attach/#functions-attach
https://typst.app/docs/reference/math/attach/#functions-limits
https://typst.app/docs/reference/math/attach/#functions-scripts
https://typst.app/docs/reference/math/binom/
https://typst.app/docs/reference/math/cancel/
https://typst.app/docs/reference/math/cases/
https://typst.app/docs/reference/math/class/
https://typst.app/docs/reference/math/equation/
https://typst.app/docs/reference/math/frac/
https://typst.app/docs/reference/math/lr/#functions-abs
https://typst.app/docs/reference/math/lr/#functions-lr
https://typst.app/docs/reference/math/lr/#functions-mid
https://typst.app/docs/reference/math/lr/#functions-norm
https://typst.app/docs/reference/math/lr/#functions-round
https://typst.app/docs/reference/math/mat/
https://typst.app/docs/reference/math/op/
https://typst.app/docs/reference/math/primes/
https://typst.app/docs/reference/math/roots/#functions-root
https://typst.app/docs/reference/math/roots/#functions-sqrt
https://typst.app/docs/reference/math/sizes/#functions-display
https://typst.app/docs/reference/math/sizes/#functions-inline
https://typst.app/docs/reference/math/sizes/#functions-script
https://typst.app/docs/reference/math/sizes/#functions-sscript
https://typst.app/docs/reference/math/stretch/
https://typst.app/docs/reference/math/styles/#functions-bold
https://typst.app/docs/reference/math/styles/#functions-italic
https://typst.app/docs/reference/math/styles/#functions-upright
https://typst.app/docs/reference/math/text/
https://typst.app/docs/reference/math/underover/#functions-overbrace
https://typst.app/docs/reference/math/underover/#functions-overbracket
https://typst.app/docs/reference/math/underover/#functions-overline
https://typst.app/docs/reference/math/underover/#functions-overparen
https://typst.app/docs/reference/math/underover/#functions-overshell
https://typst.app/docs/reference/math/underover/#functions-underbrace
https://typst.app/docs/reference/math/underover/#functions-underbracket
https://typst.app/docs/reference/math/underover/#functions-underline
https://typst.app/docs/reference/math/underover/#functions-underparen
https://typst.app/docs/reference/math/underover/#functions-undershell
https://typst.app/docs/reference/math/variants/#functions-bb
https://typst.app/docs/reference/math/variants/#functions-cal
https://typst.app/docs/reference/math/variants/#functions-frak
https://typst.app/docs/reference/math/variants/#functions-mono
https://typst.app/docs/reference/math/variants/#functions-sans
https://typst.app/docs/reference/math/variants/#functions-serif
https://typst.app/docs/reference/math/vec/
https://typst.app/docs/reference/model/bibliography/
https://typst.app/docs/reference/model/cite/
https://typst.app/docs/reference/model/document/
https://typst.app/docs/reference/model/emph/
https://typst.app/docs/reference/model/entry/#definitions-body
https://typst.app/docs/reference/model/entry/#definitions-indented
https://typst.app/docs/reference/model/entry/#definitions-inner
https://typst.app/docs/reference/model/entry/#definitions-page
https://typst.app/docs/reference/model/entry/#definitions-prefix
https://typst.app/docs/reference/model/enum/
https://typst.app/docs/reference/model/enum/#definitions-item
https://typst.app/docs/reference/model/figure/
https://typst.app/docs/reference/model/figure/#definitions-caption
https://typst.app/docs/reference/model/footnote/
https://typst.app/docs/reference/model/footnote/#definitions-entry
https://typst.app/docs/reference/model/heading/
https://typst.app/docs/reference/model/link/
https://typst.app/docs/reference/model/list/
https://typst.app/docs/reference/model/list/#definitions-item
https://typst.app/docs/reference/model/numbering/
https://typst.app/docs/reference/model/outline/
https://typst.app/docs/reference/model/outline/#definitions-entry
https://typst.app/docs/reference/model/par/
https://typst.app/docs/reference/model/par/#definitions-line
https://typst.app/docs/reference/model/parbreak/
https://typst.app/docs/reference/model/quote/
https://typst.app/docs/reference/model/ref/
https://typst.app/docs/reference/model/strong/
https://typst.app/docs/reference/model/table/
https://typst.app/docs/reference/model/table/#definitions-cell
https://typst.app/docs/reference/model/table/#definitions-footer
https://typst.app/docs/reference/model/table/#definitions-header
https://typst.app/docs/reference/model/table/#definitions-hline
https://typst.app/docs/reference/model/table/#definitions-vline
https://typst.app/docs/reference/model/terms/
https://typst.app/docs/reference/model/terms/#definitions-item
https://typst.app/docs/reference/pdf/embed/
https://typst.app/docs/reference/text/highlight/
https://typst.app/docs/reference/text/linebreak/
https://typst.app/docs/reference/text/lorem/
https://typst.app/docs/reference/text/lower/
https://typst.app/docs/reference/text/overline/
https://typst.app/docs/reference/text/raw/
https://typst.app/docs/reference/text/raw/#definitions-line
https://typst.app/docs/reference/text/smallcaps/
https://typst.app/docs/reference/text/smartquote/
https://typst.app/docs/reference/text/strike/
https://typst.app/docs/reference/text/sub/
https://typst.app/docs/reference/text/super/
https://typst.app/docs/reference/text/underline/
https://typst.app/docs/reference/text/upper/
https://typst.app/docs/reference/visualize/circle/
https://typst.app/docs/reference/visualize/color/
https://typst.app/docs/reference/visualize/color/#definitions-cmyk
https://typst.app/docs/reference/visualize/color/#definitions-components
https://typst.app/docs/reference/visualize/color/#definitions-darken
https://typst.app/docs/reference/visualize/color/#definitions-desaturate
https://typst.app/docs/reference/visualize/color/#definitions-hsl
https://typst.app/docs/reference/visualize/color/#definitions-hsv
https://typst.app/docs/reference/visualize/color/#definitions-lighten
https://typst.app/docs/reference/visualize/color/#definitions-linear-rgb
https://typst.app/docs/reference/visualize/color/#definitions-luma
https://typst.app/docs/reference/visualize/color/#definitions-mix
https://typst.app/docs/reference/visualize/color/#definitions-negate
https://typst.app/docs/reference/visualize/color/#definitions-oklab
https://typst.app/docs/reference/visualize/color/#definitions-oklch
https://typst.app/docs/reference/visualize/color/#definitions-opacify
https://typst.app/docs/reference/visualize/color/#definitions-rgb
https://typst.app/docs/reference/visualize/color/#definitions-rotate
https://typst.app/docs/reference/visualize/color/#definitions-saturate
https://typst.app/docs/reference/visualize/color/#definitions-space
https://typst.app/docs/reference/visualize/color/#definitions-to-hex
https://typst.app/docs/reference/visualize/color/#definitions-transparentize
https://typst.app/docs/reference/visualize/curve/
https://typst.app/docs/reference/visualize/curve/#definitions-close
https://typst.app/docs/reference/visualize/curve/#definitions-cubic
https://typst.app/docs/reference/visualize/curve/#definitions-line
https://typst.app/docs/reference/visualize/curve/#definitions-move
https://typst.app/docs/reference/visualize/curve/#definitions-quad
https://typst.app/docs/reference/visualize/ellipse/
https://typst.app/docs/reference/visualize/gradient/
https://typst.app/docs/reference/visualize/gradient/#definitions-angle
https://typst.app/docs/reference/visualize/gradient/#definitions-center
https://typst.app/docs/reference/visualize/gradient/#definitions-conic
https://typst.app/docs/reference/visualize/gradient/#definitions-focal-center
https://typst.app/docs/reference/visualize/gradient/#definitions-focal-radius
https://typst.app/docs/reference/visualize/gradient/#definitions-kind
https://typst.app/docs/reference/visualize/gradient/#definitions-linear
https://typst.app/docs/reference/visualize/gradient/#definitions-radial
https://typst.app/docs/reference/visualize/gradient/#definitions-radius
https://typst.app/docs/reference/visualize/gradient/#definitions-relative
https://typst.app/docs/reference/visualize/gradient/#definitions-repeat
https://typst.app/docs/reference/visualize/gradient/#definitions-sample
https://typst.app/docs/reference/visualize/gradient/#definitions-samples
https://typst.app/docs/reference/visualize/gradient/#definitions-sharp
https://typst.app/docs/reference/visualize/gradient/#definitions-space
https://typst.app/docs/reference/visualize/gradient/#definitions-stops
https://typst.app/docs/reference/visualize/image/
https://typst.app/docs/reference/visualize/image/#definitions-decode
https://typst.app/docs/reference/visualize/line/
https://typst.app/docs/reference/visualize/path/
https://typst.app/docs/reference/visualize/polygon/
https://typst.app/docs/reference/visualize/polygon/#definitions-regular
https://typst.app/docs/reference/visualize/rect/
https://typst.app/docs/reference/visualize/square/
https://typst.app/docs/reference/visualize/stroke/
https://typst.app/docs/reference/visualize/tiling/
"###);
}
}