diff options
author | Jan-Erik Rediger <janerik@fnordig.de> | 2020-04-25 17:23:47 +0200 |
---|---|---|
committer | Jan-Erik Rediger <janerik@fnordig.de> | 2020-04-25 17:27:19 +0200 |
commit | b3554a628c9ebd54f76eac45e09b314e6a7843e2 (patch) | |
tree | 6dce6a2d583c7dbbb6596902906e9254038ae6e5 /src | |
parent | 19a991472068d899c25440ab0c1073b3dbe84cf8 (diff) |
Write preprocessor configuration
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/mdbook-mermaid.rs | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/src/bin/mdbook-mermaid.rs b/src/bin/mdbook-mermaid.rs index 960ba52..b23e8b5 100644 --- a/src/bin/mdbook-mermaid.rs +++ b/src/bin/mdbook-mermaid.rs @@ -2,7 +2,7 @@ use clap::{crate_version, App, Arg, ArgMatches, SubCommand}; use mdbook::errors::Error; use mdbook::preprocess::{CmdPreprocessor, Preprocessor}; use mdbook_mermaid::Mermaid; -use toml_edit::{Array, Document, Item, Table, Value}; +use toml_edit::{value, Array, Document, Item, Table, Value}; use std::{ fs::{self, File}, @@ -41,7 +41,7 @@ pub fn make_app() -> App<'static, 'static> { } fn main() { - env_logger::init(); + env_logger::from_env(env_logger::Env::default().default_filter_or("info")).init(); let matches = make_app().get_matches(); @@ -103,40 +103,68 @@ fn handle_install(sub_args: &ArgMatches) -> ! { .parse::<Document>() .expect("configuration is not valid TOML"); - log::info!("Adding additional files to configuration (if necessary)"); - if add_additional_files(&mut doc) { + let has_pre = has_preprocessor(&mut doc); + if !has_pre { + log::info!("Adding preprocessor configuration"); + add_preprocessor(&mut doc); + } + + if !has_pre || add_additional_files(&mut doc) { log::info!("Saving changed configuration to {}", config.display()); let toml = doc.to_string_in_original_order(); let mut file = File::create(config).expect("can't open configuration file for writing."); - file.write_all(toml.as_bytes()).expect("can't write configuration"); + file.write_all(toml.as_bytes()) + .expect("can't write configuration"); } - log::info!("Writing additional files to project directory at {}", proj_dir.display()); + let mut printed = false; for (name, content) in MERMAID_FILES { let filepath = proj_dir.join(name); if filepath.exists() { - log::debug!("'{}' already exists (Path: {}). Skipping.", name, filepath.display()); + log::debug!( + "'{}' already exists (Path: {}). Skipping.", + name, + filepath.display() + ); } else { + if !printed { + printed = true; + log::info!( + "Writing additional files to project directory at {}", + proj_dir.display() + ); + } log::debug!("Writing content for '{}' into {}", name, filepath.display()); let mut file = File::create(filepath).expect("can't open file for writing"); - file.write_all(content).expect("can't write content to file"); + file.write_all(content) + .expect("can't write content to file"); } - } - log::info!("mermaid is active. You can start using it in your book."); + log::info!("Files & configuration for mdbook-mermaid are installed. You can start using it in your book."); + let codeblock = r#"```mermaid +graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +```"#; + log::info!("Add a code block like:\n{}", codeblock); process::exit(0); } fn add_additional_files(doc: &mut Document) -> bool { let mut changed = false; + let mut printed = true; let file = "mermaid.css"; let additional_css = additional(doc, "css"); if has_file(&additional_css, file) { log::debug!("'{}' already in 'additional-css'. Skipping", file) } else { + printed = true; + log::info!("Adding additional files to configuration"); log::debug!("Adding '{}' to 'additional-css'", file); insert_additional(doc, "css", file); changed = true; @@ -147,6 +175,10 @@ fn add_additional_files(doc: &mut Document) -> bool { if has_file(&additional_js, file) { log::debug!("'{}' already in 'additional-js'. Skipping", file) } else { + if !printed { + printed = true; + log::info!("Adding additional files to configuration"); + } log::debug!("Adding '{}' to 'additional-js'", file); insert_additional(doc, "js", file); changed = true; @@ -157,6 +189,9 @@ fn add_additional_files(doc: &mut Document) -> bool { if has_file(&additional_js, file) { log::debug!("'{}' already in 'additional-js'. Skipping", file) } else { + if !printed { + log::info!("Adding additional files to configuration"); + } log::debug!("Adding '{}' to 'additional-js'", file); insert_additional(doc, "js", file); changed = true; @@ -176,6 +211,24 @@ fn additional<'a>(doc: &'a mut Document, additional_type: &str) -> Option<&'a mu item.as_array_mut() } +fn has_preprocessor(doc: &mut Document) -> bool { + matches!(doc["preprocessor"]["mermaid"], Item::Table(_)) +} + +fn add_preprocessor(doc: &mut Document) { + let doc = doc.as_table_mut(); + + let empty_table = Item::Table(Table::default()); + + let item = doc.entry("preprocessor").or_insert(empty_table.clone()); + let item = item + .as_table_mut() + .unwrap() + .entry("mermaid") + .or_insert(empty_table.clone()); + item["command"] = value("mdbook-mermaid"); +} + fn has_file(elem: &Option<&mut Array>, file: &str) -> bool { match elem { Some(elem) => elem.iter().any(|elem| match elem.as_str() { |