Fix relative links to README.md files
This commit is contained in:
parent
3a24f10d7c
commit
f4ce0ba627
|
@ -40,6 +40,8 @@ impl Preprocessor for IndexPreprocessor {
|
||||||
path.set_file_name("index.md");
|
path.set_file_name("index.md");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ch.content = convert_links_to_readme_files(&ch.content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -78,6 +80,22 @@ fn is_readme_file<P: AsRef<Path>>(path: P) -> bool {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn convert_links_to_readme_files(s: &str) -> String {
|
||||||
|
static README_LINK: Lazy<Regex> = Lazy::new(|| {
|
||||||
|
Regex::new(r"(?i)(?P<before>\[.+\]\([^:]*)readme(?P<after>\.md(?:.{0}|#.*)\))").unwrap()
|
||||||
|
});
|
||||||
|
|
||||||
|
README_LINK
|
||||||
|
.replace_all(s, |caps: ®ex::Captures<'_>| {
|
||||||
|
format!(
|
||||||
|
"{before}index{after}",
|
||||||
|
before = &caps["before"],
|
||||||
|
after = &caps["after"],
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -102,4 +120,58 @@ mod tests {
|
||||||
let path = "path/to/README-README.md";
|
let path = "path/to/README-README.md";
|
||||||
assert!(!is_readme_file(path));
|
assert!(!is_readme_file(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_convert_links_to_readme_files() {
|
||||||
|
let content = "Prologue\n\nSome text [link](./README.md)\n\nEpilogue";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"Prologue\n\nSome text [link](./index.md)\n\nEpilogue"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](./README.md)\n\nEpilogue";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"[link](./index.md)\n\nEpilogue"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "Prologue\n\nSome text [link](./README.md)";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"Prologue\n\nSome text [link](./index.md)"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](./readme.md)";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"[link](./index.md)"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](./README.mdx)";
|
||||||
|
assert_eq!(convert_links_to_readme_files(&content), content);
|
||||||
|
|
||||||
|
let content = "[link](../chapter_1/README.md)";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"[link](../chapter_1/index.md)"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](./readme.md/chapter_1.1.md)";
|
||||||
|
assert_eq!(convert_links_to_readme_files(&content), content);
|
||||||
|
|
||||||
|
let content = "[link](./README.md#heading-1)";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"[link](./index.md#heading-1)"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](./README.md#)";
|
||||||
|
assert_eq!(
|
||||||
|
convert_links_to_readme_files(&content),
|
||||||
|
"[link](./index.md#)"
|
||||||
|
);
|
||||||
|
|
||||||
|
let content = "[link](https://some.domain/README.md)";
|
||||||
|
assert_eq!(convert_links_to_readme_files(&content), content);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue