Add contextual target function

This commit is contained in:
Laurenz 2024-12-02 13:34:02 +01:00
parent 2b8dc9b14d
commit d00a5d6c9b
3 changed files with 49 additions and 4 deletions

View File

@ -31,6 +31,8 @@ mod selector;
mod str; mod str;
mod styles; mod styles;
mod symbol; mod symbol;
#[path = "target.rs"]
mod target_;
mod ty; mod ty;
mod value; mod value;
mod version; mod version;
@ -61,6 +63,7 @@ pub use self::selector::*;
pub use self::str::*; pub use self::str::*;
pub use self::styles::*; pub use self::styles::*;
pub use self::symbol::*; pub use self::symbol::*;
pub use self::target_::*;
pub use self::ty::*; pub use self::ty::*;
pub use self::value::*; pub use self::value::*;
pub use self::version::*; pub use self::version::*;
@ -79,6 +82,7 @@ use typst_syntax::Spanned;
use crate::diag::{bail, SourceResult, StrResult}; use crate::diag::{bail, SourceResult, StrResult};
use crate::engine::Engine; use crate::engine::Engine;
use crate::routines::EvalMode; use crate::routines::EvalMode;
use crate::{Feature, Features};
/// Foundational types and functions. /// Foundational types and functions.
/// ///
@ -88,7 +92,7 @@ use crate::routines::EvalMode;
pub static FOUNDATIONS: Category; pub static FOUNDATIONS: Category;
/// Hook up all `foundations` definitions. /// Hook up all `foundations` definitions.
pub(super) fn define(global: &mut Scope, inputs: Dict) { pub(super) fn define(global: &mut Scope, inputs: Dict, features: &Features) {
global.category(FOUNDATIONS); global.category(FOUNDATIONS);
global.define_type::<bool>(); global.define_type::<bool>();
global.define_type::<i64>(); global.define_type::<i64>();
@ -116,6 +120,9 @@ pub(super) fn define(global: &mut Scope, inputs: Dict) {
global.define_func::<assert>(); global.define_func::<assert>();
global.define_func::<eval>(); global.define_func::<eval>();
global.define_func::<style>(); global.define_func::<style>();
if features.is_enabled(Feature::Html) {
global.define_func::<target>();
}
global.define_module(calc::module()); global.define_module(calc::module());
global.define_module(sys::module(inputs)); global.define_module(sys::module(inputs));
} }

View File

@ -0,0 +1,38 @@
use comemo::Tracked;
use crate::diag::HintedStrResult;
use crate::foundations::{elem, func, Cast, Context};
/// The compilation target.
#[derive(Debug, Default, Copy, Clone, PartialEq, Hash, Cast)]
pub enum Target {
/// The target that is used for paged, fully laid-out content.
#[default]
Paged,
/// The target that is used for HTML export.
Html,
}
impl Target {
/// Whether this is the HTML target.
pub fn is_html(self) -> bool {
self == Self::Html
}
}
/// This element exists solely to host the `target` style chain field.
/// It is never constructed and not visible to users.
#[elem]
pub struct TargetElem {
/// The compilation target.
pub target: Target,
}
/// Returns the current compilation target.
#[func(contextual)]
pub fn target(
/// The callsite context.
context: Tracked<Context>,
) -> HintedStrResult<Target> {
Ok(TargetElem::target_in(context.styles()?))
}

View File

@ -193,7 +193,7 @@ impl LibraryBuilder {
pub fn build(self) -> Library { pub fn build(self) -> Library {
let math = math::module(); let math = math::module();
let inputs = self.inputs.unwrap_or_default(); let inputs = self.inputs.unwrap_or_default();
let global = global(math.clone(), inputs); let global = global(math.clone(), inputs, &self.features);
let std = Value::Module(global.clone()); let std = Value::Module(global.clone());
Library { Library {
global, global,
@ -236,9 +236,9 @@ pub enum Feature {
} }
/// Construct the module with global definitions. /// Construct the module with global definitions.
fn global(math: Module, inputs: Dict) -> Module { fn global(math: Module, inputs: Dict, features: &Features) -> Module {
let mut global = Scope::deduplicating(); let mut global = Scope::deduplicating();
self::foundations::define(&mut global, inputs); self::foundations::define(&mut global, inputs, features);
self::model::define(&mut global); self::model::define(&mut global);
self::text::define(&mut global); self::text::define(&mut global);
global.reset_category(); global.reset_category();