From 4551f9c554c1fef32ef2b7e55b01b1fb90186cbf Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 29 Apr 2026 15:10:29 +0200 Subject: feat(typst): minimal rust lib building svg --- typst/src/world.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 typst/src/world.rs (limited to 'typst/src/world.rs') diff --git a/typst/src/world.rs b/typst/src/world.rs new file mode 100644 index 0000000..5bbefee --- /dev/null +++ b/typst/src/world.rs @@ -0,0 +1,97 @@ +//! 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::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 (fonts, book) = Self::load_fonts(); + + Self { + library: LazyHash::new(Library::default()), + book: LazyHash::new(book), + fonts: fonts, + source: Source::detached(source), + } + } + + fn load_fonts() -> (Vec, FontBook) { + let mut searcher = Fonts::searcher(); + searcher.include_system_fonts(true); + + let mut fonts = Vec::new(); + let mut book = FontBook::new(); + for font in searcher.search().fonts { + book.push(font.get().unwrap().info().clone()); + fonts.push(font.get().unwrap()); + } + (fonts, book) + } +} + +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).cloned() + } + + /// Get the current date. + /// + /// Optionally, an offset in hours is given. + fn today(&self, _offset: Option) -> Option { + None + } +} -- cgit v1.2.3