Packages
mdex
0.7.1
0.13.3
0.13.2
0.13.1
0.13.0
0.12.5
retired
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Fast and extensible Markdown for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
native/comrak_nif/src/autumnus_adapter.rs
use autumnus::formatter::{HtmlInlineBuilder, HtmlLinkedBuilder, TerminalBuilder};
use autumnus::languages::Language;
use autumnus::FormatterOption;
use comrak::adapters::SyntaxHighlighterAdapter;
use std::collections::HashMap;
use std::io::{self, Write};
#[derive(Default)]
pub struct AutumnusAdapter<'a> {
formatter: FormatterOption<'a>,
}
impl<'a> AutumnusAdapter<'a> {
pub fn new(formatter: FormatterOption<'a>) -> Self {
Self { formatter }
}
}
impl SyntaxHighlighterAdapter for AutumnusAdapter<'_> {
fn write_pre_tag(
&self,
output: &mut dyn Write,
_attributes: HashMap<String, String>,
) -> io::Result<()> {
match &self.formatter {
FormatterOption::HtmlInline {
theme,
pre_class,
italic,
include_highlights,
highlight_lines,
header,
} => {
let mut formatter = HtmlInlineBuilder::new()
.italic(*italic)
.include_highlights(*include_highlights);
if let Some(theme) = theme {
formatter = formatter.theme(theme);
}
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().open_pre_tag(output)
}
FormatterOption::HtmlLinked {
pre_class,
highlight_lines,
header,
} => {
let mut formatter = HtmlLinkedBuilder::new();
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().open_pre_tag(output)
}
FormatterOption::Terminal { .. } => Ok(()),
}
}
fn write_code_tag(
&self,
output: &mut dyn Write,
attributes: HashMap<String, String>,
) -> io::Result<()> {
let plaintext = "language-plaintext".to_string();
let language = attributes.get("class").unwrap_or(&plaintext);
let split: Vec<&str> = language.split('-').collect();
let language = split.get(1).unwrap_or(&"plaintext");
let lang: Language = Language::guess(language, "");
match &self.formatter {
FormatterOption::HtmlInline {
theme,
pre_class,
italic,
include_highlights,
highlight_lines,
header,
} => {
let mut formatter = HtmlInlineBuilder::new()
.italic(*italic)
.include_highlights(*include_highlights)
.lang(lang);
if let Some(theme) = theme {
formatter = formatter.theme(theme);
}
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().open_code_tag(output)
}
FormatterOption::HtmlLinked {
pre_class,
highlight_lines,
header,
} => {
let mut formatter = HtmlLinkedBuilder::new().lang(lang);
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().open_code_tag(output)
}
FormatterOption::Terminal { .. } => Ok(()),
}
}
fn write_highlighted(
&self,
output: &mut dyn Write,
lang: Option<&str>,
source: &str,
) -> io::Result<()> {
let lang: Language = Language::guess(lang.unwrap_or("plaintext"), source);
match &self.formatter {
FormatterOption::HtmlInline {
theme,
pre_class,
italic,
include_highlights,
highlight_lines,
header,
} => {
let mut formatter = HtmlInlineBuilder::new()
.italic(*italic)
.include_highlights(*include_highlights)
.lang(lang)
.source(source);
if let Some(theme) = theme {
formatter = formatter.theme(theme);
}
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().highlights(output)
}
FormatterOption::HtmlLinked {
pre_class,
highlight_lines,
header,
} => {
let mut formatter = HtmlLinkedBuilder::new().lang(lang).source(source);
if let Some(pre_class) = pre_class {
formatter = formatter.pre_class(pre_class);
}
if let Some(highlight_lines) = highlight_lines {
formatter = formatter.highlight_lines(highlight_lines.clone());
}
if let Some(header) = header {
formatter = formatter.header(header.clone());
}
formatter.build().highlights(output)
}
FormatterOption::Terminal { theme } => {
let mut formatter = TerminalBuilder::new().lang(lang).source(source);
if let Some(theme) = theme {
formatter = formatter.theme(theme);
}
formatter.build().highlights(output)
}
}
}
}