diff --git a/Cargo.toml b/Cargo.toml index be2aaea..c851ade 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,10 @@ crate-type = ["lib"] name = "snekdown" path = "src/main.rs" +[features] + +pdf = ["headless_chrome", "failure"] + [dependencies] charred = "0.3.3" asciimath-rs = "0.5.7" @@ -44,5 +48,5 @@ log = "0.4.11" env_logger = "0.7.1" indicatif = "0.15.0" platform-dirs = "0.2.0" -headless_chrome = "0.9.0" -failure = "0.1.8" \ No newline at end of file +headless_chrome = {version = "0.9.0", optional = true} +failure = {version = "0.1.8", optional = true} \ No newline at end of file diff --git a/README.md b/README.md index 4313e8a..0e78ca2 100644 --- a/README.md +++ b/README.md @@ -324,12 +324,13 @@ The end goal is to have a markup language with features similar to LaTeX. - [x] Metadata files - [x] Bibliography - [x] Math -- [ ] Text sizes -- [ ] Title pages - [x] Glossary -- [ ] Cross References -- [ ] Figures -- [ ] EPUB Rendering (PDF is too hard) -- [ ] Custom Elements via templates (50%) +- [x] Chromium based pdf rendering - [x] Custom Stylesheets - [x] Smart arrows +- [ ] Custom Elements via templates (50%) +- [ ] Cross References +- [ ] Figures +- [ ] EPUB Rendering +- [ ] Text sizes +- [ ] Title pages \ No newline at end of file diff --git a/src/format/mod.rs b/src/format/mod.rs index d8eb73f..168963b 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -1,6 +1,7 @@ use regex::Regex; use std::collections::HashMap; +#[cfg(feature = "pdf")] pub mod chromium_pdf; pub mod html; diff --git a/src/main.rs b/src/main.rs index 7ad7665..94a5091 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,12 @@ use colored::Colorize; use env_logger::Env; use log::{Level, LevelFilter}; use notify::{watcher, RecursiveMode, Watcher}; -use snekdown::format::chromium_pdf::render_to_pdf; +use snekdown::elements::Document; use snekdown::format::html::html_writer::HTMLWriter; use snekdown::format::html::to_html::ToHtml; use snekdown::parser::ParserOptions; use snekdown::Parser; -use std::fs::OpenOptions; +use std::fs::{File, OpenOptions}; use std::io::{BufWriter, Write}; use std::path::PathBuf; use std::sync::mpsc::channel; @@ -135,21 +135,41 @@ fn render(opt: &Opt) -> Parser { .unwrap(); let mut writer = BufWriter::new(file); - match opt.format.as_str() { - "html" => { - let mut writer = HTMLWriter::new(Box::new(writer)); - document.to_html(&mut writer).unwrap(); - writer.flush().unwrap(); - } - "pdf" => { - let result = render_to_pdf(document).expect("Failed to render pdf!"); - writer.write_all(&result).unwrap(); - writer.flush().unwrap(); - } - _ => log::error!("Unknown format {}", opt.format), - } + render_format(opt, document, writer); log::info!("Rendering took: {:?}", start_render.elapsed()); log::info!("Total: {:?}", start.elapsed()); parser } + +#[cfg(not(feature = "pdf"))] +fn render_format(opt: &Opt, document: Document, mut writer: BufWriter) { + match opt.format.as_str() { + "html" => render_html(document, writer), + _ => log::error!("Unknown format {}", opt.format), + } +} + +#[cfg(feature = "pdf")] +fn render_format(opt: &Opt, document: Document, mut writer: BufWriter) { + match opt.format.as_str() { + "html" => render_html(document, writer), + "pdf" => render_pdf(document, writer), + _ => log::error!("Unknown format {}", opt.format), + } +} + +fn render_html(document: Document, mut writer: BufWriter) { + let mut writer = HTMLWriter::new(Box::new(writer)); + document.to_html(&mut writer).unwrap(); + writer.flush().unwrap(); +} + +#[cfg(feature = "pdf")] +fn render_pdf(document: Document, mut writer: BufWriter) { + use snekdown::format::chromium_pdf::render_to_pdf; + + let result = render_to_pdf(document).expect("Failed to render pdf!"); + writer.write_all(&result).unwrap(); + writer.flush().unwrap(); +}