diff options
Diffstat (limited to 'src/page.rs')
-rw-r--r-- | src/page.rs | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/page.rs b/src/page.rs index 2b4bd9f..832e71e 100644 --- a/src/page.rs +++ b/src/page.rs @@ -1,3 +1,4 @@ +use crate::directive::{Processed, Toc}; use crate::error::SiteError; use crate::html::{parse, Content, Element, ElementTag, HtmlPage}; use crate::name::Name; @@ -24,7 +25,7 @@ impl WikitextPage { info!("input file: {}", name); let src = name.source_path(); - let data = std::fs::read(&src).map_err(|e| SiteError::FileRead(src.into(), e))?; + let data = std::fs::read(src).map_err(|e| SiteError::FileRead(src.into(), e))?; let wikitext = String::from_utf8(data).map_err(|e| SiteError::Utf8(src.into(), e))?; let mtime = get_mtime(src)?; @@ -84,10 +85,26 @@ impl UnprocessedPage { pub fn process(&self, site: &mut Site) -> Result<MarkdownPage, SiteError> { let mut meta = self.meta.clone(); - let mut m = String::new(); + let mut processed = vec![]; trace!("UnprocessedPage: processing snippets"); for snippet in self.snippets.iter() { - m.push_str(&snippet.process(site, &mut meta)?); + processed.push(snippet.process(site, &mut meta)?); + } + let page_text = processed + .iter() + .filter_map(|p| match p { + Processed::Markdown(s) => Some(s.as_str()), + _ => None, + }) + .collect::<Vec<&str>>() + .join(""); + let body = parse(&page_text)?; + let mut m = String::new(); + for p in processed { + match p { + Processed::Markdown(s) => m.push_str(&s), + Processed::Toc(levels) => m.push_str(&Toc::post_process(&body, levels)), + } } Ok(MarkdownPage::new(m, meta)) } |