mdbook_all_the_markdowns/
lib.rs

1use crate::config::Config;
2use std::convert::TryInto;
3use std::path::PathBuf;
4
5use mdbook::book::{Book, BookItem, Chapter, SectionNumber};
6use mdbook::errors::Error;
7use mdbook::preprocess::{Preprocessor, PreprocessorContext};
8
9pub mod config;
10pub mod finder;
11
12pub struct AllMarkdown;
13
14impl AllMarkdown {
15    pub fn new() -> AllMarkdown {
16        AllMarkdown
17    }
18}
19
20impl Default for AllMarkdown {
21    fn default() -> AllMarkdown {
22        AllMarkdown
23    }
24}
25
26impl Preprocessor for AllMarkdown {
27    fn name(&self) -> &str {
28        "all-the-markdowns"
29    }
30
31    fn run(&self, ctx: &PreprocessorContext, book: Book) -> Result<Book, Error> {
32        let cfg: Config = ctx.config.get_preprocessor(self.name()).try_into().unwrap();
33        let draft_folders = cfg.draft_folders.clone();
34        let mut b = book;
35
36        for section in cfg.sections {
37            if let Some(title) = section.title {
38                b.push_item(BookItem::PartTitle(title));
39            }
40
41            finder::find_markdown_files(section.base, section.ignore)
42                .iter()
43                .for_each(|file| {
44                    let (title, content) = file
45                        .content()
46                        .unwrap_or(("UNKNOWN".into(), "Could not get file content".into()));
47
48                    let mut chapter = if draft_folders && file.is_folder {
49                        Chapter::new_draft(title.as_str(), vec![])
50                    } else {
51                        Chapter::new(
52                            title.as_str(),
53                            content,
54                            PathBuf::from(file.filename.clone()),
55                            vec![],
56                        )
57                    };
58
59                    chapter.number = Some(SectionNumber(file.section.clone()));
60                    b.push_item(BookItem::Chapter(chapter));
61                });
62        }
63
64        Ok(b)
65    }
66
67    fn supports_renderer(&self, _renderer: &str) -> bool {
68        true
69    }
70}