diff options
| author | Laurenz <laurmaedje@gmail.com> | 2020-10-12 21:26:58 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2020-10-12 21:26:58 +0200 |
| commit | dd4a4545a6b72e48cde5d2483fac5e4e76f6047f (patch) | |
| tree | d31c99d4b4322be773cbf100acc3d7c2600ebe8c /src | |
| parent | 1a70cb6a330990dc0ab373905d12458ef87afbad (diff) | |
Move main back into src/ 📨
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 75 |
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"); +} |
