@@ -1,11 +1,9 @@ | |||||
use std::collections::HashMap; | |||||
use tera::Value; | |||||
use tera::{Map, Value}; | |||||
use toml; | use toml; | ||||
use errors::Result; | |||||
use super::{InsertAnchor, SortBy}; | use super::{InsertAnchor, SortBy}; | ||||
use errors::Result; | |||||
use utils::de::fix_toml_dates; | |||||
static DEFAULT_PAGINATE_PATH: &str = "page"; | static DEFAULT_PAGINATE_PATH: &str = "page"; | ||||
@@ -63,16 +61,21 @@ pub struct SectionFrontMatter { | |||||
#[serde(skip_serializing)] | #[serde(skip_serializing)] | ||||
pub aliases: Vec<String>, | pub aliases: Vec<String>, | ||||
/// Any extra parameter present in the front matter | /// Any extra parameter present in the front matter | ||||
pub extra: HashMap<String, Value>, | |||||
pub extra: Map<String, Value>, | |||||
} | } | ||||
impl SectionFrontMatter { | impl SectionFrontMatter { | ||||
pub fn parse(toml: &str) -> Result<SectionFrontMatter> { | pub fn parse(toml: &str) -> Result<SectionFrontMatter> { | ||||
let f: SectionFrontMatter = match toml::from_str(toml) { | |||||
let mut f: SectionFrontMatter = match toml::from_str(toml) { | |||||
Ok(d) => d, | Ok(d) => d, | ||||
Err(e) => bail!(e), | Err(e) => bail!(e), | ||||
}; | }; | ||||
f.extra = match fix_toml_dates(f.extra) { | |||||
Value::Object(o) => o, | |||||
_ => unreachable!("Got something other than a table in section extra"), | |||||
}; | |||||
Ok(f) | Ok(f) | ||||
} | } | ||||
@@ -102,7 +105,7 @@ impl Default for SectionFrontMatter { | |||||
transparent: false, | transparent: false, | ||||
page_template: None, | page_template: None, | ||||
aliases: Vec::new(), | aliases: Vec::new(), | ||||
extra: HashMap::new(), | |||||
extra: Map::new(), | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -206,7 +206,7 @@ pub struct SerializingSection<'a> { | |||||
ancestors: Vec<String>, | ancestors: Vec<String>, | ||||
title: &'a Option<String>, | title: &'a Option<String>, | ||||
description: &'a Option<String>, | description: &'a Option<String>, | ||||
extra: &'a HashMap<String, Value>, | |||||
extra: &'a Map<String, Value>, | |||||
path: &'a str, | path: &'a str, | ||||
components: &'a [String], | components: &'a [String], | ||||
toc: &'a [Heading], | toc: &'a [Heading], | ||||
@@ -20,7 +20,7 @@ extern crate utils; | |||||
#[cfg(test)] | #[cfg(test)] | ||||
extern crate tempfile; | extern crate tempfile; | ||||
mod sitemap; | |||||
pub mod sitemap; | |||||
use std::collections::HashMap; | use std::collections::HashMap; | ||||
use std::fs::{copy, create_dir_all, remove_dir_all}; | use std::fs::{copy, create_dir_all, remove_dir_all}; | ||||
@@ -11,9 +11,9 @@ use tera::{Map, Value}; | |||||
/// for examples so we trim down all entries to only that | /// for examples so we trim down all entries to only that | ||||
#[derive(Debug, Serialize)] | #[derive(Debug, Serialize)] | ||||
pub struct SitemapEntry<'a> { | pub struct SitemapEntry<'a> { | ||||
permalink: Cow<'a, str>, | |||||
date: Option<String>, | |||||
extra: Option<&'a Map<String, Value>>, | |||||
pub permalink: Cow<'a, str>, | |||||
pub date: Option<String>, | |||||
pub extra: Option<&'a Map<String, Value>>, | |||||
} | } | ||||
// Hash/Eq is not implemented for tera::Map but in our case we only care about the permalink | // Hash/Eq is not implemented for tera::Map but in our case we only care about the permalink | ||||
@@ -77,7 +77,11 @@ pub fn find_entries<'a>( | |||||
.sections_values() | .sections_values() | ||||
.iter() | .iter() | ||||
.filter(|s| s.meta.render) | .filter(|s| s.meta.render) | ||||
.map(|s| SitemapEntry::new(Cow::Borrowed(&s.permalink), None)) | |||||
.map(|s| { | |||||
let mut entry = SitemapEntry::new(Cow::Borrowed(&s.permalink), None); | |||||
entry.add_extra(&s.meta.extra); | |||||
entry | |||||
}) | |||||
.collect::<Vec<_>>(); | .collect::<Vec<_>>(); | ||||
for section in library.sections_values().iter().filter(|s| s.meta.paginate_by.is_some()) { | for section in library.sections_values().iter().filter(|s| s.meta.paginate_by.is_some()) { | ||||
@@ -8,6 +8,7 @@ use std::path::Path; | |||||
use common::{build_site, build_site_with_setup}; | use common::{build_site, build_site_with_setup}; | ||||
use config::Taxonomy; | use config::Taxonomy; | ||||
use site::sitemap; | |||||
use site::Site; | use site::Site; | ||||
#[test] | #[test] | ||||
@@ -87,6 +88,19 @@ fn can_parse_site() { | |||||
.unwrap(); | .unwrap(); | ||||
assert_eq!(prog_section.subsections.len(), 0); | assert_eq!(prog_section.subsections.len(), 0); | ||||
assert_eq!(prog_section.pages.len(), 2); | assert_eq!(prog_section.pages.len(), 2); | ||||
// Testing extra variables in sections & sitemaps | |||||
// Regression test for #https://github.com/getzola/zola/issues/842 | |||||
assert_eq!( | |||||
prog_section.meta.extra.get("we_have_extra").and_then(|s| s.as_str()), | |||||
Some("variables") | |||||
); | |||||
let sitemap_entries = sitemap::find_entries(&library, &site.taxonomies[..], &site.config); | |||||
let sitemap_entry = sitemap_entries | |||||
.iter() | |||||
.find(|e| e.permalink.ends_with("tutorials/programming/")) | |||||
.expect("expected to find programming section in sitemap"); | |||||
assert_eq!(Some(&prog_section.meta.extra), sitemap_entry.extra); | |||||
} | } | ||||
#[test] | #[test] | ||||
@@ -2,4 +2,7 @@ | |||||
title = "Programming" | title = "Programming" | ||||
sort_by = "weight" | sort_by = "weight" | ||||
weight = 1 | weight = 1 | ||||
[extra] | |||||
we_have_extra = "variables" | |||||
+++ | +++ |