ipsae_core/parser/
markdown.rs

1use regex::Regex;
2
3use crate::parser::visitor::Visitor;
4
5#[derive(Debug, PartialEq, Copy, Clone)]
6pub enum MarkdownType {
7    H1,
8    H2,
9    H3,
10    P,
11    Strong,
12    Italic,
13}
14
15#[derive(Debug, PartialEq)]
16pub struct Markdown {
17    pub style: MarkdownType,
18    pub content: String,
19    pub children: Vec<Markdown>,
20}
21
22pub trait Visitable<V: Visitor> {
23    fn accept(&self, visitor: V, content: &str) -> Option<Markdown>;
24}
25
26pub struct MarkdownVisitable {
27    pub style: MarkdownType,
28    pub regex: Regex,
29    pub is_block: bool,
30}
31
32impl<V: Visitor> Visitable<V> for MarkdownVisitable {
33    fn accept(&self, visitor: V, content: &str) -> Option<Markdown> {
34        if self.regex.is_match(content) {
35            let split_content: Vec<&str> = self.regex.split(content).collect();
36            let capture_content = self.regex.captures(content).unwrap().get(3).map_or("", |m| m.as_str());
37            if self.style == MarkdownType::P {
38                return Some(visitor.visit(self.style.clone(), content));
39            }
40            if self.is_block == true {
41                return Some(visitor.visit(self.style.clone(), split_content[1]));
42            }
43            return Some(visitor.visit(self.style.clone(), capture_content));
44        }
45
46        None
47    }
48}