mdbook_all_the_markdowns/
lib.rs1use 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}