@@ -31,6 +31,7 @@ pub fn highlighted_code_block<'a>(
31 language: &str,
31 language: &str,
32 theme: Option<&Theme>,
32 theme: Option<&Theme>,
33 config_loader: Arc<syntax::Loader>,
33 config_loader: Arc<syntax::Loader>,
34+ additional_highlight_spans: Option<Vec<(usize, std::ops::Range<usize>)>>,
34) -> Text<'a> {
35) -> Text<'a> {
35 let mut spans = Vec::new();
36 let mut spans = Vec::new();
36 let mut lines = Vec::new();
37 let mut lines = Vec::new();
@@ -55,10 +56,19 @@ pub fn highlighted_code_block<'a>(
55 None => return styled_multiline_text(text, code_style),
56 None => return styled_multiline_text(text, code_style),
58− let mut highlights = Vec::new();
59+ let highlight_iter = syntax
60+ .highlight_iter(rope.slice(..), None, None)
61+ .map(|e| e.unwrap());
62+ let highlight_iter: Box<dyn Iterator<Item = HighlightEvent>> =
63+ if let Some(spans) = additional_highlight_spans {
64+ Box::new(helix_core::syntax::merge(highlight_iter, spans))
66+ Box::new(highlight_iter)
69+ let mut highlights = Vec::new();
60− for event in syntax.highlight_iter(rope.slice(..), None, None) {
70+ for event in highlight_iter {
61− match event.unwrap() {
71+ match event {
62 HighlightEvent::HighlightStart(span) => {
72 HighlightEvent::HighlightStart(span) => {
63 highlights.push(span);
73 highlights.push(span);
@@ -66,10 +76,9 @@ pub fn highlighted_code_block<'a>(
66 highlights.pop();
76 highlights.pop();
68 HighlightEvent::Source { start, end } => {
78 HighlightEvent::Source { start, end } => {
69− let style = match highlights.first() {
79+ let style = highlights
70− Some(span) => theme.get(&theme.scopes()[span.0]),
80+ .iter()
71− None => text_style,
81+ .fold(text_style, |acc, span| acc.patch(theme.highlight(span.0)));
74 let mut slice = &text[start..end];
83 let mut slice = &text[start..end];
75 // TODO: do we need to handle all unicode line endings
84 // TODO: do we need to handle all unicode line endings
@@ -195,6 +204,7 @@ impl Markdown {
195 language,
204 language,
197 Arc::clone(&self.config_loader),
206 Arc::clone(&self.config_loader),
199 lines.extend(tui_text.lines.into_iter());
209 lines.extend(tui_text.lines.into_iter());