Rename taxonomies paginate and error on unknown ones
This commit is contained in:
parent
2f100ecd01
commit
18bef00671
|
@ -35,7 +35,7 @@ pub struct Taxonomy {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// If this is set, the list of individual taxonomy term page will be paginated
|
/// If this is set, the list of individual taxonomy term page will be paginated
|
||||||
/// by this much
|
/// by this much
|
||||||
pub paginate: Option<usize>,
|
pub paginate_by: Option<usize>,
|
||||||
pub paginate_path: Option<String>,
|
pub paginate_path: Option<String>,
|
||||||
/// Whether to generate a RSS feed only for each taxonomy term, defaults to false
|
/// Whether to generate a RSS feed only for each taxonomy term, defaults to false
|
||||||
pub rss: bool,
|
pub rss: bool,
|
||||||
|
@ -43,7 +43,7 @@ pub struct Taxonomy {
|
||||||
|
|
||||||
impl Taxonomy {
|
impl Taxonomy {
|
||||||
pub fn is_paginated(&self) -> bool {
|
pub fn is_paginated(&self) -> bool {
|
||||||
if let Some(paginate_by) = self.paginate {
|
if let Some(paginate_by) = self.paginate_by {
|
||||||
paginate_by > 0
|
paginate_by > 0
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
|
@ -55,7 +55,7 @@ impl Default for Taxonomy {
|
||||||
fn default() -> Taxonomy {
|
fn default() -> Taxonomy {
|
||||||
Taxonomy {
|
Taxonomy {
|
||||||
name: String::new(),
|
name: String::new(),
|
||||||
paginate: None,
|
paginate_by: None,
|
||||||
paginate_path: None,
|
paginate_path: None,
|
||||||
rss: false,
|
rss: false,
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ impl<'a> Paginator<'a> {
|
||||||
/// Create a new paginator from a taxonomy
|
/// Create a new paginator from a taxonomy
|
||||||
/// It will always at least create one pager (the first) even if there are no pages to paginate
|
/// It will always at least create one pager (the first) even if there are no pages to paginate
|
||||||
pub fn from_taxonomy(taxonomy: &'a Taxonomy, item: &'a TaxonomyItem) -> Paginator<'a> {
|
pub fn from_taxonomy(taxonomy: &'a Taxonomy, item: &'a TaxonomyItem) -> Paginator<'a> {
|
||||||
let paginate_by = taxonomy.kind.paginate.unwrap();
|
let paginate_by = taxonomy.kind.paginate_by.unwrap();
|
||||||
let mut paginator = Paginator {
|
let mut paginator = Paginator {
|
||||||
all_pages: &item.pages,
|
all_pages: &item.pages,
|
||||||
pagers: vec![],
|
pagers: vec![],
|
||||||
|
@ -339,7 +339,7 @@ mod tests {
|
||||||
];
|
];
|
||||||
let taxonomy_def = TaxonomyConfig {
|
let taxonomy_def = TaxonomyConfig {
|
||||||
name: "tags".to_string(),
|
name: "tags".to_string(),
|
||||||
paginate: Some(2),
|
paginate_by: Some(2),
|
||||||
..TaxonomyConfig::default()
|
..TaxonomyConfig::default()
|
||||||
};
|
};
|
||||||
let taxonomy_item = TaxonomyItem {
|
let taxonomy_item = TaxonomyItem {
|
||||||
|
|
|
@ -112,7 +112,7 @@ fn delete_element(site: &mut Site, path: &Path, is_section: bool) -> Result<()>
|
||||||
site.permalinks.remove(&p.file.relative);
|
site.permalinks.remove(&p.file.relative);
|
||||||
|
|
||||||
if !p.meta.taxonomies.is_empty() {
|
if !p.meta.taxonomies.is_empty() {
|
||||||
site.populate_taxonomies();
|
site.populate_taxonomies()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if there is a parent section, we will need to re-render it
|
// if there is a parent section, we will need to re-render it
|
||||||
|
@ -207,7 +207,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> {
|
||||||
// Sort always comes first if present so the rendering will be fine
|
// Sort always comes first if present so the rendering will be fine
|
||||||
match changes {
|
match changes {
|
||||||
PageChangesNeeded::Taxonomies => {
|
PageChangesNeeded::Taxonomies => {
|
||||||
site.populate_taxonomies();
|
site.populate_taxonomies()?;
|
||||||
site.register_tera_global_fns();
|
site.register_tera_global_fns();
|
||||||
site.render_taxonomies()?;
|
site.render_taxonomies()?;
|
||||||
},
|
},
|
||||||
|
@ -240,7 +240,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> {
|
||||||
// It's a new page!
|
// It's a new page!
|
||||||
None => {
|
None => {
|
||||||
site.populate_sections();
|
site.populate_sections();
|
||||||
site.populate_taxonomies();
|
site.populate_taxonomies()?;
|
||||||
site.register_tera_global_fns();
|
site.register_tera_global_fns();
|
||||||
// No need to optimise that yet, we can revisit if it becomes an issue
|
// No need to optimise that yet, we can revisit if it becomes an issue
|
||||||
site.build()
|
site.build()
|
||||||
|
|
|
@ -246,7 +246,7 @@ impl Site {
|
||||||
self.register_early_global_fns();
|
self.register_early_global_fns();
|
||||||
self.render_markdown()?;
|
self.render_markdown()?;
|
||||||
self.populate_sections();
|
self.populate_sections();
|
||||||
self.populate_taxonomies();
|
self.populate_taxonomies()?;
|
||||||
self.register_tera_global_fns();
|
self.register_tera_global_fns();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -407,9 +407,9 @@ impl Site {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Find all the tags and categories if it's asked in the config
|
/// Find all the tags and categories if it's asked in the config
|
||||||
pub fn populate_taxonomies(&mut self) {
|
pub fn populate_taxonomies(&mut self) -> Result<()> {
|
||||||
if self.config.taxonomies.is_empty() {
|
if self.config.taxonomies.is_empty() {
|
||||||
return;
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
self.taxonomies = find_taxonomies(
|
self.taxonomies = find_taxonomies(
|
||||||
|
@ -420,7 +420,9 @@ impl Site {
|
||||||
.cloned()
|
.cloned()
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.as_slice()
|
.as_slice()
|
||||||
);
|
)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inject live reload script tag if in live reload mode
|
/// Inject live reload script tag if in live reload mode
|
||||||
|
|
|
@ -223,7 +223,7 @@ fn can_build_site_with_taxonomies() {
|
||||||
taxonomies
|
taxonomies
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
site.populate_taxonomies();
|
site.populate_taxonomies().unwrap();
|
||||||
let tmp_dir = tempdir().expect("create temp dir");
|
let tmp_dir = tempdir().expect("create temp dir");
|
||||||
let public = &tmp_dir.path().join("public");
|
let public = &tmp_dir.path().join("public");
|
||||||
site.set_output_path(&public);
|
site.set_output_path(&public);
|
||||||
|
|
|
@ -3,6 +3,7 @@ extern crate serde_derive;
|
||||||
extern crate tera;
|
extern crate tera;
|
||||||
extern crate slug;
|
extern crate slug;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
extern crate errors;
|
extern crate errors;
|
||||||
extern crate config;
|
extern crate config;
|
||||||
extern crate content;
|
extern crate content;
|
||||||
|
@ -110,7 +111,7 @@ impl Taxonomy {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec<Taxonomy> {
|
pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Result<Vec<Taxonomy>> {
|
||||||
let taxonomies_def = {
|
let taxonomies_def = {
|
||||||
let mut m = HashMap::new();
|
let mut m = HashMap::new();
|
||||||
for t in &config.taxonomies {
|
for t in &config.taxonomies {
|
||||||
|
@ -136,7 +137,7 @@ pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec<Taxonomy> {
|
||||||
.push(page.clone());
|
.push(page.clone());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: bail with error
|
bail!("Page `{}` has taxonomy `{}` which is not defined in config.toml", page.file.path.display(), name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,7 +148,7 @@ pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec<Taxonomy> {
|
||||||
taxonomies.push(Taxonomy::new(taxonomies_def[name].clone(), config, taxo));
|
taxonomies.push(Taxonomy::new(taxonomies_def[name].clone(), config, taxo));
|
||||||
}
|
}
|
||||||
|
|
||||||
taxonomies
|
Ok(taxonomies)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -184,7 +185,7 @@ mod tests {
|
||||||
page3.meta.taxonomies = taxo_page3;
|
page3.meta.taxonomies = taxo_page3;
|
||||||
let pages = vec![page1, page2, page3];
|
let pages = vec![page1, page2, page3];
|
||||||
|
|
||||||
let taxonomies = find_taxonomies(&config, &pages);
|
let taxonomies = find_taxonomies(&config, &pages).unwrap();
|
||||||
let (tags, categories, authors) = {
|
let (tags, categories, authors) = {
|
||||||
let mut t = None;
|
let mut t = None;
|
||||||
let mut c = None;
|
let mut c = None;
|
||||||
|
@ -228,4 +229,22 @@ mod tests {
|
||||||
assert_eq!(categories.items[1].permalink, "http://a-website.com/categories/programming-tutorials/");
|
assert_eq!(categories.items[1].permalink, "http://a-website.com/categories/programming-tutorials/");
|
||||||
assert_eq!(categories.items[1].pages.len(), 1);
|
assert_eq!(categories.items[1].pages.len(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn errors_on_unknown_taxonomy() {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.taxonomies = vec![
|
||||||
|
Taxonomy {name: "authors".to_string(), ..Taxonomy::default()},
|
||||||
|
];
|
||||||
|
let mut page1 = Page::default();
|
||||||
|
let mut taxo_page1 = HashMap::new();
|
||||||
|
taxo_page1.insert("tags".to_string(), vec!["rust".to_string(), "db".to_string()]);
|
||||||
|
page1.meta.taxonomies = taxo_page1;
|
||||||
|
|
||||||
|
let taxonomies = find_taxonomies(&config, &vec![page1]);
|
||||||
|
assert!(taxonomies.is_err());
|
||||||
|
let err = taxonomies.unwrap_err();
|
||||||
|
// no path as this is created by Default
|
||||||
|
assert_eq!(err.description(), "Page `` has taxonomy `tags` which is not defined in config.toml");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ The first step is to define the taxonomies in your [config.toml](./documentation
|
||||||
A taxonomy has 4 variables:
|
A taxonomy has 4 variables:
|
||||||
|
|
||||||
- `name`: a required string that will be used in the URLs, usually the plural version (i.e. tags, categories etc)
|
- `name`: a required string that will be used in the URLs, usually the plural version (i.e. tags, categories etc)
|
||||||
- `paginate`: if this is set to a number, each term page will be paginated by this much.
|
- `paginate_by`: if this is set to a number, each term page will be paginated by this much.
|
||||||
- `paginate_path`: if set, will be the path used by paginated page and the page number will be appended after it.
|
- `paginate_path`: if set, will be the path used by paginated page and the page number will be appended after it.
|
||||||
For example the default would be page/1
|
For example the default would be page/1
|
||||||
- `rss`: if set to `true`, a RSS feed will be generated for each individual term.
|
- `rss`: if set to `true`, a RSS feed will be generated for each individual term.
|
||||||
|
|
|
@ -44,7 +44,7 @@ rss_limit = 20
|
||||||
# Example:
|
# Example:
|
||||||
# taxonomies = [
|
# taxonomies = [
|
||||||
# {name: "tags", rss: true}, # each tag will have its own RSS feed
|
# {name: "tags", rss: true}, # each tag will have its own RSS feed
|
||||||
# {name: "categories", paginate: 5}, # 5 terms per page
|
# {name: "categories", paginate_by: 5}, # 5 terms per page
|
||||||
# ]
|
# ]
|
||||||
#
|
#
|
||||||
taxonomies = []
|
taxonomies = []
|
||||||
|
|
Loading…
Reference in a new issue