@@ -11,7 +11,12 @@ use gutenberg::Site; | |||||
use console::warn; | use console::warn; | ||||
fn notify_site_size(site: &Site) { | fn notify_site_size(site: &Site) { | ||||
println!("-> Creating {} pages and {} sections", site.pages.len(), site.sections.len()); | |||||
println!( | |||||
"-> Creating {} pages ({} orphan) and {} sections", | |||||
site.pages.len(), | |||||
site.get_all_orphan_pages().len(), | |||||
site.sections.len() | |||||
); | |||||
} | } | ||||
fn warn_about_ignored_pages(site: &Site) { | fn warn_about_ignored_pages(site: &Site) { | ||||
@@ -143,23 +143,27 @@ impl Page { | |||||
// 4. Find sections | // 4. Find sections | ||||
// Pages with custom urls exists outside of sections | // Pages with custom urls exists outside of sections | ||||
let mut path_set = false; | |||||
if let Some(ref u) = page.meta.url { | if let Some(ref u) = page.meta.url { | ||||
page.path = u.trim().to_string(); | page.path = u.trim().to_string(); | ||||
} else if !page.components.is_empty() { | |||||
path_set = true; | |||||
} | |||||
if !page.components.is_empty() { | |||||
// If we have a folder with an asset, don't consider it as a component | // If we have a folder with an asset, don't consider it as a component | ||||
if page.file_name == "index" { | if page.file_name == "index" { | ||||
page.components.pop(); | page.components.pop(); | ||||
// also set parent_path to grandparent instead | // also set parent_path to grandparent instead | ||||
page.parent_path = page.parent_path.parent().unwrap().to_path_buf(); | page.parent_path = page.parent_path.parent().unwrap().to_path_buf(); | ||||
} | } | ||||
// Don't add a trailing slash to sections | |||||
page.path = format!("{}/{}", page.components.join("/"), page.slug); | |||||
} else { | |||||
if !path_set { | |||||
// Don't add a trailing slash to sections | |||||
page.path = format!("{}/{}", page.components.join("/"), page.slug); | |||||
} | |||||
} else if !path_set { | |||||
page.path = page.slug.clone(); | page.path = page.slug.clone(); | ||||
} | } | ||||
page.permalink = config.make_permalink(&page.path); | page.permalink = config.make_permalink(&page.path); | ||||
Ok(page) | Ok(page) | ||||
@@ -122,6 +122,7 @@ impl Site { | |||||
self.live_reload = true; | self.live_reload = true; | ||||
} | } | ||||
/// Gets the path of all ignored pages in the site | |||||
pub fn get_ignored_pages(&self) -> Vec<PathBuf> { | pub fn get_ignored_pages(&self) -> Vec<PathBuf> { | ||||
self.sections | self.sections | ||||
.values() | .values() | ||||
@@ -129,6 +130,24 @@ impl Site { | |||||
.collect() | .collect() | ||||
} | } | ||||
/// Get all the orphan (== without section) pages in the site | |||||
pub fn get_all_orphan_pages(&self) -> Vec<&Page> { | |||||
let mut pages_in_sections = vec![]; | |||||
let mut orphans = vec![]; | |||||
for s in self.sections.values() { | |||||
pages_in_sections.extend(s.all_pages_path()); | |||||
} | |||||
for page in self.pages.values() { | |||||
if !pages_in_sections.contains(&page.file_path) { | |||||
orphans.push(page); | |||||
} | |||||
} | |||||
orphans | |||||
} | |||||
/// Used by tests to change the output path to a tmp dir | /// Used by tests to change the output path to a tmp dir | ||||
#[doc(hidden)] | #[doc(hidden)] | ||||
pub fn set_output_path<P: AsRef<Path>>(&mut self, path: P) { | pub fn set_output_path<P: AsRef<Path>>(&mut self, path: P) { | ||||
@@ -589,15 +608,9 @@ impl Site { | |||||
/// Renders all pages that do not belong to any sections | /// Renders all pages that do not belong to any sections | ||||
fn render_orphan_pages(&self) -> Result<()> { | fn render_orphan_pages(&self) -> Result<()> { | ||||
self.ensure_public_directory_exists()?; | self.ensure_public_directory_exists()?; | ||||
let mut pages_in_sections = vec![]; | |||||
for s in self.sections.values() { | |||||
pages_in_sections.extend(s.all_pages_path()); | |||||
} | |||||
for page in self.pages.values() { | |||||
if !pages_in_sections.contains(&page.file_path) { | |||||
self.render_page(page)?; | |||||
} | |||||
for page in self.get_all_orphan_pages() { | |||||
self.render_page(page)?; | |||||
} | } | ||||
Ok(()) | Ok(()) | ||||
@@ -3,7 +3,7 @@ extern crate tera; | |||||
extern crate tempdir; | extern crate tempdir; | ||||
use std::collections::HashMap; | use std::collections::HashMap; | ||||
use std::fs::File; | |||||
use std::fs::{File, create_dir}; | |||||
use std::path::Path; | use std::path::Path; | ||||
use tempdir::TempDir; | use tempdir::TempDir; | ||||
@@ -252,6 +252,29 @@ Hey there | |||||
assert!(page.content.starts_with("<pre")); | assert!(page.content.starts_with("<pre")); | ||||
} | } | ||||
#[test] | |||||
fn test_page_with_assets_gets_right_parent_path() { | |||||
let tmp_dir = TempDir::new("example").expect("create temp dir"); | |||||
let path = tmp_dir.path(); | |||||
create_dir(&path.join("content")).expect("create content temp dir"); | |||||
create_dir(&path.join("content").join("posts")).expect("create posts temp dir"); | |||||
let nested_path = path.join("content").join("posts").join("assets"); | |||||
create_dir(&nested_path).expect("create nested temp dir"); | |||||
File::create(nested_path.join("index.md")).unwrap(); | |||||
File::create(nested_path.join("example.js")).unwrap(); | |||||
File::create(nested_path.join("graph.jpg")).unwrap(); | |||||
File::create(nested_path.join("fail.png")).unwrap(); | |||||
let res = Page::parse( | |||||
&nested_path.join("index.md").as_path(), | |||||
"+++\nurl=\"hey\"+++\n", | |||||
&Config::default() | |||||
); | |||||
assert!(res.is_ok()); | |||||
let page = res.unwrap(); | |||||
assert_eq!(page.parent_path, path.join("content").join("posts")); | |||||
} | |||||
#[test] | #[test] | ||||
fn test_file_not_named_index_with_assets() { | fn test_file_not_named_index_with_assets() { | ||||
let tmp_dir = TempDir::new("example").expect("create temp dir"); | let tmp_dir = TempDir::new("example").expect("create temp dir"); | ||||