typst/main/src/main.rs
2020-10-04 18:18:55 +02:00

76 lines
2.1 KiB
Rust

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::parse::LineMap;
use typstc::{typeset, Feedback, Pass};
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 style = Default::default();
let scope = typstc::library::_std();
let Pass {
output: layouts,
feedback: Feedback { mut diagnostics, .. },
} = block_on(typeset(&src, &style, &scope, Rc::clone(&loader)));
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");
}