Construct library via extension trait instead of default & inherent impl (#6576)

This commit is contained in:
Laurenz 2025-07-09 11:28:26 +02:00 committed by GitHub
parent e5e1dcd9c0
commit e71674f6b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 52 additions and 22 deletions

View File

@ -12,7 +12,7 @@ use typst::foundations::{Bytes, Datetime, Dict, IntoValue};
use typst::syntax::{FileId, Lines, Source, VirtualPath}; use typst::syntax::{FileId, Lines, Source, VirtualPath};
use typst::text::{Font, FontBook}; use typst::text::{Font, FontBook};
use typst::utils::LazyHash; use typst::utils::LazyHash;
use typst::{Library, World}; use typst::{Library, LibraryExt, World};
use typst_kit::fonts::{FontSlot, Fonts}; use typst_kit::fonts::{FontSlot, Fonts};
use typst_kit::package::PackageStorage; use typst_kit::package::PackageStorage;
use typst_timing::timed; use typst_timing::timed;

View File

@ -10,7 +10,7 @@ use typst::syntax::package::{PackageSpec, PackageVersion};
use typst::syntax::{FileId, Source, VirtualPath}; use typst::syntax::{FileId, Source, VirtualPath};
use typst::text::{Font, FontBook, TextElem, TextSize}; use typst::text::{Font, FontBook, TextElem, TextSize};
use typst::utils::{singleton, LazyHash}; use typst::utils::{singleton, LazyHash};
use typst::{Feature, Library, World}; use typst::{Feature, Library, LibraryExt, World};
use crate::IdeWorld; use crate::IdeWorld;

View File

@ -36,6 +36,7 @@ use typst_utils::{LazyHash, SmallBitSet};
use crate::diag::FileResult; use crate::diag::FileResult;
use crate::foundations::{Array, Binding, Bytes, Datetime, Dict, Module, Scope, Styles}; use crate::foundations::{Array, Binding, Bytes, Datetime, Dict, Module, Scope, Styles};
use crate::layout::{Alignment, Dir}; use crate::layout::{Alignment, Dir};
use crate::routines::Routines;
use crate::text::{Font, FontBook}; use crate::text::{Font, FontBook};
use crate::visualize::Color; use crate::visualize::Color;
@ -139,6 +140,11 @@ impl<T: World + ?Sized> WorldExt for T {
} }
/// Definition of Typst's standard library. /// Definition of Typst's standard library.
///
/// To create and configure the standard library, use the `LibraryExt` trait
/// and call
/// - `Library::default()` for a standard configuration
/// - `Library::builder().build()` if you want to customize the library
#[derive(Debug, Clone, Hash)] #[derive(Debug, Clone, Hash)]
pub struct Library { pub struct Library {
/// The module that contains the definitions that are available everywhere. /// The module that contains the definitions that are available everywhere.
@ -154,30 +160,28 @@ pub struct Library {
pub features: Features, pub features: Features,
} }
impl Library {
/// Create a new builder for a library.
pub fn builder() -> LibraryBuilder {
LibraryBuilder::default()
}
}
impl Default for Library {
/// Constructs the standard library with the default configuration.
fn default() -> Self {
Self::builder().build()
}
}
/// Configurable builder for the standard library. /// Configurable builder for the standard library.
/// ///
/// This struct is created by [`Library::builder`]. /// Constructed via the `LibraryExt` trait.
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone)]
pub struct LibraryBuilder { pub struct LibraryBuilder {
#[expect(unused, reason = "will be used in the future")]
routines: &'static Routines,
inputs: Option<Dict>, inputs: Option<Dict>,
features: Features, features: Features,
} }
impl LibraryBuilder { impl LibraryBuilder {
/// Creates a new builder.
#[doc(hidden)]
pub fn from_routines(routines: &'static Routines) -> Self {
Self {
routines,
inputs: None,
features: Features::default(),
}
}
/// Configure the inputs visible through `sys.inputs`. /// Configure the inputs visible through `sys.inputs`.
pub fn with_inputs(mut self, inputs: Dict) -> Self { pub fn with_inputs(mut self, inputs: Dict) -> Self {
self.inputs = Some(inputs); self.inputs = Some(inputs);

View File

@ -1,3 +1,4 @@
use std::fmt::{self, Debug, Formatter};
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use comemo::{Tracked, TrackedMut}; use comemo::{Tracked, TrackedMut};
@ -38,6 +39,12 @@ macro_rules! routines {
impl Hash for Routines { impl Hash for Routines {
fn hash<H: Hasher>(&self, _: &mut H) {} fn hash<H: Hasher>(&self, _: &mut H) {}
} }
impl Debug for Routines {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
f.pad("Routines(..)")
}
}
}; };
} }

View File

@ -323,6 +323,25 @@ mod sealed {
} }
} }
/// Provides ways to construct a [`Library`].
pub trait LibraryExt {
/// Creates the default library.
fn default() -> Library;
/// Creates a builder for configuring a library.
fn builder() -> LibraryBuilder;
}
impl LibraryExt for Library {
fn default() -> Library {
Self::builder().build()
}
fn builder() -> LibraryBuilder {
LibraryBuilder::from_routines(&ROUTINES)
}
}
/// Defines implementation of various Typst compiler routines as a table of /// Defines implementation of various Typst compiler routines as a table of
/// function pointers. /// function pointers.
/// ///

View File

@ -24,7 +24,7 @@ use typst::foundations::{
use typst::layout::{Abs, Margin, PageElem, PagedDocument}; use typst::layout::{Abs, Margin, PageElem, PagedDocument};
use typst::text::{Font, FontBook}; use typst::text::{Font, FontBook};
use typst::utils::LazyHash; use typst::utils::LazyHash;
use typst::{Category, Feature, Library, LibraryBuilder}; use typst::{Category, Feature, Library, LibraryExt};
use unicode_math_class::MathClass; use unicode_math_class::MathClass;
macro_rules! load { macro_rules! load {
@ -51,7 +51,7 @@ static GROUPS: LazyLock<Vec<GroupData>> = LazyLock::new(|| {
}); });
static LIBRARY: LazyLock<LazyHash<Library>> = LazyLock::new(|| { static LIBRARY: LazyLock<LazyHash<Library>> = LazyLock::new(|| {
let mut lib = LibraryBuilder::default() let mut lib = Library::builder()
.with_features([Feature::Html].into_iter().collect()) .with_features([Feature::Html].into_iter().collect())
.build(); .build();
let scope = lib.global.scope_mut(); let scope = lib.global.scope_mut();

View File

@ -7,7 +7,7 @@ use typst::layout::PagedDocument;
use typst::syntax::{FileId, Source}; use typst::syntax::{FileId, Source};
use typst::text::{Font, FontBook}; use typst::text::{Font, FontBook};
use typst::utils::LazyHash; use typst::utils::LazyHash;
use typst::{Library, World}; use typst::{Library, LibraryExt, World};
struct FuzzWorld { struct FuzzWorld {
library: LazyHash<Library>, library: LazyHash<Library>,

View File

@ -19,7 +19,7 @@ use typst::syntax::{FileId, Source, Span};
use typst::text::{Font, FontBook, TextElem, TextSize}; use typst::text::{Font, FontBook, TextElem, TextSize};
use typst::utils::{singleton, LazyHash}; use typst::utils::{singleton, LazyHash};
use typst::visualize::Color; use typst::visualize::Color;
use typst::{Feature, Library, World}; use typst::{Feature, Library, LibraryExt, World};
use typst_syntax::Lines; use typst_syntax::Lines;
/// A world that provides access to the tests environment. /// A world that provides access to the tests environment.