summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 00000000..9bf693e4
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,75 @@
+use std::cell::RefCell;
+use std::fs::{read_to_string, File};
+use std::io::BufWriter;
+use std::path::{Path, PathBuf};
+use std::rc::Rc;
+
+use fontdock::fs::{FsIndex, FsSource};
+
+use typstc::diag::{Feedback, Pass};
+use typstc::eval::State;
+use typstc::export::pdf;
+use typstc::font::FontLoader;
+use typstc::parse::LineMap;
+use typstc::typeset;
+
+fn main() {
+ let args: Vec<_> = std::env::args().collect();
+ if args.len() < 2 || args.len() > 3 {
+ println!("Usage: typst src.typ [out.pdf]");
+ return;
+ }
+
+ let src_path = Path::new(&args[1]);
+ let dest_path = if args.len() <= 2 {
+ src_path.with_extension("pdf")
+ } else {
+ PathBuf::from(&args[2])
+ };
+
+ if src_path == dest_path {
+ panic!("source and destination path are the same");
+ }
+
+ let src = read_to_string(src_path).expect("failed to read from source file");
+
+ let mut index = FsIndex::new();
+ index.search_dir("fonts");
+ index.search_os();
+
+ let (files, descriptors) = index.into_vecs();
+ let loader = Rc::new(RefCell::new(FontLoader::new(
+ Box::new(FsSource::new(files)),
+ descriptors,
+ )));
+
+ let state = State::default();
+ let Pass {
+ output: layouts,
+ feedback: Feedback { mut diags, .. },
+ } = typeset(&src, state, Rc::clone(&loader));
+
+ if !diags.is_empty() {
+ diags.sort();
+
+ let map = LineMap::new(&src);
+ for diag in diags {
+ let span = diag.span;
+ let start = map.location(span.start);
+ let end = map.location(span.end);
+ println!(
+ " {}: {}:{}-{}: {}",
+ diag.v.level,
+ src_path.display(),
+ start,
+ end,
+ diag.v.message,
+ );
+ }
+ }
+
+ let loader = loader.borrow();
+ let file = File::create(&dest_path).expect("failed to create output file");
+ let writer = BufWriter::new(file);
+ pdf::export(&layouts, &loader, writer).expect("failed to export pdf");
+}