diff options
author | Lars Wirzenius <liw@liw.fi> | 2022-10-15 10:32:56 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2022-10-15 10:32:56 +0300 |
commit | 16d7107dff4d1e2f4b1a1a42dee8bfee38628052 (patch) | |
tree | 9b6942da353ce7ba11122e320458fda41213f1c7 | |
parent | 5a0e8a1a7bdf9b8dbe8e425643aaef259624fa69 (diff) | |
download | riki-16d7107dff4d1e2f4b1a1a42dee8bfee38628052.tar.gz |
fix: split page processing so that preparation is clearly separate
Sponsored-by: author
-rw-r--r-- | src/site.rs | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/site.rs b/src/site.rs index c522fcc..c1449d8 100644 --- a/src/site.rs +++ b/src/site.rs @@ -16,7 +16,7 @@ pub struct Site { whatchanged: HashMap<PathBuf, SystemTime>, shortcuts: HashMap<String, Shortcut>, builder: NameBuilder, - wikitext_pages: Vec<WikitextPage>, + unprocessed_pages: Vec<UnprocessedPage>, markdown_pages: Vec<MarkdownPage>, names_to_process: BinaryHeap<Name>, pages_that_will_exist: PageSet, @@ -33,7 +33,7 @@ impl Site { { Self { builder: NameBuilder::new(srcdir.as_ref(), destdir.as_ref()), - wikitext_pages: vec![], + unprocessed_pages: vec![], markdown_pages: vec![], files: Names::default(), patterns: TokenPatterns::default(), @@ -62,10 +62,18 @@ impl Site { Ok(()) } - fn add_wikitextpage(&mut self, page: WikitextPage) { + fn add_wikitextpage(&mut self, page: WikitextPage) -> Result<(), SiteError> { info!("add wikitext page {}", page.meta().path().display()); self.pages_that_will_exist.insert(&page); - self.wikitext_pages.push(page); + + debug!("processing wikitext page {}", page.meta().path().display()); + let mut parser = WikitextParser::new(page.wikitext(), &self.patterns); + let page = UnprocessedPage::new(page.meta().clone(), &mut parser)?; + page.prepare(self)?; + + self.unprocessed_pages.push(page); + + Ok(()) } fn add_other_file(&mut self, name: Name) { @@ -76,7 +84,7 @@ impl Site { pub fn process(&mut self) -> Result<(), SiteError> { trace!("processing queues"); loop { - if !self.process_name()? && !self.process_wikipage()? { + if !self.process_name()? && !self.process_page()? { trace!("processing queues done"); break; } @@ -92,7 +100,7 @@ impl Site { page.meta_mut().set_mtime(mtime); } self.files.insert(name); - self.add_wikitextpage(page); + self.add_wikitextpage(page)?; Ok(true) } else { trace!("name_queue was empty"); @@ -108,12 +116,8 @@ impl Site { self.whatchanged.get(relative).copied() } - fn process_wikipage(&mut self) -> Result<bool, SiteError> { - if let Some(page) = self.wikitext_pages.pop() { - debug!("processing wikitext page {}", page.meta().path().display()); - let mut parser = WikitextParser::new(page.wikitext(), &self.patterns); - let page = UnprocessedPage::new(page.meta().clone(), &mut parser)?; - page.prepare(self)?; + fn process_page(&mut self) -> Result<bool, SiteError> { + if let Some(page) = self.unprocessed_pages.pop() { debug!( "processing unprocessed page {}", page.meta().path().display() @@ -360,7 +364,7 @@ mod test { #[test] fn absolute_link_resolves_to_link_relative_root_of_site() { let mut site = site(); - site.add_wikitextpage(page("/src/yo/yoyo")); + site.add_wikitextpage(page("/src/yo/yoyo")).unwrap(); assert_eq!( site.resolve("/foo/bar", "/yo/yoyo").unwrap(), Path::new("../yo/yoyo") @@ -382,7 +386,7 @@ mod test { #[test] fn link_to_sibling_resolves_to_it() { let mut site = site(); - site.add_wikitextpage(page("/src/foo/yo")); + site.add_wikitextpage(page("/src/foo/yo")).unwrap(); site.process().unwrap(); assert_eq!(site.resolve("/foo/bar", "yo").unwrap(), Path::new("yo")); } @@ -390,7 +394,7 @@ mod test { #[test] fn link_using_other_casing_is_resolved() { let mut site = site(); - site.add_wikitextpage(page("/src/foo/yo")); + site.add_wikitextpage(page("/src/foo/yo")).unwrap(); site.process().unwrap(); assert_eq!(site.resolve("/foo/bar", "YO").unwrap(), Path::new("yo")); } @@ -398,7 +402,7 @@ mod test { #[test] fn link_to_sublpage_resolves_to_it() { let mut site = site(); - site.add_wikitextpage(page("/src/foo/bar/yo")); + site.add_wikitextpage(page("/src/foo/bar/yo")).unwrap(); site.process().unwrap(); assert_eq!(site.resolve("/foo/bar", "yo").unwrap(), Path::new("bar/yo")); } @@ -406,8 +410,8 @@ mod test { #[test] fn link_to_sublpage_resolves_to_it_and_not_sibling() { let mut site = site(); - site.add_wikitextpage(page("/src/foo/bar/yo")); - site.add_wikitextpage(page("/src/foo/yo")); + site.add_wikitextpage(page("/src/foo/bar/yo")).unwrap(); + site.add_wikitextpage(page("/src/foo/yo")).unwrap(); site.process().unwrap(); assert_eq!(site.resolve("/foo/bar", "yo").unwrap(), Path::new("bar/yo")); } @@ -428,7 +432,7 @@ mod test { #[test] fn link_to_subsubpage_resolves_to_it() { let mut site = site(); - site.add_wikitextpage(page("/src/foo/bar/yo/yoyo")); + site.add_wikitextpage(page("/src/foo/bar/yo/yoyo")).unwrap(); site.process().unwrap(); assert_eq!( site.resolve("/foo/bar", "yo/yoyo").unwrap(), @@ -451,7 +455,7 @@ mod test { #[test] fn link_relative_to_root_as_last_resort() { let mut site = site(); - site.add_wikitextpage(page("/src/foo.mdwn")); + site.add_wikitextpage(page("/src/foo.mdwn")).unwrap(); site.process().unwrap(); assert_eq!( site.resolve("/yo/yoyo/yoyoyo", "foo").unwrap(), |