From 73340f70a6f36bc46514a81b220373112fc7399e Mon Sep 17 00:00:00 2001 From: Johann Birnick Date: Sun, 19 Jan 2025 04:42:47 -0800 Subject: [PATCH] initial draft --- .../typst-library/src/introspection/count.rs | 92 +++++++++++++++++++ .../src/introspection/introspector.rs | 54 +++++++++++ crates/typst-library/src/introspection/mod.rs | 4 + 3 files changed, 150 insertions(+) create mode 100644 crates/typst-library/src/introspection/count.rs diff --git a/crates/typst-library/src/introspection/count.rs b/crates/typst-library/src/introspection/count.rs new file mode 100644 index 000000000..43af61ad7 --- /dev/null +++ b/crates/typst-library/src/introspection/count.rs @@ -0,0 +1,92 @@ +use comemo::Tracked; + +use crate::diag::HintedStrResult; +use crate::engine::Engine; +use crate::foundations::{func, Array, Context, IntoValue, LocatableSelector, Selector}; + +/// Counts element in the document. +/// +/// The `count` function lets you count elements in your document of a +/// particular type or with a particular label. It also allows to count them +/// in a hierachical way. To use it, you first need to ensure that [context] +/// is available. +/// +/// Always returns an array of integers, even if called with just a single +/// target. + +/// # Counting elements - simple +/// +/// To just count elements of a single type/label up to the current location, +/// pass the selector you want to count: +/// ```example +/// = Heading +/// +/// = Another Heading +/// +/// #context count(heading) +/// +/// = Third Heading +/// ``` +/// +/// Note that it will not return an integer, but an array with a single integer +/// entry. + +/// # Counting elements - hierarchical +/// +/// If you pass multiple targets, then it starts by counting the first target. +/// Then the second target is counted _starting only from the last counted +/// element of the first target_. +/// +/// ```example +/// = Some Heading +/// +/// == Some Subheading +/// +/// = Another Heading +/// +/// == Some Subheading +/// +/// #context count(heading.where(level: 1), heading.where(level: 2)) +/// +/// == Another Subheading +/// ``` +#[func(contextual)] +pub fn count( + /// The engine. + engine: &mut Engine, + /// The callsite context. + context: Tracked, + /// Each target can be + /// - an element function like a `heading` or `figure`, + /// - a `{