cobalt/cobalt_model/
mark.rs1use 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}