use std::io;
use std::io::ErrorKind;
use markdown::Options;
use crate::content::parsing_utils::remove_comments;
pub fn change_images(post_name: &str, md_post: &str) -> String {
let mut parsed_string = String::new();
let mut remaining_input = md_post;
while let Some(text_start) = remaining_input.find("![") {
let text_end = text_start + 2;
parsed_string.push_str(&remaining_input[0..text_end]);
remaining_input = &remaining_input[text_end..];
if let Some(link_end) = remaining_input.find("](") {
let link_text = &remaining_input[..link_end];
let url_start = link_end + 2;
let url_start_slice = &remaining_input[url_start..];
if let Some(url_end) = url_start_slice.find(')') {
let url = &remaining_input[url_start..url_end + url_start];
let prefixed_url = if post_name.ends_with("/") {
format!("{}{}", post_name, url)
} else {
format!("{}/{}", post_name, url)
};
parsed_string.push_str(link_text);
parsed_string.push_str("](");
parsed_string.push_str(&prefixed_url);
parsed_string.push(')');
let remaining = &url_start_slice[url_end + 1..];
remaining_input = remaining;
}
}
}
parsed_string.push_str(remaining_input);
parsed_string
}
pub fn render_post(md_text: &str, img_prefix: Option<&str>) -> io::Result<String> {
let buf = remove_comments(md_text)?;
let buf = if let Some(img_prefix) = img_prefix {
change_images(img_prefix, buf.as_str())
} else {
buf
};
match markdown::to_html_with_options(buf.as_str(), &Options::gfm()) {
Ok(x) => Ok(x),
Err(e) => Err(io::Error::new(ErrorKind::InvalidInput, e.reason.as_str())),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add_prefix_empty_label() {
let content = "somethingosadiosa";
let parsed = change_images("post_name/", content);
assert_eq!(parsed, "somethingosadiosa");
let parsed = change_images("post_name", content);
assert_eq!(parsed, "somethingosadiosa");
}
#[test]
fn test_add_prefix() {
let content = "somethingosadiosa";
let parsed = change_images("post_name/", content);
assert_eq!(parsed, "somethingosadiosa");
let parsed = change_images("post_name", content);
assert_eq!(parsed, "somethingosadiosa");
}
}