Initial commit
commit
d650c5c3b8
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
/Cargo.lock
|
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "chroma-syntaxis-comrak"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
chroma-syntaxis = { git = "https://git.lavender.software/charlotte/chroma-syntaxis.git", features = ["built-in"] }
|
||||
comrak = "0.12.1"
|
|
@ -0,0 +1,78 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use chroma_syntaxis::highlight;
|
||||
use comrak::adapters::SyntaxHighlighterAdapter;
|
||||
|
||||
pub struct ChromaSyntaxisAdapter<'a> {
|
||||
highlight_names: &'a [&'a str],
|
||||
}
|
||||
impl SyntaxHighlighterAdapter for ChromaSyntaxisAdapter<'_> {
|
||||
fn highlight(&self, lang: Option<&str>, code: &str) -> String {
|
||||
match lang {
|
||||
Some(lang) => highlight(lang, code, self.highlight_names),
|
||||
None => code.to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn build_pre_tag(&self, _attributes: &HashMap<String, String>) -> String {
|
||||
String::from("<pre>")
|
||||
}
|
||||
|
||||
fn build_code_tag(&self, attributes: &HashMap<String, String>) -> String {
|
||||
let mut s = String::from("<code");
|
||||
|
||||
for (k, v) in attributes {
|
||||
s.push(' ');
|
||||
s.push_str(k);
|
||||
s.push('=');
|
||||
s.push('"');
|
||||
s.push_str(v);
|
||||
s.push('"');
|
||||
}
|
||||
|
||||
s.push('>');
|
||||
s
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use chroma_syntaxis::built_in::{register_builtin_languages, COMMON_HIGHLIGHT_NAMES};
|
||||
use comrak::{markdown_to_html_with_plugins, ComrakOptions, ComrakPlugins};
|
||||
|
||||
use crate::ChromaSyntaxisAdapter;
|
||||
|
||||
#[test]
|
||||
fn highlight_rust() {
|
||||
register_builtin_languages();
|
||||
|
||||
let highlighter = ChromaSyntaxisAdapter {
|
||||
highlight_names: COMMON_HIGHLIGHT_NAMES,
|
||||
};
|
||||
let mut plugins = ComrakPlugins::default();
|
||||
plugins.render.codefence_syntax_highlighter = Some(&highlighter);
|
||||
|
||||
let input = r#"Hello :)
|
||||
|
||||
Here is some code:
|
||||
|
||||
```rust
|
||||
fn main() {
|
||||
println!("Hello, world!")
|
||||
}
|
||||
```"#;
|
||||
|
||||
let output = markdown_to_html_with_plugins(input, &ComrakOptions::default(), &plugins);
|
||||
|
||||
assert_eq!(
|
||||
output,
|
||||
r#"<p>Hello :)</p>
|
||||
<p>Here is some code:</p>
|
||||
<pre><code class="language-rust"><span class="keyword">fn</span> <span class="function">main</span><span class="punctuation bracket">()</span> {
|
||||
<span class="function macro">println!</span><span class="punctuation bracket">(</span><span class="string">"Hello, world!"</span><span class="punctuation bracket">)</span>
|
||||
}
|
||||
</code></pre>
|
||||
"#
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue