From 774514f4d4efc65e99a9108a6fc886e9747e567c Mon Sep 17 00:00:00 2001 From: Peng Guanwen Date: Sat, 5 Jan 2019 22:37:24 +0800 Subject: [PATCH] refactor markdown_to_html this commit contains two refactors: - extract custom link transformations into a function. - separate some trivial markup generation. --- components/rendering/src/markdown.rs | 111 +++++++++++++++------------ 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index c21e58b..368901a 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -49,6 +49,56 @@ fn is_colocated_asset_link(link: &str) -> bool { && !link.starts_with("mailto:") } +fn fix_link(link: &str, context: &RenderContext) -> Result { + // 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(""); + } + Event::Start(Tag::Code) => { + temp_header.add_html(""); + } + Event::End(Tag::Code) => { + temp_header.add_html(""); + } + _ => return false, + } + true +} + pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result { // the rendered html let mut html = String::with_capacity(content.len()); @@ -76,6 +126,11 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result { // Header first @@ -142,37 +197,12 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result { - // 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 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() + let fixed_link = match fix_link(&link, context) { + Ok(fixed_link) => fixed_link, + Err(err) => { + error = Some(err); + return Event::Html(Borrowed("")) } - } else { - link.to_string() }; if in_header { @@ -187,27 +217,6 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result { - if in_header { - temp_header.add_html(""); - return Event::Html(Borrowed("")); - } - event - } - Event::Start(Tag::Code) => { - if in_header { - temp_header.add_html(""); - return Event::Html(Borrowed("")); - } - event - } - Event::End(Tag::Code) => { - if in_header { - temp_header.add_html(""); - return Event::Html(Borrowed("")); - } - event - } Event::Start(Tag::Header(num)) => { in_header = true; temp_header = TempHeader::new(num);