aboutsummaryrefslogtreecommitdiff
path: root/lib/typst/src/lib.rs
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-04-29 22:30:04 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2026-04-29 22:30:04 +0200
commit78f399521661c82e45e627bbbdc8ce4daa9e5207 (patch)
tree2671aa93feb01956aded5cef1e725f9aff4aa3a9 /lib/typst/src/lib.rs
parent77ccdd8559383c25fc59fbcba38117102e5657b5 (diff)
style(typst): move in lib folder
Diffstat (limited to 'lib/typst/src/lib.rs')
-rw-r--r--lib/typst/src/lib.rs52
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) }
+}