Section extra -> SitemapEntry (#850)
This commit is contained in:
parent
1a6edbcf63
commit
a89b30073c
|
@ -1,11 +1,9 @@
|
||||||
use std::collections::HashMap;
|
use tera::{Map, Value};
|
||||||
|
|
||||||
use tera::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>,
|
pub permalink: Cow<'a, str>,
|
||||||
date: Option<String>,
|
pub date: Option<String>,
|
||||||
extra: Option<&'a Map<String, Value>>,
|
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"
|
||||||
+++
|
+++
|
||||||
|
|
Loading…
Reference in a new issue