1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use comrak::ComrakOptions;
use regex::Regex;
use std::collections::HashMap;

fn parse_yaml(contents: &str) -> HashMap<String, String> {
    let parts = contents.split("\n");
    let mut data = HashMap::new();

    for part in parts {
        if part.contains(":") {
            let bits: Vec<&str> = part.split(":").collect();
            let key = bits.first().unwrap().trim();
            let value = bits.last().unwrap().trim();

            data.insert(key.to_string(), value.to_string());
        }
    }

    return data;
}

fn parse_markdown(contents: &str) -> String {
    return comrak::markdown_to_html(contents, &ComrakOptions::default());
}

pub fn parse(contents: &str) -> HashMap<String, String> {
    let re = Regex::new(r"(?is)---(.*?)---").unwrap();
    let yaml_match = re.find(contents);

    if yaml_match.is_none() {
        return HashMap::new();
    }

    let yaml_bit = &contents[yaml_match.unwrap().start()..yaml_match.unwrap().end()];
    let mut data = parse_yaml(yaml_bit);

    let md = parse_markdown(re.replace(contents, "").as_ref().trim());

    data.insert("content".to_string(), md);
    data.insert(
        "content_raw".to_string(),
        re.replace(contents, "").as_ref().trim().to_string(),
    );

    return data;
}