Refactor: parse config in a central place
This commit is contained in:
parent
01f2879e10
commit
6e8b632a30
1235
Cargo.lock
generated
1235
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -16,6 +16,7 @@ env_logger = "0.7.1"
|
||||||
log = "0.4.11"
|
log = "0.4.11"
|
||||||
clap = "2.33.3"
|
clap = "2.33.3"
|
||||||
serde_json = "1.0.57"
|
serde_json = "1.0.57"
|
||||||
|
toml = "0.5.6"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
pretty_assertions = "0.6.1"
|
pretty_assertions = "0.6.1"
|
||||||
|
|
61
src/lib.rs
61
src/lib.rs
|
@ -1,5 +1,6 @@
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::convert::TryFrom;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
use mdbook::book::{Book, BookItem, Chapter};
|
use mdbook::book::{Book, BookItem, Chapter};
|
||||||
|
@ -8,11 +9,51 @@ use mdbook::preprocess::{Preprocessor, PreprocessorContext};
|
||||||
use pulldown_cmark::Tag::*;
|
use pulldown_cmark::Tag::*;
|
||||||
use pulldown_cmark::{Event, Options, Parser};
|
use pulldown_cmark::{Event, Options, Parser};
|
||||||
use pulldown_cmark_to_cmark::{cmark_with_options, Options as COptions};
|
use pulldown_cmark_to_cmark::{cmark_with_options, Options as COptions};
|
||||||
|
use toml::value::Table;
|
||||||
|
|
||||||
pub struct Toc;
|
pub struct Toc;
|
||||||
|
|
||||||
static DEFAULT_MARKER: &str = "<!-- toc -->\n";
|
static DEFAULT_MARKER: &str = "<!-- toc -->\n";
|
||||||
|
|
||||||
|
struct Config {
|
||||||
|
marker: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Config {
|
||||||
|
fn default() -> Config {
|
||||||
|
Config {
|
||||||
|
marker: DEFAULT_MARKER.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> TryFrom<Option<&'a Table>> for Config {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn try_from(mdbook_cfg: Option<&Table>) -> Result<Config> {
|
||||||
|
let mut cfg = Config::default();
|
||||||
|
let mdbook_cfg = match mdbook_cfg {
|
||||||
|
Some(c) => c,
|
||||||
|
None => return Ok(cfg),
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(marker) = mdbook_cfg.get("marker") {
|
||||||
|
let marker = match marker.as_str() {
|
||||||
|
Some(m) => m,
|
||||||
|
None => {
|
||||||
|
return Err(Error::msg(format!(
|
||||||
|
"Marker {:?} is not a valid string",
|
||||||
|
marker
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
cfg.marker = marker.into();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(cfg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Preprocessor for Toc {
|
impl Preprocessor for Toc {
|
||||||
fn name(&self) -> &str {
|
fn name(&self) -> &str {
|
||||||
"toc"
|
"toc"
|
||||||
|
@ -20,23 +61,7 @@ impl Preprocessor for Toc {
|
||||||
|
|
||||||
fn run(&self, ctx: &PreprocessorContext, mut book: Book) -> Result<Book> {
|
fn run(&self, ctx: &PreprocessorContext, mut book: Book) -> Result<Book> {
|
||||||
let mut res = None;
|
let mut res = None;
|
||||||
let toc_marker = if let Some(cfg) = ctx.config.get_preprocessor(self.name()) {
|
let cfg = ctx.config.get_preprocessor(self.name()).try_into()?;
|
||||||
if let Some(marker) = cfg.get("marker") {
|
|
||||||
match marker.as_str() {
|
|
||||||
Some(m) => m,
|
|
||||||
None => {
|
|
||||||
return Err(Error::msg(format!(
|
|
||||||
"Marker {:?} is not a valid string",
|
|
||||||
marker
|
|
||||||
)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DEFAULT_MARKER
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DEFAULT_MARKER
|
|
||||||
};
|
|
||||||
|
|
||||||
book.for_each_mut(|item: &mut BookItem| {
|
book.for_each_mut(|item: &mut BookItem| {
|
||||||
if let Some(Err(_)) = res {
|
if let Some(Err(_)) = res {
|
||||||
|
@ -44,7 +69,7 @@ impl Preprocessor for Toc {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let BookItem::Chapter(ref mut chapter) = *item {
|
if let BookItem::Chapter(ref mut chapter) = *item {
|
||||||
res = Some(Toc::add_toc(chapter, &toc_marker).map(|md| {
|
res = Some(Toc::add_toc(chapter, &cfg.marker).map(|md| {
|
||||||
chapter.content = md;
|
chapter.content = md;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue