Fix generation of edit links

The `IndexPreprocessor` rewrites the path for files
named `README.md` to be `index.md`. This breaks the edit link
in some circumstances.

To address this issues, the `Chapter` struct has now a new attribute
called `source_path`. This is initialized with the same value as
`path`, but is never ever changed.

Finally, the edit link is built by using the `source_path` rather
than the `path`.
This commit is contained in:
Flavio Castelli 2021-04-19 18:58:15 +02:00
parent bbf54d7459
commit 7aff98a859
No known key found for this signature in database
GPG Key ID: F1020D69DC004F48
3 changed files with 19 additions and 3 deletions

View File

@ -160,6 +160,8 @@ pub struct Chapter {
pub sub_items: Vec<BookItem>, pub sub_items: Vec<BookItem>,
/// The chapter's location, relative to the `SUMMARY.md` file. /// The chapter's location, relative to the `SUMMARY.md` file.
pub path: Option<PathBuf>, pub path: Option<PathBuf>,
/// The chapter's source file, relative to the `SUMMARY.md` file.
pub source_path: Option<PathBuf>,
/// An ordered list of the names of each chapter above this one in the hierarchy. /// An ordered list of the names of each chapter above this one in the hierarchy.
pub parent_names: Vec<String>, pub parent_names: Vec<String>,
} }
@ -169,13 +171,15 @@ impl Chapter {
pub fn new<P: Into<PathBuf>>( pub fn new<P: Into<PathBuf>>(
name: &str, name: &str,
content: String, content: String,
path: P, p: P,
parent_names: Vec<String>, parent_names: Vec<String>,
) -> Chapter { ) -> Chapter {
let path: PathBuf = p.into();
Chapter { Chapter {
name: name.to_string(), name: name.to_string(),
content, content,
path: Some(path.into()), path: Some(path.clone()),
source_path: Some(path),
parent_names, parent_names,
..Default::default() ..Default::default()
} }
@ -188,6 +192,7 @@ impl Chapter {
name: name.to_string(), name: name.to_string(),
content: String::new(), content: String::new(),
path: None, path: None,
source_path: None,
parent_names, parent_names,
..Default::default() ..Default::default()
} }
@ -438,6 +443,7 @@ And here is some \
content: String::from("Hello World!"), content: String::from("Hello World!"),
number: Some(SectionNumber(vec![1, 2])), number: Some(SectionNumber(vec![1, 2])),
path: Some(PathBuf::from("second.md")), path: Some(PathBuf::from("second.md")),
source_path: Some(PathBuf::from("second.md")),
parent_names: vec![String::from("Chapter 1")], parent_names: vec![String::from("Chapter 1")],
sub_items: Vec::new(), sub_items: Vec::new(),
}; };
@ -446,6 +452,7 @@ And here is some \
content: String::from(DUMMY_SRC), content: String::from(DUMMY_SRC),
number: None, number: None,
path: Some(PathBuf::from("chapter_1.md")), path: Some(PathBuf::from("chapter_1.md")),
source_path: Some(PathBuf::from("chapter_1.md")),
parent_names: Vec::new(), parent_names: Vec::new(),
sub_items: vec![ sub_items: vec![
BookItem::Chapter(nested.clone()), BookItem::Chapter(nested.clone()),
@ -470,6 +477,7 @@ And here is some \
name: String::from("Chapter 1"), name: String::from("Chapter 1"),
content: String::from(DUMMY_SRC), content: String::from(DUMMY_SRC),
path: Some(PathBuf::from("chapter_1.md")), path: Some(PathBuf::from("chapter_1.md")),
source_path: Some(PathBuf::from("chapter_1.md")),
..Default::default() ..Default::default()
})], })],
..Default::default() ..Default::default()
@ -510,6 +518,7 @@ And here is some \
content: String::from(DUMMY_SRC), content: String::from(DUMMY_SRC),
number: None, number: None,
path: Some(PathBuf::from("Chapter_1/index.md")), path: Some(PathBuf::from("Chapter_1/index.md")),
source_path: Some(PathBuf::from("Chapter_1/index.md")),
parent_names: Vec::new(), parent_names: Vec::new(),
sub_items: vec![ sub_items: vec![
BookItem::Chapter(Chapter::new( BookItem::Chapter(Chapter::new(
@ -562,6 +571,7 @@ And here is some \
content: String::from(DUMMY_SRC), content: String::from(DUMMY_SRC),
number: None, number: None,
path: Some(PathBuf::from("Chapter_1/index.md")), path: Some(PathBuf::from("Chapter_1/index.md")),
source_path: Some(PathBuf::from("Chapter_1/index.md")),
parent_names: Vec::new(), parent_names: Vec::new(),
sub_items: vec![ sub_items: vec![
BookItem::Chapter(Chapter::new( BookItem::Chapter(Chapter::new(

View File

@ -559,6 +559,7 @@ impl Default for HtmlConfig {
search: None, search: None,
git_repository_url: None, git_repository_url: None,
git_repository_icon: None, git_repository_icon: None,
git_repository_edit_url_template: None,
input_404: None, input_404: None,
site_url: None, site_url: None,
cname: None, cname: None,

View File

@ -40,7 +40,12 @@ impl HtmlHandlebars {
if let Some(ref git_repository_edit_url_template) = if let Some(ref git_repository_edit_url_template) =
ctx.html_config.git_repository_edit_url_template ctx.html_config.git_repository_edit_url_template
{ {
let full_path = "src/".to_owned() + path.to_str().unwrap(); let full_path = "src/".to_owned()
+ ch.source_path
.clone()
.unwrap_or_default()
.to_str()
.unwrap_or_default();
let edit_url = git_repository_edit_url_template.replace("{path}", &full_path); let edit_url = git_repository_edit_url_template.replace("{path}", &full_path);
ctx.data ctx.data
.insert("git_repository_edit_url".to_owned(), json!(edit_url)); .insert("git_repository_edit_url".to_owned(), json!(edit_url));