hmd 0.4.13

Custom Markdown Engine for my personal blog.
Documentation
use crate::markdown::escape::undo_html_escapes;
use crate::markdown::line::{Line, LineType};
use crate::consts::*;
use crate::utils::into_v16;
use syntect::parsing::SyntaxSet;
use syntect::easy::HighlightLines;
use syntect::highlighting::{ThemeSet, Theme};
use syntect::html::{IncludeBackground, append_highlighted_html_for_styled_line};

pub struct SyntaxHighlighter {
    syntaxes: SyntaxSet,
    theme: Theme
}

impl SyntaxHighlighter {
    pub fn new() -> SyntaxHighlighter {
        let syntax_set = SyntaxSet::load_defaults_nonewlines();
        let theme_set = ThemeSet::load_defaults();
        let theme = theme_set.themes["base16-eighties.dark"].clone();

        SyntaxHighlighter {
            syntaxes: syntax_set,
            theme
        }
    }

    pub fn highlight_syntax(&self, lines: Vec<Line>, syntax: &str) -> Vec<Line> {

        let syntax_rule = match self.syntaxes.find_syntax_by_token(syntax) {
            None => {return lines;}
            Some(s) => s
        };

        let mut highlighter = HighlightLines::new(syntax_rule, &self.theme);
        let mut output = String::new();

        for ln in lines.iter() {
            let mut raw_line = undo_html_escapes(&ln.into_raw());
            raw_line.push(U16_NEWLINE);

            let curr_line = &String::from_utf16_lossy(&raw_line);
            let styled_line = highlighter.highlight(curr_line, &self.syntaxes);
            append_highlighted_html_for_styled_line(
                &styled_line[..],
                IncludeBackground::No,
                &mut output
            );
        }

        let result = into_v16(&output);

        result.split(
            |c|
            *c == U16_NEWLINE
        ).map(
            |ln| Line {
                line_type: LineType::Paragraph,
                content: ln.to_vec(),
                indent: 0
            }
        ).collect::<Vec<Line>>()
    }

}