refactor markdown_to_html
this commit contains two refactors: - extract custom link transformations into a function. - separate some trivial markup generation.
This commit is contained in:
parent
2e126b3a08
commit
774514f4d4
|
@ -49,6 +49,56 @@ fn is_colocated_asset_link(link: &str) -> bool {
|
||||||
&& !link.starts_with("mailto:")
|
&& !link.starts_with("mailto:")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fix_link(link: &str, context: &RenderContext) -> Result<String> {
|
||||||
|
// A few situations here:
|
||||||
|
// - it could be a relative link (starting with `./`)
|
||||||
|
// - it could be a link to a co-located asset
|
||||||
|
// - it could be a normal link
|
||||||
|
// - any of those can be in a header or not: if it's in a header
|
||||||
|
// we need to append to a string
|
||||||
|
let result = if link.starts_with("./") {
|
||||||
|
match resolve_internal_link(&link, context.permalinks) {
|
||||||
|
Ok(url) => url,
|
||||||
|
Err(_) => {
|
||||||
|
return Err(format!("Relative link {} not found.", link).into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if is_colocated_asset_link(&link) {
|
||||||
|
format!("{}{}", context.current_page_permalink, link)
|
||||||
|
} else if context.config.check_external_links
|
||||||
|
&& !link.starts_with('#')
|
||||||
|
&& !link.starts_with("mailto:") {
|
||||||
|
let res = check_url(&link);
|
||||||
|
if res.is_valid() {
|
||||||
|
link.to_string()
|
||||||
|
} else {
|
||||||
|
return Err(
|
||||||
|
format!("Link {} is not valid: {}", link, res.message()).into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
link.to_string()
|
||||||
|
};
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// returns true if event have been processed
|
||||||
|
fn push_to_temp_header(event: &Event, temp_header: &mut TempHeader) -> bool {
|
||||||
|
match event {
|
||||||
|
Event::End(Tag::Link(_, _)) => {
|
||||||
|
temp_header.add_html("</a>");
|
||||||
|
}
|
||||||
|
Event::Start(Tag::Code) => {
|
||||||
|
temp_header.add_html("<code>");
|
||||||
|
}
|
||||||
|
Event::End(Tag::Code) => {
|
||||||
|
temp_header.add_html("</code>");
|
||||||
|
}
|
||||||
|
_ => return false,
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Rendered> {
|
pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Rendered> {
|
||||||
// the rendered html
|
// the rendered html
|
||||||
let mut html = String::with_capacity(content.len());
|
let mut html = String::with_capacity(content.len());
|
||||||
|
@ -76,6 +126,11 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
||||||
|
|
||||||
{
|
{
|
||||||
let parser = Parser::new_ext(content, opts).map(|event| {
|
let parser = Parser::new_ext(content, opts).map(|event| {
|
||||||
|
// Header first
|
||||||
|
if in_header && push_to_temp_header(&event, &mut temp_header) {
|
||||||
|
return Event::Html(Borrowed(""));
|
||||||
|
}
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
Event::Text(text) => {
|
Event::Text(text) => {
|
||||||
// Header first
|
// Header first
|
||||||
|
@ -142,37 +197,12 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
||||||
Event::Start(Tag::Image(src, title))
|
Event::Start(Tag::Image(src, title))
|
||||||
}
|
}
|
||||||
Event::Start(Tag::Link(link, title)) => {
|
Event::Start(Tag::Link(link, title)) => {
|
||||||
// A few situations here:
|
let fixed_link = match fix_link(&link, context) {
|
||||||
// - it could be a relative link (starting with `./`)
|
Ok(fixed_link) => fixed_link,
|
||||||
// - it could be a link to a co-located asset
|
Err(err) => {
|
||||||
// - it could be a normal link
|
error = Some(err);
|
||||||
// - any of those can be in a header or not: if it's in a header
|
return Event::Html(Borrowed(""))
|
||||||
// we need to append to a string
|
|
||||||
let fixed_link = if link.starts_with("./") {
|
|
||||||
match resolve_internal_link(&link, context.permalinks) {
|
|
||||||
Ok(url) => url,
|
|
||||||
Err(_) => {
|
|
||||||
error = Some(format!("Relative link {} not found.", link).into());
|
|
||||||
return Event::Html(Borrowed(""));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if is_colocated_asset_link(&link) {
|
|
||||||
format!("{}{}", context.current_page_permalink, link)
|
|
||||||
} else if context.config.check_external_links
|
|
||||||
&& !link.starts_with('#')
|
|
||||||
&& !link.starts_with("mailto:")
|
|
||||||
{
|
|
||||||
let res = check_url(&link);
|
|
||||||
if res.is_valid() {
|
|
||||||
link.to_string()
|
|
||||||
} else {
|
|
||||||
error = Some(
|
|
||||||
format!("Link {} is not valid: {}", link, res.message()).into(),
|
|
||||||
);
|
|
||||||
String::new()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
link.to_string()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if in_header {
|
if in_header {
|
||||||
|
@ -187,27 +217,6 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
||||||
|
|
||||||
Event::Start(Tag::Link(Owned(fixed_link), title))
|
Event::Start(Tag::Link(Owned(fixed_link), title))
|
||||||
}
|
}
|
||||||
Event::End(Tag::Link(_, _)) => {
|
|
||||||
if in_header {
|
|
||||||
temp_header.add_html("</a>");
|
|
||||||
return Event::Html(Borrowed(""));
|
|
||||||
}
|
|
||||||
event
|
|
||||||
}
|
|
||||||
Event::Start(Tag::Code) => {
|
|
||||||
if in_header {
|
|
||||||
temp_header.add_html("<code>");
|
|
||||||
return Event::Html(Borrowed(""));
|
|
||||||
}
|
|
||||||
event
|
|
||||||
}
|
|
||||||
Event::End(Tag::Code) => {
|
|
||||||
if in_header {
|
|
||||||
temp_header.add_html("</code>");
|
|
||||||
return Event::Html(Borrowed(""));
|
|
||||||
}
|
|
||||||
event
|
|
||||||
}
|
|
||||||
Event::Start(Tag::Header(num)) => {
|
Event::Start(Tag::Header(num)) => {
|
||||||
in_header = true;
|
in_header = true;
|
||||||
temp_header = TempHeader::new(num);
|
temp_header = TempHeader::new(num);
|
||||||
|
|
Loading…
Reference in a new issue