From 060c1f23a5585a5fdabc56eda808b4cfd90f9081 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Wed, 21 May 2025 14:25:18 +1200 Subject: Implement syntax highlighting for syntax fragments A new key 'highlighters' has been added to the toaster.conf file. The value should be a line defining the languages to use that syntax for, like [py/python]. The lines following are the template definitions, as per the highlighter library. --- src/generate_html.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/generate_html.rs') diff --git a/src/generate_html.rs b/src/generate_html.rs index 0de42a5..5abddf2 100644 --- a/src/generate_html.rs +++ b/src/generate_html.rs @@ -236,7 +236,24 @@ pub fn document_to_html(document: &MarkdownDocument, page: &Page, website: &Webs warn!("Gallery-nav on page {from:?} has line without a '::' separator"); } }), - _ => wrap!("pre", format!("class='{language}'"), html!("{}", sanitize_text(content, false))), + _ => wrap!("pre", format!("class='{language}'"), { + if let Some(i) = website.highlighters.languages.get(language) { + let mut source = String::new(); + let highlighter = &website.highlighters.highlighters[*i]; + for span in highlighter.highlight(content) { + if span.tag.is_empty() { + source.push_str(&sanitize_text(&span.text, false)); + } else { + source.push_str(&format!("", span.tag.to_lowercase())); + source.push_str(&sanitize_text(&span.text, false)); + source.push_str(""); + } + } + html!("{source}"); + } else { + html!("{}", sanitize_text(content, false)) + } + }) } } Block::Break => html!("
"), -- cgit v1.2.3-70-g09d2