ipsae_core/parser/
markdown.rs1use 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}