summaryrefslogtreecommitdiff
path: root/main/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-09-30 21:23:48 +0200
committerLaurenz <laurmaedje@gmail.com>2020-09-30 21:23:48 +0200
commit38607b8bea1ede7a124c8fe384d7efca76f9f011 (patch)
treef3b6d0aed9fbaba92215eacbf3a3670016260df9 /main/src
parent01405902ba18726ccae2f71da9dfef26fac9c357 (diff)
Re-add src folder in main 📦
Diffstat (limited to 'main/src')
-rw-r--r--main/src/main.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/main/src/main.rs b/main/src/main.rs
new file mode 100644
index 00000000..5b3538d5
--- /dev/null
+++ b/main/src/main.rs
@@ -0,0 +1,74 @@
+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, FsProvider};
+use futures_executor::block_on;
+
+use typstc::export::pdf;
+use typstc::font::FontLoader;
+use typstc::syntax::LineMap;
+use typstc::{Feedback, Pass, Typesetter};
+
+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 (descriptors, files) = index.into_vecs();
+ let provider = FsProvider::new(files);
+ let loader = FontLoader::new(Box::new(provider), descriptors);
+ let loader = Rc::new(RefCell::new(loader));
+
+ let typesetter = Typesetter::new(loader.clone());
+ let Pass {
+ output: layouts,
+ feedback: Feedback { mut diagnostics, .. },
+ } = block_on(typesetter.typeset(&src));
+
+ if !diagnostics.is_empty() {
+ diagnostics.sort();
+
+ let map = LineMap::new(&src);
+ for diagnostic in diagnostics {
+ let span = diagnostic.span;
+ let start = map.location(span.start);
+ let end = map.location(span.end);
+
+ println!(
+ " {}: {}:{}-{}: {}",
+ diagnostic.v.level,
+ src_path.display(),
+ start,
+ end,
+ diagnostic.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");
+}