diff options
Diffstat (limited to 'code/src/syntax_highlight/mod.rs')
-rw-r--r-- | code/src/syntax_highlight/mod.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/code/src/syntax_highlight/mod.rs b/code/src/syntax_highlight/mod.rs new file mode 100644 index 0000000..688b010 --- /dev/null +++ b/code/src/syntax_highlight/mod.rs @@ -0,0 +1,29 @@ +pub mod grammar; +pub mod theme; + +use crate::{markdown::escape, syntax_highlight::theme::theme}; +use grammar::grammar_for; +use synoptic::{Highlighter, Token}; + +pub fn syntax_highlight(lang: &str, source: &str) -> String { + let mut h = Highlighter::new(); + for (regex, kind) in grammar_for(lang) { + h.join(regex, kind).unwrap(); + } + let highlighting = h.run(source); + let mut out = String::new(); + + for (_c, row) in highlighting.iter().enumerate() { + eprintln!("{row:?}"); + for tok in row { + match tok { + Token::Start(kind) => out += &format!("<span style=\"color:{}\">", theme(kind)), + Token::Text(text) => out += &escape(text), + Token::End(_kind) => out += "</span>", + } + } + out += "\n" + } + eprintln!("{out:?}"); + out +} |