Slighty smarter rebuild on page content change

This commit is contained in:
Vincent Prouillet 2017-05-11 14:33:23 +09:00
parent 40b5a0547a
commit 1e0744601e

View file

@ -212,11 +212,15 @@ impl Site {
}
/// Called in serve, add a page again updating permalinks and its content
fn add_page_and_render(&mut self, path: &Path) -> Result<()> {
/// The bool in the result is whether the front matter has been updated or not
fn add_page_and_render(&mut self, path: &Path) -> Result<(bool, Page)> {
let existing_page = self.pages.get(path).expect("Page was supposed to exist in add_page_and_render").clone();
self.add_page(path)?;
let mut page = self.pages.get_mut(path).unwrap();
self.permalinks.insert(page.relative_path.clone(), page.permalink.clone());
page.render_markdown(&self.permalinks, &self.tera, &self.config)
page.render_markdown(&self.permalinks, &self.tera, &self.config)?;
Ok((existing_page.meta != page.meta, page.clone()))
}
/// Find out the direct subsections of each subsection if there are some
@ -337,25 +341,37 @@ impl Site {
self.add_section(path)?;
} else {
// probably just an update so just re-parse that page
// TODO: we can compare the frontmatter of the existing and new one
// to see if we need to update re-build the whole thing or just that
// page
self.add_page_and_render(path)?;
}
} else if is_section {
// File doesn't exist -> a deletion so we remove it from everything
let relative_path = self.sections[path].relative_path.clone();
self.sections.remove(path);
self.permalinks.remove(&relative_path);
let (frontmatter_changed, page) = self.add_page_and_render(path)?;
// TODO: can probably be smarter and check what changed
if frontmatter_changed {
self.populate_sections();
self.populate_tags_and_categories();
self.build()?;
} else {
let relative_path = self.pages[path].relative_path.clone();
self.pages.remove(path);
self.render_page(&page)?;
}
}
} else {
// File doesn't exist -> a deletion so we remove it from everything
let relative_path = if is_section {
self.sections[path].relative_path.clone()
} else {
self.pages[path].relative_path.clone()
};
self.permalinks.remove(&relative_path);
if is_section {
self.sections.remove(path);
} else {
self.pages.remove(path);
}
// TODO: probably no need to do that, we should be able to only re-render a page or a section.
self.populate_sections();
self.populate_tags_and_categories();
self.build()
self.build()?;
}
Ok(())
}
pub fn rebuild_after_template_change(&mut self, path: &Path) -> Result<()> {
@ -577,9 +593,6 @@ impl Site {
.collect();
for section in self.sections.values() {
if !section.meta.should_render() {
continue;
}
let mut output_path = public.to_path_buf();
for component in &section.components {
output_path.push(component);
@ -589,6 +602,14 @@ impl Site {
}
}
for page in &section.pages {
self.render_page(page)?;
}
if !section.meta.should_render() {
continue;
}
if section.meta.is_paginated() {
self.render_paginated(&output_path, section)?;
} else {
@ -599,10 +620,6 @@ impl Site {
)?;
create_file(output_path.join("index.html"), &self.inject_livereload(output))?;
}
for page in &section.pages {
self.render_page(page)?;
}
}
Ok(())