1
0
Fork 0
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:
Elisabeth Henry 2016-02-20 16:56:07 +01:00
parent 763c3671e8
commit 06f59b08f8
2 changed files with 150 additions and 41 deletions

View File

@ -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) => {

View File

@ -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.");