@@ -11,7 +11,12 @@ use gutenberg::Site; | |||
use console::warn; | |||
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) { | |||
@@ -143,23 +143,27 @@ impl Page { | |||
// 4. Find sections | |||
// Pages with custom urls exists outside of sections | |||
let mut path_set = false; | |||
if let Some(ref u) = page.meta.url { | |||
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 page.file_name == "index" { | |||
page.components.pop(); | |||
// also set parent_path to grandparent instead | |||
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.permalink = config.make_permalink(&page.path); | |||
Ok(page) | |||
@@ -122,6 +122,7 @@ impl Site { | |||
self.live_reload = true; | |||
} | |||
/// Gets the path of all ignored pages in the site | |||
pub fn get_ignored_pages(&self) -> Vec<PathBuf> { | |||
self.sections | |||
.values() | |||
@@ -129,6 +130,24 @@ impl Site { | |||
.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 | |||
#[doc(hidden)] | |||
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 | |||
fn render_orphan_pages(&self) -> Result<()> { | |||
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(()) | |||
@@ -3,7 +3,7 @@ extern crate tera; | |||
extern crate tempdir; | |||
use std::collections::HashMap; | |||
use std::fs::File; | |||
use std::fs::{File, create_dir}; | |||
use std::path::Path; | |||
use tempdir::TempDir; | |||
@@ -252,6 +252,29 @@ Hey there | |||
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] | |||
fn test_file_not_named_index_with_assets() { | |||
let tmp_dir = TempDir::new("example").expect("create temp dir"); | |||