use crate::helpers::re;
use regex::{Captures, Regex};
#[derive(Debug)]
struct Blockquote {
pub size: usize,
pub text: String,
pub cite: String
}
pub fn default(html: &mut String) {
let re_blockquote: Regex = re::from(re::BLOCKQUOTE);
if !re_blockquote.is_match(&html) {
return ();
}
re_blockquote.captures_iter(&html.clone()).for_each(| capture: Captures | {
let (mut prev_size, mut result): (usize, String) = (1, String::new());
capture[0].trim().lines().map(| mut line: &str | -> Blockquote {
let mut size: usize = 0;
while line.starts_with(">") {
line = &line[1..];
size += 1;
}
line = line.trim();
let (mut cite, cite_split): (&str, &str) = ("", " -- ");
if line.contains(cite_split) {
match line.find(cite_split) {
Some(position) => {
cite = &line[(position + cite_split.len())..].trim();
line = &line[..position].trim();
},
None => { }
};
}
Blockquote {
size, text: line.to_string(),
cite: cite.replace(" -- ", ", ")
}
})
.enumerate().for_each(| (i, blockquote): (usize, Blockquote) | {
let (cite_capture, cite_replace): (&str, &str) = if blockquote.cite.is_empty() {
("<cite>%cite</cite>", "")
} else {
("%cite", &blockquote.cite)
};
let blockquote_html: String = format!("<blockquote>{}<cite>%cite</cite>%child</blockquote>%sibling", &blockquote.text)
.replace(cite_capture, cite_replace);
if i == 0 && blockquote.size > 1 {
panic!("Marcus: ParseError: The size (indent level) of the first/root/parent blockquote must be 1");
} else if i == 0 {
result = blockquote_html.replace("%sibling", "");
} else if blockquote.size == prev_size {
result = result.replace("%sibling", &blockquote_html);
} else if blockquote.size > prev_size {
result = result.replace("%child", &blockquote_html);
} else {
result = format!("{}\n\n{}", result.replace("%child", "").replace("%sibling", ""), &blockquote_html);
}
prev_size = blockquote.size;
});
result = format!("\n\n{}\n\n", result.replace("%child", "").replace("%sibling", ""));
*html = html.replace(&capture[0], &result);
});
}