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::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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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(..)")
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
///
|
///
|
||||||
|
@ -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();
|
||||||
|
@ -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>,
|
||||||
|
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user