//! Based on https://github.com/zeon256/minimal-typst-svg-renderer use std::path::PathBuf; use typst::Library; use typst::LibraryExt; use typst::World; use typst::diag::{FileError, FileResult}; use typst::foundations::{Bytes, Datetime}; use typst::syntax::{FileId, Source}; use typst::text::{Font, FontBook}; use typst::utils::LazyHash; use typst_kit::fonts::{FontSlot, Fonts}; /// Main interface that determines the environment for Typst. pub struct MinimalWorld { /// The content of a source. source: Source, /// The standard library. library: LazyHash, /// Metadata about all known fonts. book: LazyHash, /// Metadata about all known fonts. fonts: Vec, } impl MinimalWorld { pub fn new(source: impl Into) -> Self { let mut searcher = Fonts::searcher(); searcher.include_system_fonts(true); #[cfg(feature = "embed-fonts")] searcher.include_embedded_fonts(true); let fonts = searcher.search(); Self { library: LazyHash::new(Library::default()), book: LazyHash::new(fonts.book), fonts: fonts.fonts, source: Source::detached(source), } } } impl World for MinimalWorld { /// Standard library. fn library(&self) -> &LazyHash { &self.library } /// Metadata about all known Books. fn book(&self) -> &LazyHash { &self.book } /// Accessing the main source file. fn main(&self) -> FileId { self.source.id() } /// Accessing a specified source file (based on `FileId`). fn source(&self, id: FileId) -> FileResult { if id == self.source.id() { Ok(self.source.clone()) } else { Err(FileError::NotFound(PathBuf::new())) } } /// Accessing a specified file (non-file). fn file(&self, _id: FileId) -> FileResult { Err(FileError::NotFound(PathBuf::new())) } /// Accessing a specified font per index of font book. fn font(&self, id: usize) -> Option { self.fonts.get(id)?.get() } /// Get the current date. /// /// Optionally, an offset in hours is given. fn today(&self, _offset: Option) -> Option { None } }