mirror of
https://github.com/typst/typst
synced 2025-07-11 22:52:53 +08:00
Construct library via extension trait instead of default & inherent impl (#6576)
This commit is contained in:
parent
e5e1dcd9c0
commit
e71674f6b3
@ -12,7 +12,7 @@ use typst::foundations::{Bytes, Datetime, Dict, IntoValue};
|
||||
use typst::syntax::{FileId, Lines, Source, VirtualPath};
|
||||
use typst::text::{Font, FontBook};
|
||||
use typst::utils::LazyHash;
|
||||
use typst::{Library, World};
|
||||
use typst::{Library, LibraryExt, World};
|
||||
use typst_kit::fonts::{FontSlot, Fonts};
|
||||
use typst_kit::package::PackageStorage;
|
||||
use typst_timing::timed;
|
||||
|
@ -10,7 +10,7 @@ use typst::syntax::package::{PackageSpec, PackageVersion};
|
||||
use typst::syntax::{FileId, Source, VirtualPath};
|
||||
use typst::text::{Font, FontBook, TextElem, TextSize};
|
||||
use typst::utils::{singleton, LazyHash};
|
||||
use typst::{Feature, Library, World};
|
||||
use typst::{Feature, Library, LibraryExt, World};
|
||||
|
||||
use crate::IdeWorld;
|
||||
|
||||
|
@ -36,6 +36,7 @@ use typst_utils::{LazyHash, SmallBitSet};
|
||||
use crate::diag::FileResult;
|
||||
use crate::foundations::{Array, Binding, Bytes, Datetime, Dict, Module, Scope, Styles};
|
||||
use crate::layout::{Alignment, Dir};
|
||||
use crate::routines::Routines;
|
||||
use crate::text::{Font, FontBook};
|
||||
use crate::visualize::Color;
|
||||
|
||||
@ -139,6 +140,11 @@ impl<T: World + ?Sized> WorldExt for T {
|
||||
}
|
||||
|
||||
/// 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)]
|
||||
pub struct Library {
|
||||
/// The module that contains the definitions that are available everywhere.
|
||||
@ -154,30 +160,28 @@ pub struct Library {
|
||||
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.
|
||||
///
|
||||
/// This struct is created by [`Library::builder`].
|
||||
#[derive(Debug, Clone, Default)]
|
||||
/// Constructed via the `LibraryExt` trait.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct LibraryBuilder {
|
||||
#[expect(unused, reason = "will be used in the future")]
|
||||
routines: &'static Routines,
|
||||
inputs: Option<Dict>,
|
||||
features: Features,
|
||||
}
|
||||
|
||||
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`.
|
||||
pub fn with_inputs(mut self, inputs: Dict) -> Self {
|
||||
self.inputs = Some(inputs);
|
||||
|
@ -1,3 +1,4 @@
|
||||
use std::fmt::{self, Debug, Formatter};
|
||||
use std::hash::{Hash, Hasher};
|
||||
|
||||
use comemo::{Tracked, TrackedMut};
|
||||
@ -38,6 +39,12 @@ macro_rules! routines {
|
||||
impl Hash for Routines {
|
||||
fn hash<H: Hasher>(&self, _: &mut H) {}
|
||||
}
|
||||
|
||||
impl Debug for Routines {
|
||||
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||
f.pad("Routines(..)")
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
/// function pointers.
|
||||
///
|
||||
|
@ -24,7 +24,7 @@ use typst::foundations::{
|
||||
use typst::layout::{Abs, Margin, PageElem, PagedDocument};
|
||||
use typst::text::{Font, FontBook};
|
||||
use typst::utils::LazyHash;
|
||||
use typst::{Category, Feature, Library, LibraryBuilder};
|
||||
use typst::{Category, Feature, Library, LibraryExt};
|
||||
use unicode_math_class::MathClass;
|
||||
|
||||
macro_rules! load {
|
||||
@ -51,7 +51,7 @@ static GROUPS: LazyLock<Vec<GroupData>> = 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())
|
||||
.build();
|
||||
let scope = lib.global.scope_mut();
|
||||
|
@ -7,7 +7,7 @@ use typst::layout::PagedDocument;
|
||||
use typst::syntax::{FileId, Source};
|
||||
use typst::text::{Font, FontBook};
|
||||
use typst::utils::LazyHash;
|
||||
use typst::{Library, World};
|
||||
use typst::{Library, LibraryExt, World};
|
||||
|
||||
struct FuzzWorld {
|
||||
library: LazyHash<Library>,
|
||||
|
@ -19,7 +19,7 @@ use typst::syntax::{FileId, Source, Span};
|
||||
use typst::text::{Font, FontBook, TextElem, TextSize};
|
||||
use typst::utils::{singleton, LazyHash};
|
||||
use typst::visualize::Color;
|
||||
use typst::{Feature, Library, World};
|
||||
use typst::{Feature, Library, LibraryExt, World};
|
||||
use typst_syntax::Lines;
|
||||
|
||||
/// A world that provides access to the tests environment.
|
||||
|
Loading…
x
Reference in New Issue
Block a user