hmd 0.4.13

Custom Markdown Engine for my personal blog.
Documentation
use crate::markdown::line::{Line, LineType};
use crate::consts::*;
use crate::utils::into_v16;


pub fn merge_paragraph(lines: &Vec<Line>) -> Vec<Line> {

    let mut curr_paragraph = vec![];
    let mut result = Vec::with_capacity(lines.len());

    for ln in lines.iter() {

        match ln.line_type {
            LineType::Paragraph => {
                curr_paragraph.push(ln);
            }
            _ => {

                if curr_paragraph.len() > 0 {
                    result.push(construct_paragraph(curr_paragraph));
                    curr_paragraph = vec![];
                }

                result.push(ln.clone());

            }
        }

    }

    if curr_paragraph.len() > 0 {
        result.push(construct_paragraph(curr_paragraph));
    }

    result
}


fn construct_paragraph(paragraph: Vec<&Line>) -> Line {

    let mut contents = Vec::with_capacity(paragraph.len() * 2);

    if paragraph.len() > 0 {

        for p in paragraph.iter() {
            contents.push(p.content.clone());

            match is_br(&p.content) {
                IsBr::TwoSpaces => {
                    let mut last_content = contents.pop().unwrap();
                    last_content = last_content[0..last_content.len() - 2].to_vec();
                    contents.push(last_content);
                    contents.push(into_v16("<br />"));
                }
                IsBr::Backslash => {
                    let mut last_content = contents.pop().unwrap();
                    last_content = last_content[0..last_content.len() - 1].to_vec();
                    contents.push(last_content);
                    contents.push(into_v16("<br />"));
                }
                IsBr::Nope => {contents.push(vec![U16_SPACE]);}
            }

        }

        contents.pop();
    }

    Line {
        content: contents.concat(),
        indent: 0,
        line_type: LineType::Paragraph
    }
}


fn is_br(content: &Vec<u16>) -> IsBr {

    if content.len() > 2
    && content[content.len() - 1] == U16_SPACE
    && content[content.len() - 2] == U16_SPACE {
        IsBr::TwoSpaces
    }

    else if content.len() > 1
    && (content[content.len() - 1] == BACKSLASH_ESCAPE_MARKER || content[content.len() - 1] == U16_BACKSLASH) {
        IsBr::Backslash
    }

    else {
        IsBr::Nope
    }

}

enum IsBr {
    TwoSpaces,
    Backslash,
    Nope
}