Start using markdown parser instead
Still need to get the ranges right though
This commit is contained in:
parent
c95b773596
commit
c592e66d8e
|
@ -1,4 +1,7 @@
|
||||||
|
use core::ops::Range;
|
||||||
|
use pulldown_cmark::{Event, LinkType, Parser, Tag};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
use std::iter::{FromIterator, Iterator};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use crate::errors::*;
|
use crate::errors::*;
|
||||||
|
@ -49,41 +52,37 @@ impl Preprocessor for IndexPreprocessor {
|
||||||
|
|
||||||
fn replace_readme_in_string(content: &str) -> String {
|
fn replace_readme_in_string(content: &str) -> String {
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref RE_INLINE: Regex = Regex::new(
|
static ref RE: Regex = Regex::new(
|
||||||
r"(?ix) #ignorecase, allow regex definition eXtended on multiple lines
|
r"(?ix) #ignorecase, allow regex definition eXtended on multiple lines
|
||||||
\[([^\[]+)\] #[name_of_link]
|
(/readme.md) #part that will be replaced by index.md
|
||||||
\s? #optional whitespaces
|
"
|
||||||
\( #open parenthesis
|
|
||||||
([^\[\s]*) #start of path : url/blabla/
|
|
||||||
(readme.md) #part that will be replaced by index.md
|
|
||||||
(?: #BEGIN optional part, '?:' ignores capture of this whole (group)
|
|
||||||
\s+ #whitespace between path and optional title
|
|
||||||
([^\[]*) #optional title
|
|
||||||
) #END optional part
|
|
||||||
\s* #trailing whitespaces
|
|
||||||
\) #close parenthesis"
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
static ref RE_REFERENCE: Regex = Regex::new(
|
|
||||||
r"(?ix) #ignorecase, allow regex definition eXtended on multiple lines
|
|
||||||
^ #start of line
|
|
||||||
(\s*) #optional padding whitespaces
|
|
||||||
\[([^\[]+)\]: #[name_of_link]:
|
|
||||||
\s* #optional whitespaces
|
|
||||||
([^\[\s]*) #start of path
|
|
||||||
(readme.md) #part that will be replaced by index.md
|
|
||||||
(?: #BEGIN optional part, '?:' ignores capture of this whole (group)
|
|
||||||
\s+ #whitespace between path and optional title
|
|
||||||
([^\[]*) #optional title
|
|
||||||
) #END optional part
|
|
||||||
\s* #trailing whitespaces
|
|
||||||
$ #end of line"
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
let content = RE_INLINE.replace_all(&content, "[$1](${2}index.md $4)");
|
let parser = pulldown_cmark::Parser::new(content).into_offset_iter();
|
||||||
let content = RE_REFERENCE.replace_all(&content, "${1}[$2]: ${3}index.md $5");
|
let ranges_to_replace_in: Vec<Range<usize>> = parser
|
||||||
content.to_string()
|
.filter_map(|(event, range)| match event {
|
||||||
|
Event::Start(Tag::Link(link_type, _, _)) => match link_type {
|
||||||
|
LinkType::Reference | LinkType::Inline => Some(range),
|
||||||
|
_ => None,
|
||||||
|
},
|
||||||
|
Event::End(Tag::Link(link_type, _, _)) => match link_type {
|
||||||
|
LinkType::Reference | LinkType::Inline => Some(range),
|
||||||
|
_ => None,
|
||||||
|
},
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let ranges_to_replace_in = vec![..];
|
||||||
|
let content: String = ranges_to_replace_in
|
||||||
|
.iter()
|
||||||
|
.map(|range| {
|
||||||
|
// let substring: &str = "[fdfsd]: sdfsdfsdf/dfsdf/readme.md";
|
||||||
|
let substring: &str = &content[range.clone()];
|
||||||
|
RE.replace_all(substring, "/index.md").into_owned()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
content
|
||||||
}
|
}
|
||||||
|
|
||||||
fn warn_readme_name_conflict<P: AsRef<Path>>(readme_path: P, index_path: P) {
|
fn warn_readme_name_conflict<P: AsRef<Path>>(readme_path: P, index_path: P) {
|
||||||
|
@ -148,55 +147,67 @@ mod tests {
|
||||||
let expected = "content: ( index.md)";
|
let expected = "content: ( index.md)";
|
||||||
|
|
||||||
let content = "content: ( Readme.md )";
|
let content = "content: ( Readme.md )";
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
assert_ne!(expected, replace_readme_in_string(content));
|
||||||
|
|
||||||
let content = "content: ( README.md )";
|
let content = "content: ( README.md )";
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
assert_ne!(expected, replace_readme_in_string(content));
|
||||||
|
|
||||||
let content = "content: ( rEaDmE.md )";
|
let content = "content: ( rEaDmE.md )";
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
assert_ne!(expected, replace_readme_in_string(content));
|
||||||
|
|
||||||
let content = "content: ( README-README.md )";
|
let content = "content: ( README-README.md )";
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
assert_ne!(expected, replace_readme_in_string(content));
|
||||||
}
|
}
|
||||||
#[test]
|
|
||||||
fn replace_readme_in_inline_link_test() {
|
|
||||||
let expected = "[content](./bla/index.md )";
|
|
||||||
let expected_with_title = "[content](./bla/index.md \"title\" )";
|
|
||||||
|
|
||||||
let content = "[content](./bla/Readme.md )";
|
//inspired by https://stackoverflow.com/questions/34662713/how-can-i-create-parameterized-tests-in-rust
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
macro_rules! replace_readme_tests {
|
||||||
|
($expected:expr,$($name:ident: $value:expr,)*) => {
|
||||||
let content = "[content](./bla/README.md )";
|
$(
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
#[test]
|
||||||
|
fn $name() {
|
||||||
let content = "[content](./bla/rEaDmE.md )";
|
let expected = $expected;
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
let content= $value;
|
||||||
|
assert_eq!(expected, replace_readme_in_string(content));
|
||||||
let content = "[content](./bla/rEaDmE.md \"title\" )";
|
}
|
||||||
assert_eq!(replace_readme_in_string(content), expected_with_title);
|
)*
|
||||||
|
}
|
||||||
let content = "[content](./bla/README-README.md )";
|
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
|
||||||
}
|
}
|
||||||
#[test]
|
|
||||||
fn replace_readme_in_footnote_link_test() {
|
|
||||||
let expected = "[content]: ./bla/index.md ";
|
|
||||||
let expected_with_title = "[content]: ./bla/index.md \"title\" ";
|
|
||||||
|
|
||||||
let content = "[content]: ./bla/Readme.md ";
|
replace_readme_tests! {
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
"[content](./bla/index.md) content: ( ./readme.md)",
|
||||||
|
replace_readme_only_in_link_cases_1:"[content](./bla/readme.md) content: ( ./readme.md)",
|
||||||
|
replace_readme_only_in_link_cases_2:"[content](./bla/readme.md) content: ( ./reADme.md)",
|
||||||
|
replace_readme_only_in_link_cases_3:"[content](./bla/readme.md) content: ( ./readMe.md)",
|
||||||
|
replace_readme_only_in_link_cases_4:"[content](./bla/readme.md) content: ( ./readme.MD)",
|
||||||
|
replace_readme_only_in_link_cases_5:"[content](./bla/readme.md) content: ( ./readme.md)",
|
||||||
|
replace_readme_only_in_link_cases_6:"[content](./bla/readme.md) content: ( ./REAdme.md)",
|
||||||
|
replace_readme_only_in_link_cases_7:"[content](./bla/readme.md) content: ( ./README.MD)",
|
||||||
|
}
|
||||||
|
replace_readme_tests! {
|
||||||
|
"🤞🏼[content](./bla/index.md)🤞🏼 content: ( ./readme.md)",
|
||||||
|
replace_readme_only_in_link_cases_even_with_multibyte_chars:"🤞🏼[content](./bla/readme.md)🤞🏼 content: ( ./README.MD)",
|
||||||
|
}
|
||||||
|
|
||||||
let content = "[content]: ./bla/README.md ";
|
replace_readme_tests! {
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
"[content]: ./bla/index.md ",
|
||||||
|
replace_readme_in_footnote_link_test_1:"[content]: ./bla/readme.md ",
|
||||||
let content = "[content]: ./bla/rEaDmE.md ";
|
replace_readme_in_footnote_link_test_2:"[content]: ./bla/ReAdme.md ",
|
||||||
assert_eq!(replace_readme_in_string(content), expected);
|
replace_readme_in_footnote_link_test_3:"[content]: ./bla/ReaDme.md ",
|
||||||
|
replace_readme_in_footnote_link_test_4:"[content]: ./bla/README.MD ",
|
||||||
let content = "[content]: ./bla/rEaDmE.md \"title\" ";
|
replace_readme_in_footnote_link_test_5:"[content]: ./bla/REadmE.md ",
|
||||||
assert_eq!(replace_readme_in_string(content), expected_with_title);
|
replace_readme_in_footnote_link_test_6:"[content]: ./bla/ReAdme.md ",
|
||||||
|
replace_readme_in_footnote_link_test_7:"[content]: ./bla/Readme.MD ",
|
||||||
let content = "[content]: ./bla/README-README.md ";
|
replace_readme_in_footnote_link_test_8:"[content]: ./bla/readme.MD ",
|
||||||
assert_ne!(replace_readme_in_string(content), expected);
|
}
|
||||||
|
replace_readme_tests! {
|
||||||
|
"[content]( ./bla/index.md)",
|
||||||
|
replace_readme_in_inline_link_test_1:"[content]( ./bla/readme.md)",
|
||||||
|
replace_readme_in_inline_link_test_2:"[content]( ./bla/ReAdme.md)",
|
||||||
|
replace_readme_in_inline_link_test_3:"[content]( ./bla/ReaDme.md)",
|
||||||
|
replace_readme_in_inline_link_test_4:"[content]( ./bla/README.MD)",
|
||||||
|
replace_readme_in_inline_link_test_5:"[content]( ./bla/REadmE.md)",
|
||||||
|
replace_readme_in_inline_link_test_6:"[content]( ./bla/ReAdme.md)",
|
||||||
|
replace_readme_in_inline_link_test_7:"[content]( ./bla/Readme.MD)",
|
||||||
|
replace_readme_in_inline_link_test_8:"[content]( ./bla/readme.MD)",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue