mirror of
https://github.com/getzola/zola
synced 2024-12-14 06:12:27 +00:00
Strip base_path from page/section paths
To ensure we will get the right `content` directory. Fix #629
This commit is contained in:
parent
ea50b4ba90
commit
eccb1e9986
7 changed files with 153 additions and 68 deletions
|
@ -52,11 +52,13 @@ pub struct FileInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FileInfo {
|
impl FileInfo {
|
||||||
pub fn new_page(path: &Path) -> FileInfo {
|
pub fn new_page(path: &Path, base_path: &PathBuf) -> FileInfo {
|
||||||
let file_path = path.to_path_buf();
|
let file_path = path.to_path_buf();
|
||||||
let mut parent = file_path.parent().unwrap().to_path_buf();
|
let mut parent = file_path.parent().expect("Get parent of page").to_path_buf();
|
||||||
let name = path.file_stem().unwrap().to_string_lossy().to_string();
|
let name = path.file_stem().unwrap().to_string_lossy().to_string();
|
||||||
let mut components = find_content_components(&file_path);
|
let mut components = find_content_components(
|
||||||
|
&file_path.strip_prefix(base_path).expect("Strip base path prefix for page"),
|
||||||
|
);
|
||||||
let relative = if !components.is_empty() {
|
let relative = if !components.is_empty() {
|
||||||
format!("{}/{}.md", components.join("/"), name)
|
format!("{}/{}.md", components.join("/"), name)
|
||||||
} else {
|
} else {
|
||||||
|
@ -85,11 +87,13 @@ impl FileInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_section(path: &Path) -> FileInfo {
|
pub fn new_section(path: &Path, base_path: &PathBuf) -> FileInfo {
|
||||||
let file_path = path.to_path_buf();
|
let file_path = path.to_path_buf();
|
||||||
let parent = path.parent().unwrap().to_path_buf();
|
let parent = path.parent().expect("Get parent of section").to_path_buf();
|
||||||
let name = path.file_stem().unwrap().to_string_lossy().to_string();
|
let name = path.file_stem().unwrap().to_string_lossy().to_string();
|
||||||
let components = find_content_components(path);
|
let components = find_content_components(
|
||||||
|
&file_path.strip_prefix(base_path).expect("Strip base path prefix for section"),
|
||||||
|
);
|
||||||
let relative = if !components.is_empty() {
|
let relative = if !components.is_empty() {
|
||||||
format!("{}/{}.md", components.join("/"), name)
|
format!("{}/{}.md", components.join("/"), name)
|
||||||
} else {
|
} else {
|
||||||
|
@ -158,7 +162,7 @@ impl Default for FileInfo {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use config::{Config, Language};
|
use config::{Config, Language};
|
||||||
|
|
||||||
|
@ -170,11 +174,22 @@ mod tests {
|
||||||
find_content_components("/home/vincent/code/site/content/posts/tutorials/python.md");
|
find_content_components("/home/vincent/code/site/content/posts/tutorials/python.md");
|
||||||
assert_eq!(res, ["posts".to_string(), "tutorials".to_string()]);
|
assert_eq!(res, ["posts".to_string(), "tutorials".to_string()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn can_find_components_in_page_with_assets() {
|
fn can_find_components_in_page_with_assets() {
|
||||||
let file = FileInfo::new_page(&Path::new(
|
let file = FileInfo::new_page(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/python/index.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/python/index.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
|
assert_eq!(file.components, ["posts".to_string(), "tutorials".to_string()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn doesnt_fail_with_multiple_content_directories() {
|
||||||
|
let file = FileInfo::new_page(
|
||||||
|
&Path::new("/home/vincent/code/content/site/content/posts/tutorials/python/index.md"),
|
||||||
|
&PathBuf::from("/home/vincent/code/content/site"),
|
||||||
|
);
|
||||||
assert_eq!(file.components, ["posts".to_string(), "tutorials".to_string()]);
|
assert_eq!(file.components, ["posts".to_string(), "tutorials".to_string()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,9 +197,10 @@ mod tests {
|
||||||
fn can_find_valid_language_in_page() {
|
fn can_find_valid_language_in_page() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.languages.push(Language { code: String::from("fr"), rss: false });
|
config.languages.push(Language { code: String::from("fr"), rss: false });
|
||||||
let mut file = FileInfo::new_page(&Path::new(
|
let mut file = FileInfo::new_page(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/python.fr.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/python.fr.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
let res = file.find_language(&config);
|
let res = file.find_language(&config);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
assert_eq!(res.unwrap(), "fr");
|
assert_eq!(res.unwrap(), "fr");
|
||||||
|
@ -194,9 +210,10 @@ mod tests {
|
||||||
fn can_find_valid_language_in_page_with_assets() {
|
fn can_find_valid_language_in_page_with_assets() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.languages.push(Language { code: String::from("fr"), rss: false });
|
config.languages.push(Language { code: String::from("fr"), rss: false });
|
||||||
let mut file = FileInfo::new_page(&Path::new(
|
let mut file = FileInfo::new_page(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/python/index.fr.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/python/index.fr.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert_eq!(file.components, ["posts".to_string(), "tutorials".to_string()]);
|
assert_eq!(file.components, ["posts".to_string(), "tutorials".to_string()]);
|
||||||
let res = file.find_language(&config);
|
let res = file.find_language(&config);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
|
@ -206,9 +223,10 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn do_nothing_on_unknown_language_in_page_with_i18n_off() {
|
fn do_nothing_on_unknown_language_in_page_with_i18n_off() {
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let mut file = FileInfo::new_page(&Path::new(
|
let mut file = FileInfo::new_page(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/python.fr.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/python.fr.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
let res = file.find_language(&config);
|
let res = file.find_language(&config);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
assert_eq!(res.unwrap(), config.default_language);
|
assert_eq!(res.unwrap(), config.default_language);
|
||||||
|
@ -218,9 +236,10 @@ mod tests {
|
||||||
fn errors_on_unknown_language_in_page_with_i18n_on() {
|
fn errors_on_unknown_language_in_page_with_i18n_on() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.languages.push(Language { code: String::from("it"), rss: false });
|
config.languages.push(Language { code: String::from("it"), rss: false });
|
||||||
let mut file = FileInfo::new_page(&Path::new(
|
let mut file = FileInfo::new_page(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/python.fr.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/python.fr.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
let res = file.find_language(&config);
|
let res = file.find_language(&config);
|
||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
}
|
}
|
||||||
|
@ -229,9 +248,10 @@ mod tests {
|
||||||
fn can_find_valid_language_in_section() {
|
fn can_find_valid_language_in_section() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.languages.push(Language { code: String::from("fr"), rss: false });
|
config.languages.push(Language { code: String::from("fr"), rss: false });
|
||||||
let mut file = FileInfo::new_section(&Path::new(
|
let mut file = FileInfo::new_section(
|
||||||
"/home/vincent/code/site/content/posts/tutorials/_index.fr.md",
|
&Path::new("/home/vincent/code/site/content/posts/tutorials/_index.fr.md"),
|
||||||
));
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
let res = file.find_language(&config);
|
let res = file.find_language(&config);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
assert_eq!(res.unwrap(), "fr");
|
assert_eq!(res.unwrap(), "fr");
|
||||||
|
|
|
@ -79,11 +79,11 @@ pub struct Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Page {
|
impl Page {
|
||||||
pub fn new<P: AsRef<Path>>(file_path: P, meta: PageFrontMatter) -> Page {
|
pub fn new<P: AsRef<Path>>(file_path: P, meta: PageFrontMatter, base_path: &PathBuf) -> Page {
|
||||||
let file_path = file_path.as_ref();
|
let file_path = file_path.as_ref();
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
file: FileInfo::new_page(file_path),
|
file: FileInfo::new_page(file_path, base_path),
|
||||||
meta,
|
meta,
|
||||||
ancestors: vec![],
|
ancestors: vec![],
|
||||||
raw_content: "".to_string(),
|
raw_content: "".to_string(),
|
||||||
|
@ -114,9 +114,14 @@ impl Page {
|
||||||
/// Parse a page given the content of the .md file
|
/// Parse a page given the content of the .md file
|
||||||
/// Files without front matter or with invalid front matter are considered
|
/// Files without front matter or with invalid front matter are considered
|
||||||
/// erroneous
|
/// erroneous
|
||||||
pub fn parse(file_path: &Path, content: &str, config: &Config) -> Result<Page> {
|
pub fn parse(
|
||||||
|
file_path: &Path,
|
||||||
|
content: &str,
|
||||||
|
config: &Config,
|
||||||
|
base_path: &PathBuf,
|
||||||
|
) -> Result<Page> {
|
||||||
let (meta, content) = split_page_content(file_path, content)?;
|
let (meta, content) = split_page_content(file_path, content)?;
|
||||||
let mut page = Page::new(file_path, meta);
|
let mut page = Page::new(file_path, meta, base_path);
|
||||||
|
|
||||||
page.lang = page.file.find_language(config)?;
|
page.lang = page.file.find_language(config)?;
|
||||||
|
|
||||||
|
@ -196,10 +201,14 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read and parse a .md file into a Page struct
|
/// Read and parse a .md file into a Page struct
|
||||||
pub fn from_file<P: AsRef<Path>>(path: P, config: &Config) -> Result<Page> {
|
pub fn from_file<P: AsRef<Path>>(
|
||||||
|
path: P,
|
||||||
|
config: &Config,
|
||||||
|
base_path: &PathBuf,
|
||||||
|
) -> Result<Page> {
|
||||||
let path = path.as_ref();
|
let path = path.as_ref();
|
||||||
let content = read_file(path)?;
|
let content = read_file(path)?;
|
||||||
let mut page = Page::parse(path, &content, config)?;
|
let mut page = Page::parse(path, &content, config, base_path)?;
|
||||||
|
|
||||||
if page.file.name == "index" {
|
if page.file.name == "index" {
|
||||||
let parent_dir = path.parent().unwrap();
|
let parent_dir = path.parent().unwrap();
|
||||||
|
@ -329,7 +338,7 @@ mod tests {
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::{create_dir, File};
|
use std::fs::{create_dir, File};
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use globset::{Glob, GlobSetBuilder};
|
use globset::{Glob, GlobSetBuilder};
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
|
@ -348,7 +357,7 @@ description = "hey there"
|
||||||
slug = "hello-world"
|
slug = "hello-world"
|
||||||
+++
|
+++
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let res = Page::parse(Path::new("post.md"), content, &Config::default());
|
let res = Page::parse(Path::new("post.md"), content, &Config::default(), &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let mut page = res.unwrap();
|
let mut page = res.unwrap();
|
||||||
page.render_markdown(
|
page.render_markdown(
|
||||||
|
@ -374,7 +383,8 @@ Hello world"#;
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let mut conf = Config::default();
|
let mut conf = Config::default();
|
||||||
conf.base_url = "http://hello.com/".to_string();
|
conf.base_url = "http://hello.com/".to_string();
|
||||||
let res = Page::parse(Path::new("content/posts/intro/start.md"), content, &conf);
|
let res =
|
||||||
|
Page::parse(Path::new("content/posts/intro/start.md"), content, &conf, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.path, "posts/intro/hello-world/");
|
assert_eq!(page.path, "posts/intro/hello-world/");
|
||||||
|
@ -390,7 +400,7 @@ Hello world"#;
|
||||||
+++
|
+++
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let res = Page::parse(Path::new("start.md"), content, &config);
|
let res = Page::parse(Path::new("start.md"), content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.path, "hello-world/");
|
assert_eq!(page.path, "hello-world/");
|
||||||
|
@ -406,7 +416,12 @@ Hello world"#;
|
||||||
+++
|
+++
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let res = Page::parse(Path::new("content/posts/intro/start.md"), content, &config);
|
let res = Page::parse(
|
||||||
|
Path::new("content/posts/intro/start.md"),
|
||||||
|
content,
|
||||||
|
&config,
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.path, "hello-world/");
|
assert_eq!(page.path, "hello-world/");
|
||||||
|
@ -422,7 +437,12 @@ Hello world"#;
|
||||||
+++
|
+++
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let res = Page::parse(Path::new("content/posts/intro/start.md"), content, &config);
|
let res = Page::parse(
|
||||||
|
Path::new("content/posts/intro/start.md"),
|
||||||
|
content,
|
||||||
|
&config,
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.path, "hello-world/");
|
assert_eq!(page.path, "hello-world/");
|
||||||
|
@ -438,14 +458,15 @@ Hello world"#;
|
||||||
slug = "hello-world"
|
slug = "hello-world"
|
||||||
+++
|
+++
|
||||||
Hello world"#;
|
Hello world"#;
|
||||||
let res = Page::parse(Path::new("start.md"), content, &Config::default());
|
let res = Page::parse(Path::new("start.md"), content, &Config::default(), &PathBuf::new());
|
||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn can_make_slug_from_non_slug_filename() {
|
fn can_make_slug_from_non_slug_filename() {
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let res = Page::parse(Path::new(" file with space.md"), "+++\n+++", &config);
|
let res =
|
||||||
|
Page::parse(Path::new(" file with space.md"), "+++\n+++", &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.slug, "file-with-space");
|
assert_eq!(page.slug, "file-with-space");
|
||||||
|
@ -461,7 +482,7 @@ Hello world"#;
|
||||||
Hello world
|
Hello world
|
||||||
<!-- more -->"#
|
<!-- more -->"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("hello.md"), &content, &config);
|
let res = Page::parse(Path::new("hello.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let mut page = res.unwrap();
|
let mut page = res.unwrap();
|
||||||
page.render_markdown(&HashMap::default(), &Tera::default(), &config, InsertAnchor::None)
|
page.render_markdown(&HashMap::default(), &Tera::default(), &config, InsertAnchor::None)
|
||||||
|
@ -483,7 +504,11 @@ Hello world
|
||||||
File::create(nested_path.join("graph.jpg")).unwrap();
|
File::create(nested_path.join("graph.jpg")).unwrap();
|
||||||
File::create(nested_path.join("fail.png")).unwrap();
|
File::create(nested_path.join("fail.png")).unwrap();
|
||||||
|
|
||||||
let res = Page::from_file(nested_path.join("index.md").as_path(), &Config::default());
|
let res = Page::from_file(
|
||||||
|
nested_path.join("index.md").as_path(),
|
||||||
|
&Config::default(),
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
||||||
|
@ -506,7 +531,11 @@ Hello world
|
||||||
File::create(nested_path.join("graph.jpg")).unwrap();
|
File::create(nested_path.join("graph.jpg")).unwrap();
|
||||||
File::create(nested_path.join("fail.png")).unwrap();
|
File::create(nested_path.join("fail.png")).unwrap();
|
||||||
|
|
||||||
let res = Page::from_file(nested_path.join("index.md").as_path(), &Config::default());
|
let res = Page::from_file(
|
||||||
|
nested_path.join("index.md").as_path(),
|
||||||
|
&Config::default(),
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
||||||
|
@ -530,7 +559,11 @@ Hello world
|
||||||
File::create(nested_path.join("graph.jpg")).unwrap();
|
File::create(nested_path.join("graph.jpg")).unwrap();
|
||||||
File::create(nested_path.join("fail.png")).unwrap();
|
File::create(nested_path.join("fail.png")).unwrap();
|
||||||
|
|
||||||
let res = Page::from_file(nested_path.join("index.md").as_path(), &Config::default());
|
let res = Page::from_file(
|
||||||
|
nested_path.join("index.md").as_path(),
|
||||||
|
&Config::default(),
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
assert_eq!(page.file.parent, path.join("content").join("posts"));
|
||||||
|
@ -559,7 +592,7 @@ Hello world
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.ignored_content_globset = Some(gsb.build().unwrap());
|
config.ignored_content_globset = Some(gsb.build().unwrap());
|
||||||
|
|
||||||
let res = Page::from_file(nested_path.join("index.md").as_path(), &config);
|
let res = Page::from_file(nested_path.join("index.md").as_path(), &config, &PathBuf::new());
|
||||||
|
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
|
@ -576,7 +609,7 @@ Hello world
|
||||||
Hello world
|
Hello world
|
||||||
<!-- more -->"#
|
<!-- more -->"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("2018-10-08_hello.md"), &content, &config);
|
let res = Page::parse(Path::new("2018-10-08_hello.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
|
|
||||||
|
@ -593,7 +626,12 @@ Hello world
|
||||||
Hello world
|
Hello world
|
||||||
<!-- more -->"#
|
<!-- more -->"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("2018-10-02T15:00:00Z-hello.md"), &content, &config);
|
let res = Page::parse(
|
||||||
|
Path::new("2018-10-02T15:00:00Z-hello.md"),
|
||||||
|
&content,
|
||||||
|
&config,
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
|
|
||||||
|
@ -611,7 +649,7 @@ date = 2018-09-09
|
||||||
Hello world
|
Hello world
|
||||||
<!-- more -->"#
|
<!-- more -->"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("2018-10-08_hello.md"), &content, &config);
|
let res = Page::parse(Path::new("2018-10-08_hello.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
|
|
||||||
|
@ -628,7 +666,7 @@ Hello world
|
||||||
+++
|
+++
|
||||||
Bonjour le monde"#
|
Bonjour le monde"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("hello.fr.md"), &content, &config);
|
let res = Page::parse(Path::new("hello.fr.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.lang, "fr".to_string());
|
assert_eq!(page.lang, "fr".to_string());
|
||||||
|
@ -645,7 +683,8 @@ Bonjour le monde"#
|
||||||
+++
|
+++
|
||||||
Bonjour le monde"#
|
Bonjour le monde"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("2018-10-08_hello.fr.md"), &content, &config);
|
let res =
|
||||||
|
Page::parse(Path::new("2018-10-08_hello.fr.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.meta.date, Some("2018-10-08".to_string()));
|
assert_eq!(page.meta.date, Some("2018-10-08".to_string()));
|
||||||
|
@ -664,7 +703,7 @@ path = "bonjour"
|
||||||
+++
|
+++
|
||||||
Bonjour le monde"#
|
Bonjour le monde"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Page::parse(Path::new("hello.fr.md"), &content, &config);
|
let res = Page::parse(Path::new("hello.fr.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
assert_eq!(page.lang, "fr".to_string());
|
assert_eq!(page.lang, "fr".to_string());
|
||||||
|
|
|
@ -59,11 +59,15 @@ pub struct Section {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Section {
|
impl Section {
|
||||||
pub fn new<P: AsRef<Path>>(file_path: P, meta: SectionFrontMatter) -> Section {
|
pub fn new<P: AsRef<Path>>(
|
||||||
|
file_path: P,
|
||||||
|
meta: SectionFrontMatter,
|
||||||
|
base_path: &PathBuf,
|
||||||
|
) -> Section {
|
||||||
let file_path = file_path.as_ref();
|
let file_path = file_path.as_ref();
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
file: FileInfo::new_section(file_path),
|
file: FileInfo::new_section(file_path, base_path),
|
||||||
meta,
|
meta,
|
||||||
ancestors: vec![],
|
ancestors: vec![],
|
||||||
path: "".to_string(),
|
path: "".to_string(),
|
||||||
|
@ -84,9 +88,14 @@ impl Section {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(file_path: &Path, content: &str, config: &Config) -> Result<Section> {
|
pub fn parse(
|
||||||
|
file_path: &Path,
|
||||||
|
content: &str,
|
||||||
|
config: &Config,
|
||||||
|
base_path: &PathBuf,
|
||||||
|
) -> Result<Section> {
|
||||||
let (meta, content) = split_section_content(file_path, content)?;
|
let (meta, content) = split_section_content(file_path, content)?;
|
||||||
let mut section = Section::new(file_path, meta);
|
let mut section = Section::new(file_path, meta, base_path);
|
||||||
section.lang = section.file.find_language(config)?;
|
section.lang = section.file.find_language(config)?;
|
||||||
section.raw_content = content;
|
section.raw_content = content;
|
||||||
let (word_count, reading_time) = get_reading_analytics(§ion.raw_content);
|
let (word_count, reading_time) = get_reading_analytics(§ion.raw_content);
|
||||||
|
@ -109,10 +118,14 @@ impl Section {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read and parse a .md file into a Page struct
|
/// Read and parse a .md file into a Page struct
|
||||||
pub fn from_file<P: AsRef<Path>>(path: P, config: &Config) -> Result<Section> {
|
pub fn from_file<P: AsRef<Path>>(
|
||||||
|
path: P,
|
||||||
|
config: &Config,
|
||||||
|
base_path: &PathBuf,
|
||||||
|
) -> Result<Section> {
|
||||||
let path = path.as_ref();
|
let path = path.as_ref();
|
||||||
let content = read_file(path)?;
|
let content = read_file(path)?;
|
||||||
let mut section = Section::parse(path, &content, config)?;
|
let mut section = Section::parse(path, &content, config, base_path)?;
|
||||||
|
|
||||||
let parent_dir = path.parent().unwrap();
|
let parent_dir = path.parent().unwrap();
|
||||||
let assets = find_related_assets(parent_dir);
|
let assets = find_related_assets(parent_dir);
|
||||||
|
@ -250,7 +263,7 @@ impl Default for Section {
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::fs::{create_dir, File};
|
use std::fs::{create_dir, File};
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use globset::{Glob, GlobSetBuilder};
|
use globset::{Glob, GlobSetBuilder};
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
|
@ -272,7 +285,11 @@ mod tests {
|
||||||
File::create(nested_path.join("graph.jpg")).unwrap();
|
File::create(nested_path.join("graph.jpg")).unwrap();
|
||||||
File::create(nested_path.join("fail.png")).unwrap();
|
File::create(nested_path.join("fail.png")).unwrap();
|
||||||
|
|
||||||
let res = Section::from_file(nested_path.join("_index.md").as_path(), &Config::default());
|
let res = Section::from_file(
|
||||||
|
nested_path.join("_index.md").as_path(),
|
||||||
|
&Config::default(),
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let section = res.unwrap();
|
let section = res.unwrap();
|
||||||
assert_eq!(section.assets.len(), 3);
|
assert_eq!(section.assets.len(), 3);
|
||||||
|
@ -298,7 +315,8 @@ mod tests {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.ignored_content_globset = Some(gsb.build().unwrap());
|
config.ignored_content_globset = Some(gsb.build().unwrap());
|
||||||
|
|
||||||
let res = Section::from_file(nested_path.join("_index.md").as_path(), &config);
|
let res =
|
||||||
|
Section::from_file(nested_path.join("_index.md").as_path(), &config, &PathBuf::new());
|
||||||
|
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let page = res.unwrap();
|
let page = res.unwrap();
|
||||||
|
@ -315,7 +333,12 @@ mod tests {
|
||||||
+++
|
+++
|
||||||
Bonjour le monde"#
|
Bonjour le monde"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Section::parse(Path::new("content/hello/nested/_index.fr.md"), &content, &config);
|
let res = Section::parse(
|
||||||
|
Path::new("content/hello/nested/_index.fr.md"),
|
||||||
|
&content,
|
||||||
|
&config,
|
||||||
|
&PathBuf::new(),
|
||||||
|
);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let section = res.unwrap();
|
let section = res.unwrap();
|
||||||
assert_eq!(section.lang, "fr".to_string());
|
assert_eq!(section.lang, "fr".to_string());
|
||||||
|
@ -332,7 +355,8 @@ Bonjour le monde"#
|
||||||
+++
|
+++
|
||||||
Bonjour le monde"#
|
Bonjour le monde"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let res = Section::parse(Path::new("content/_index.fr.md"), &content, &config);
|
let res =
|
||||||
|
Section::parse(Path::new("content/_index.fr.md"), &content, &config, &PathBuf::new());
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let section = res.unwrap();
|
let section = res.unwrap();
|
||||||
assert_eq!(section.lang, "fr".to_string());
|
assert_eq!(section.lang, "fr".to_string());
|
||||||
|
|
|
@ -228,6 +228,7 @@ impl<'a> Paginator<'a> {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use std::path::PathBuf;
|
||||||
use tera::to_value;
|
use tera::to_value;
|
||||||
|
|
||||||
use config::Taxonomy as TaxonomyConfig;
|
use config::Taxonomy as TaxonomyConfig;
|
||||||
|
@ -242,7 +243,7 @@ mod tests {
|
||||||
let mut f = SectionFrontMatter::default();
|
let mut f = SectionFrontMatter::default();
|
||||||
f.paginate_by = Some(2);
|
f.paginate_by = Some(2);
|
||||||
f.paginate_path = "page".to_string();
|
f.paginate_path = "page".to_string();
|
||||||
let mut s = Section::new("content/_index.md", f);
|
let mut s = Section::new("content/_index.md", f, &PathBuf::new());
|
||||||
if !is_index {
|
if !is_index {
|
||||||
s.path = "posts/".to_string();
|
s.path = "posts/".to_string();
|
||||||
s.permalink = "https://vincent.is/posts/".to_string();
|
s.permalink = "https://vincent.is/posts/".to_string();
|
||||||
|
|
|
@ -113,6 +113,7 @@ pub fn find_siblings(sorted: Vec<(&Key, bool)>) -> Vec<(Key, Option<Key>, Option
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use slotmap::DenseSlotMap;
|
use slotmap::DenseSlotMap;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use super::{find_siblings, sort_pages_by_date, sort_pages_by_weight};
|
use super::{find_siblings, sort_pages_by_date, sort_pages_by_weight};
|
||||||
use content::Page;
|
use content::Page;
|
||||||
|
@ -122,13 +123,13 @@ mod tests {
|
||||||
let mut front_matter = PageFrontMatter::default();
|
let mut front_matter = PageFrontMatter::default();
|
||||||
front_matter.date = Some(date.to_string());
|
front_matter.date = Some(date.to_string());
|
||||||
front_matter.date_to_datetime();
|
front_matter.date_to_datetime();
|
||||||
Page::new("content/hello.md", front_matter)
|
Page::new("content/hello.md", front_matter, &PathBuf::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_page_with_weight(weight: usize) -> Page {
|
fn create_page_with_weight(weight: usize) -> Page {
|
||||||
let mut front_matter = PageFrontMatter::default();
|
let mut front_matter = PageFrontMatter::default();
|
||||||
front_matter.weight = Some(weight);
|
front_matter.weight = Some(weight);
|
||||||
Page::new("content/hello.md", front_matter)
|
Page::new("content/hello.md", front_matter, &PathBuf::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -131,7 +131,7 @@ fn delete_element(site: &mut Site, path: &Path, is_section: bool) -> Result<()>
|
||||||
|
|
||||||
/// Handles a `_index.md` (a section) being edited in some ways
|
/// Handles a `_index.md` (a section) being edited in some ways
|
||||||
fn handle_section_editing(site: &mut Site, path: &Path) -> Result<()> {
|
fn handle_section_editing(site: &mut Site, path: &Path) -> Result<()> {
|
||||||
let section = Section::from_file(path, &site.config)?;
|
let section = Section::from_file(path, &site.config, &site.base_path)?;
|
||||||
let pathbuf = path.to_path_buf();
|
let pathbuf = path.to_path_buf();
|
||||||
match site.add_section(section, true)? {
|
match site.add_section(section, true)? {
|
||||||
// Updating a section
|
// Updating a section
|
||||||
|
@ -193,7 +193,7 @@ macro_rules! render_parent_sections {
|
||||||
|
|
||||||
/// Handles a page being edited in some ways
|
/// Handles a page being edited in some ways
|
||||||
fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> {
|
fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> {
|
||||||
let page = Page::from_file(path, &site.config)?;
|
let page = Page::from_file(path, &site.config, &site.base_path)?;
|
||||||
let pathbuf = path.to_path_buf();
|
let pathbuf = path.to_path_buf();
|
||||||
match site.add_page(page, true)? {
|
match site.add_page(page, true)? {
|
||||||
// Updating a page
|
// Updating a page
|
||||||
|
|
|
@ -210,7 +210,7 @@ impl Site {
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.map(|entry| {
|
.map(|entry| {
|
||||||
let path = entry.as_path();
|
let path = entry.as_path();
|
||||||
Section::from_file(path, config)
|
Section::from_file(path, config, &self.base_path)
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
};
|
};
|
||||||
|
@ -222,7 +222,7 @@ impl Site {
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.map(|entry| {
|
.map(|entry| {
|
||||||
let path = entry.as_path();
|
let path = entry.as_path();
|
||||||
Page::from_file(path, config)
|
Page::from_file(path, config, &self.base_path)
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue