mirror of
https://github.com/lise-henry/crowbook
synced 2024-06-08 00:06:19 +02:00
added options to binary
This commit is contained in:
parent
763c3671e8
commit
06f59b08f8
|
@ -8,22 +8,105 @@ use clap::{App,Arg};
|
|||
fn main() {
|
||||
let mut app = App::new("crowbook")
|
||||
.version(env!("CARGO_PKG_VERSION"))
|
||||
.author("Élisabeth Henry")
|
||||
.about("Render a markdown book in Epub, PDF or HTML")
|
||||
.about("Render a markdown book in Epub, PDF or HTML.")
|
||||
.after_help("Command line options allow to override options defined in <BOOK> configuration file.
|
||||
E.g., even if this file specifies 'verbose: false', calling 'crowbook --verbose <BOOK>'
|
||||
will activate verbose mode.
|
||||
|
||||
Note that Crowbook generates output files relatively to the directory where <BOOK> is:
|
||||
$ crowbook foo/bar.book --to pdf --output baz.pdf
|
||||
will thus generate baz.pdf in directory foo and not in current directory.")
|
||||
.arg_from_usage("-v, --verbose 'Activate verbose mode'")
|
||||
.arg_from_usage("-o, --output=[FILE] 'Specifies an output file'")
|
||||
.arg(Arg::with_name("book")
|
||||
.arg(Arg::with_name("output")
|
||||
.long("--output")
|
||||
.short("-o")
|
||||
.value_name("FILE")
|
||||
.requires("to")
|
||||
.help("Specify output file"))
|
||||
.arg(Arg::with_name("autoclean")
|
||||
.long("--autoclean")
|
||||
.value_name("BOOL")
|
||||
.takes_value(true)
|
||||
.help("Try to clean input markdown")
|
||||
.possible_values(&["true", "false"]))
|
||||
.arg(Arg::with_name("numbering")
|
||||
.long("--numbering")
|
||||
.value_name("BOOL")
|
||||
.takes_value(true)
|
||||
.help("Number chapters or not")
|
||||
.possible_values(&["true", "false"]))
|
||||
.arg(Arg::with_name("to")
|
||||
.long("--to")
|
||||
.short("t")
|
||||
.takes_value(true)
|
||||
.possible_values(&["epub", "pdf", "html", "tex"])
|
||||
.value_name("FORMAT")
|
||||
.help("Generate specific format"))
|
||||
.arg(Arg::with_name("BOOK")
|
||||
.index(1)
|
||||
.required(true)
|
||||
.help("A file containing the book configuration"));
|
||||
|
||||
let matches = app.get_matches();
|
||||
|
||||
if let Some(s) = matches.value_of("book") {
|
||||
if let Some(s) = matches.value_of("BOOK") {
|
||||
match Book::new_from_file(s) {
|
||||
Ok(book) => {
|
||||
if let Err(err) = book.render_all() {
|
||||
Ok(mut book) => {
|
||||
if matches.is_present("verbose") {
|
||||
book.verbose = true;
|
||||
}
|
||||
if let Some(autoclean) = matches.value_of("autoclean") {
|
||||
book.autoclean = match autoclean {
|
||||
"true" => true,
|
||||
"false" => false,
|
||||
_ => unreachable!()
|
||||
};
|
||||
}
|
||||
|
||||
if let Some(numbering) = matches.value_of("numbering") {
|
||||
book.numbering = match numbering {
|
||||
"true" => true,
|
||||
"false" => false,
|
||||
_ => unreachable!()
|
||||
};
|
||||
}
|
||||
|
||||
if let Some(format) = matches.value_of("to") {
|
||||
if let Some(file) = matches.value_of("output") {
|
||||
let value = Some(file.to_owned());
|
||||
match format {
|
||||
"epub" => book.output_epub = value,
|
||||
"tex" => book.output_tex = value,
|
||||
"html" => book.output_html = value,
|
||||
"pdf" => book.output_pdf = value,
|
||||
_ => unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
if let &Some(ref file) = match format {
|
||||
"epub" => &book.output_epub,
|
||||
"tex" => &book.output_tex,
|
||||
"html" => &book.output_html,
|
||||
"pdf" => &book.output_pdf,
|
||||
_ => unreachable!()
|
||||
} {
|
||||
if let Err(err) = match format {
|
||||
"epub" => book.render_epub(file),
|
||||
"tex" => book.render_tex(file),
|
||||
"html" => book.render_html(file),
|
||||
"pdf" => book.render_pdf(file),
|
||||
_ => unreachable!()
|
||||
} {
|
||||
println!("{}", err);
|
||||
}
|
||||
} else {
|
||||
println!("No output file specified, and book doesn't specify an output file for {}", format);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if let Err(err) = book.render_all() {
|
||||
println!("{}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
|
|
|
@ -254,55 +254,81 @@ impl Book {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Render book to pdf according to book options
|
||||
pub fn render_pdf(&self, file: &str) -> Result<()> {
|
||||
if self.verbose {
|
||||
println!("Attempting to generate pdf...");
|
||||
}
|
||||
let mut latex = LatexRenderer::new(&self);
|
||||
let result = try!(latex.render_pdf());
|
||||
if self.verbose {
|
||||
println!("{}", result);
|
||||
}
|
||||
println!("Successfully generated pdf file: {}", file);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Render book to epub according to book options
|
||||
pub fn render_epub(&self, file: &str) -> Result<()> {
|
||||
if self.verbose {
|
||||
println!("Attempting to generate epub...");
|
||||
}
|
||||
let mut epub = EpubRenderer::new(&self);
|
||||
let result = try!(epub.render_book());
|
||||
if self.verbose {
|
||||
println!("{}", result);
|
||||
}
|
||||
println!("Successfully generated epub file: {}", file);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Render book to html according to book options
|
||||
pub fn render_html(&self, file: &str) -> Result<()> {
|
||||
if self.verbose {
|
||||
println!("Attempting to generate HTML...");
|
||||
}
|
||||
let mut html = HtmlRenderer::new(&self);
|
||||
let result = try!(html.render_book());
|
||||
let mut f = try!(File::create(file).map_err(|_| Error::Render("could not create HTML file")));
|
||||
try!(f.write_all(&result.as_bytes()).map_err(|_| Error::Render("problem when writing to HTML file")));
|
||||
println!("Successfully generated HTML file: {}", file);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Render book to pdf according to book options
|
||||
pub fn render_tex(&self, file: &str) -> Result<()> {
|
||||
if self.verbose {
|
||||
println!("Attempting to generate LaTeX...");
|
||||
}
|
||||
let mut latex = LatexRenderer::new(&self);
|
||||
let result = try!(latex.render_book());
|
||||
let mut f = try!(File::create(file).map_err(|_| Error::Render("could not create LaTeX file")));
|
||||
try!(f.write_all(&result.as_bytes()).map_err(|_| Error::Render("problem when writing to LaTeX file")));
|
||||
println!("Successfully generated LaTeX file: {}", file);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Generates output files acccording to book options
|
||||
pub fn render_all(&self) -> Result<()> {
|
||||
let mut did_some_stuff = false;
|
||||
|
||||
if let Some(ref file) = self.output_epub {
|
||||
did_some_stuff = true;
|
||||
if self.verbose {
|
||||
println!("Attempting to generate epub...");
|
||||
}
|
||||
let mut epub = EpubRenderer::new(&self);
|
||||
let result = try!(epub.render_book());
|
||||
if self.verbose {
|
||||
println!("{}", result);
|
||||
}
|
||||
println!("Successfully generated epub file: {}", file);
|
||||
try!(self.render_epub(file));
|
||||
}
|
||||
|
||||
if let Some(ref file) = self.output_html {
|
||||
did_some_stuff = true;
|
||||
if self.verbose {
|
||||
println!("Attempting to generate HTML...");
|
||||
}
|
||||
let mut html = HtmlRenderer::new(&self);
|
||||
let result = try!(html.render_book());
|
||||
let mut f = try!(File::create(file).map_err(|_| Error::Render("could not create HTML file")));
|
||||
try!(f.write_all(&result.as_bytes()).map_err(|_| Error::Render("problem when writing to HTML file")));
|
||||
println!("Successfully generated HTML file: {}", file);
|
||||
try!(self.render_html(file));
|
||||
}
|
||||
if let Some(ref file) = self.output_tex {
|
||||
did_some_stuff = true;
|
||||
if self.verbose {
|
||||
println!("Attempting to generate LaTeX...");
|
||||
}
|
||||
let mut latex = LatexRenderer::new(&self);
|
||||
let result = try!(latex.render_book());
|
||||
let mut f = try!(File::create(file).map_err(|_| Error::Render("could not create LaTeX file")));
|
||||
try!(f.write_all(&result.as_bytes()).map_err(|_| Error::Render("problem when writing to LaTeX file")));
|
||||
println!("Successfully generated LaTeX file: {}", file);
|
||||
try!(self.render_tex(file));
|
||||
}
|
||||
if let Some(ref file) = self.output_pdf {
|
||||
did_some_stuff = true;
|
||||
if self.verbose {
|
||||
println!("Attempting to generate pdf...");
|
||||
}
|
||||
let mut latex = LatexRenderer::new(&self);
|
||||
let result = try!(latex.render_pdf());
|
||||
if self.verbose {
|
||||
println!("{}", result);
|
||||
}
|
||||
println!("Successfully generated pdf file: {}", file);
|
||||
try!(self.render_pdf(file));
|
||||
}
|
||||
if !did_some_stuff {
|
||||
println!("Warning: generated no file because no output file speficied. Add output_{{format}} to your config file.");
|
||||
|
|
Loading…
Reference in New Issue