cobalt/cobalt_model/
mark.rs

1use pulldown_cmark as cmark;
2use serde::Serialize;
3
4use crate::error::Result;
5use crate::syntax_highlight::decorate_markdown;
6
7#[derive(Debug, Clone, Serialize)]
8#[serde(deny_unknown_fields)]
9pub struct MarkdownBuilder {
10    pub theme: Option<liquid::model::KString>,
11    #[serde(skip)]
12    pub syntax: std::sync::Arc<crate::SyntaxHighlight>,
13}
14
15impl MarkdownBuilder {
16    pub fn build(self) -> Markdown {
17        Markdown {
18            theme: self.theme,
19            syntax: self.syntax,
20        }
21    }
22}
23
24#[derive(Debug, Clone)]
25pub struct Markdown {
26    theme: Option<liquid::model::KString>,
27    syntax: std::sync::Arc<crate::SyntaxHighlight>,
28}
29
30impl Markdown {
31    pub fn parse(&self, content: &str) -> Result<String> {
32        let mut buf = String::new();
33        let options = cmark::Options::ENABLE_FOOTNOTES
34            | cmark::Options::ENABLE_TABLES
35            | cmark::Options::ENABLE_STRIKETHROUGH
36            | cmark::Options::ENABLE_TASKLISTS;
37        let parser = cmark::Parser::new_ext(content, options);
38        cmark::html::push_html(
39            &mut buf,
40            decorate_markdown(parser, self.syntax.clone(), self.theme.as_deref())?,
41        );
42        Ok(buf)
43    }
44}