summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-10-15 10:32:56 +0300
committerLars Wirzenius <liw@liw.fi>2022-10-15 10:32:56 +0300
commit16d7107dff4d1e2f4b1a1a42dee8bfee38628052 (patch)
tree9b6942da353ce7ba11122e320458fda41213f1c7
parent5a0e8a1a7bdf9b8dbe8e425643aaef259624fa69 (diff)
downloadriki-16d7107dff4d1e2f4b1a1a42dee8bfee38628052.tar.gz
fix: split page processing so that preparation is clearly separate
Sponsored-by: author
-rw-r--r--src/site.rs44
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(),