Browse Source

Section extra -> SitemapEntry (#850)

index-subcmd
Stan Rozenraukh Vincent Prouillet 5 years ago
parent
commit
a89b30073c
6 changed files with 38 additions and 14 deletions
  1. +11
    -8
      components/front_matter/src/section.rs
  2. +1
    -1
      components/library/src/content/ser.rs
  3. +1
    -1
      components/site/src/lib.rs
  4. +8
    -4
      components/site/src/sitemap.rs
  5. +14
    -0
      components/site/tests/site.rs
  6. +3
    -0
      test_site/content/posts/tutorials/programming/_index.md

+ 11
- 8
components/front_matter/src/section.rs View File

@@ -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(),
} }
} }
} }

+ 1
- 1
components/library/src/content/ser.rs View File

@@ -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],


+ 1
- 1
components/site/src/lib.rs View File

@@ -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};


+ 8
- 4
components/site/src/sitemap.rs View File

@@ -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()) {


+ 14
- 0
components/site/tests/site.rs View File

@@ -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]


+ 3
- 0
test_site/content/posts/tutorials/programming/_index.md View File

@@ -2,4 +2,7 @@
title = "Programming" title = "Programming"
sort_by = "weight" sort_by = "weight"
weight = 1 weight = 1

[extra]
we_have_extra = "variables"
+++ +++

Loading…
Cancel
Save