use std::collections::HashMap;
use std::io::Write;
use comrak::adapters::SyntaxHighlighterAdapter;
use syntect::{
html::{ClassStyle, ClassedHTMLGenerator},
parsing::SyntaxSet,
util::LinesWithEndings,
};
pub struct ComrakSyntectAdapter<'a> {
pub(crate) syntax_set: &'a SyntaxSet,
}
impl SyntaxHighlighterAdapter for ComrakSyntectAdapter<'_> {
fn write_highlighted(
&self,
output: &mut dyn Write,
lang: Option<&str>,
code: &str,
) -> std::io::Result<()> {
let syntax = lang
.and_then(|v| self.syntax_set.find_syntax_by_token(v))
.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text());
let mut html_generator =
ClassedHTMLGenerator::new_with_class_style(syntax, self.syntax_set, ClassStyle::Spaced);
for line in LinesWithEndings::from(code) {
let _res = html_generator.parse_html_for_line_which_includes_newline(line);
}
write!(
output,
"<code>{}</code>",
html_generator.finalize().replace('\n', "</code>\n<code>")
)
}
fn write_pre_tag(
&self,
output: &mut dyn Write,
_attributes: HashMap<String, String>,
) -> std::io::Result<()> {
write!(output, r#"<pre>"#)
}
fn write_code_tag(
&self,
_output: &mut dyn Write,
_attributes: HashMap<String, String>,
) -> std::io::Result<()> {
Ok(())
}
}