diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2026-04-29 22:30:04 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2026-04-29 22:30:04 +0200 |
| commit | 78f399521661c82e45e627bbbdc8ce4daa9e5207 (patch) | |
| tree | 2671aa93feb01956aded5cef1e725f9aff4aa3a9 /lib/typst/src/lib.rs | |
| parent | 77ccdd8559383c25fc59fbcba38117102e5657b5 (diff) | |
style(typst): move in lib folder
Diffstat (limited to 'lib/typst/src/lib.rs')
| -rw-r--r-- | lib/typst/src/lib.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/typst/src/lib.rs b/lib/typst/src/lib.rs new file mode 100644 index 0000000..5c2ee0d --- /dev/null +++ b/lib/typst/src/lib.rs @@ -0,0 +1,52 @@ +//! Based on https://github.com/zeon256/minimal-typst-svg-renderer +use std::ffi::{CStr, CString}; +use std::os::raw::c_char; + +use typst::layout::PagedDocument; +use typst_svg::svg_frame; + +use crate::world::MinimalWorld; + +mod world; + +pub fn compile(content: &str) -> String { + let world = MinimalWorld::new(content); + + let res = typst::compile::<PagedDocument>(&world); + + if !res.warnings.is_empty() { + eprintln!("Warnings: {:?}", res.warnings); + } + + let doc = res.output.expect("Error compiling typst"); + + svg_frame(&doc.pages[0].frame) +} + +pub fn escape_math(content: &str) -> String { + content.replace("$", r"\$").replace("\n", r"\ ") +} + +unsafe fn convert_call(source: *const c_char, f: fn(&str) -> String) -> *const c_char { + unsafe { + let res = f(CStr::from_ptr(source).to_str().unwrap()); + CString::new(res).unwrap().into_raw() + } +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn typst_generateSVG(source: *const c_char) -> *const c_char { + unsafe { convert_call(source, compile) } +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn typst_freeString(res: *mut c_char) { + unsafe { + drop(CString::from_raw(res)); + } +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn typst_escapeMath(source: *const c_char) -> *const c_char { + unsafe { convert_call(source, escape_math) } +} |
