Packages
mdex
0.4.0
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/inkjet_adapter.rs
use autumn::themes;
use autumn::themes::Theme;
use comrak::adapters::SyntaxHighlighterAdapter;
use inkjet::Language;
use std::collections::HashMap;
use std::io::{self, Write};
use tree_sitter_highlight::Highlighter;
#[derive(Debug)]
pub struct InkjetAdapter<'a> {
theme: &'a Theme,
inline_style: bool,
}
impl Default for InkjetAdapter<'_> {
fn default() -> Self {
let default_theme = themes::theme("onedark").unwrap();
InkjetAdapter {
theme: default_theme,
inline_style: true,
}
}
}
impl<'a> InkjetAdapter<'a> {
pub fn new(theme: &'a str, inline_style: bool) -> Self {
let theme = match themes::theme(theme) {
Some(theme) => theme,
None => themes::theme("onedark").unwrap(),
};
Self {
theme,
inline_style,
}
}
}
impl SyntaxHighlighterAdapter for InkjetAdapter<'_> {
fn write_highlighted(
&self,
output: &mut dyn Write,
lang: Option<&str>,
source: &str,
) -> io::Result<()> {
let mut highlighter = Highlighter::new();
let lang = lang.unwrap_or("plaintext");
let lang = Language::from_token(lang).unwrap_or(Language::Plaintext);
let config = lang.config();
let highlights = highlighter
.highlight(
config,
source.as_bytes(),
None,
|token| match Language::from_token(token) {
Some(lang) => Some(lang.config()),
None => None,
},
)
.expect("expected to generate the syntax highlight events");
for event in highlights {
let event = event.expect("expected a highlight event");
let inner_highlights =
autumn::inner_highlights(source, event, self.theme, self.inline_style);
write!(output, "{}", inner_highlights)?
}
Ok(())
}
fn write_pre_tag(
&self,
output: &mut dyn Write,
_attributes: HashMap<String, String>,
) -> io::Result<()> {
let pre_tag = autumn::open_pre_tag(self.theme, None, self.inline_style);
write!(output, "{}", pre_tag)
}
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 language = Language::from_token(language).unwrap_or(Language::Plaintext);
let code_tag = autumn::open_code_tag(language);
write!(output, "{}", code_tag)
}
}