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
#[cfg(test)]
mod tests {
    use crate::render_to_html;
    
    #[test]
    fn test_headings() {
        let heading_tests = vec![
            ("<h1>Heading level 1</h1>", "# Heading level 1"),
            ("<h2>Heading level 2</h2>", "## Heading level 2"),
            ("<h3>Heading level 3</h3>", "### Heading level 3"),
            ("<h4>Heading level 4</h4>", "#### Heading level 4"),
            ("<h5>Heading level 5</h5>", "##### Heading level 5"),
            ("<h6>Heading level 6</h6>", "###### Heading level 6"),
        ];
        for test in heading_tests.iter(){
            println!("Testing: {} -> {}", test.1, test.0);
            assert_eq!(test.0, render_to_html(test.1));
        }
    }
}

pub fn render_to_html(source: &str) -> String {
    let mut output = String::new();
    for line in source.lines() {
        if line.starts_with("#"){
            output.push_str(&render_heading(line))
        }
    }
    output
}

fn render_heading(line: &str) -> String{
    let mut output = String::new();
    let hashes: String = line.chars().take_while(|x| x == &'#').collect();
    if hashes.len() > 6{
        return line.to_string()
    }
    let lead_heading = "<h".to_owned()+&hashes.len().to_string()+&">".to_owned();
    let end_heading = "</h".to_owned()+&hashes.len().to_string()+&">".to_owned();
    let prefix = hashes + " ";
    output.push_str(&lead_heading);
    output.push_str(line.strip_prefix(&prefix).unwrap_or(""));
    output.push_str(&end_heading);
    output
}