From c225adb22bb6a445f1cf7f0261e9a937ce397988 Mon Sep 17 00:00:00 2001 From: Leedehai <18319900+Leedehai@users.noreply.github.com> Date: Tue, 2 Apr 2024 05:07:00 -0400 Subject: [PATCH] Fix tab rendering for raw block with lang "typ(c)" (#3847) --- crates/typst/src/text/raw.rs | 42 +++++++++++-------- tests/ref/bugs/3841-tabs-in-raw-typ-code.png | Bin 0 -> 13011 bytes tests/typ/bugs/3841-tabs-in-raw-typ-code.typ | 20 +++++++++ 3 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 tests/ref/bugs/3841-tabs-in-raw-typ-code.png create mode 100644 tests/typ/bugs/3841-tabs-in-raw-typ-code.typ diff --git a/crates/typst/src/text/raw.rs b/crates/typst/src/text/raw.rs index 424adb722..2d590d2a9 100644 --- a/crates/typst/src/text/raw.rs +++ b/crates/typst/src/text/raw.rs @@ -300,22 +300,7 @@ impl Packed { #[comemo::memoize] fn highlight(&self, styles: StyleChain) -> Vec> { let elem = self.as_ref(); - - let text = elem.text(); - let lines = match text { - RawContent::Lines(lines) if !lines.iter().any(|(s, _)| s.contains('\t')) => { - lines.clone() - } - _ => { - let mut text = text.get(); - if text.contains('\t') { - let tab_size = RawElem::tab_size_in(styles); - text = align_tabs(&text, tab_size); - } - let lines = split_newlines(&text); - lines.into_iter().map(|line| (line.into(), self.span())).collect() - } - }; + let lines = preprocess(elem.text(), styles, self.span()); let count = lines.len() as i64; let lang = elem @@ -339,7 +324,8 @@ impl Packed { let mut seq = vec![]; if matches!(lang.as_deref(), Some("typ" | "typst" | "typc")) { - let text = text.get(); + let text = + lines.iter().map(|(s, _)| s.clone()).collect::>().join("\n"); let root = match lang.as_deref() { Some("typc") => syntax::parse_code(&text), _ => syntax::parse(&text), @@ -683,6 +669,28 @@ impl<'a> ThemedHighlighter<'a> { } } +fn preprocess( + text: &RawContent, + styles: StyleChain, + span: Span, +) -> EcoVec<(EcoString, Span)> { + if let RawContent::Lines(lines) = text { + if lines.iter().all(|(s, _)| !s.contains('\t')) { + return lines.clone(); + } + } + + let mut text = text.get(); + if text.contains('\t') { + let tab_size = RawElem::tab_size_in(styles); + text = align_tabs(&text, tab_size); + } + split_newlines(&text) + .into_iter() + .map(|line| (line.into(), span)) + .collect() +} + /// Style a piece of text with a syntect style. fn styled( piece: &str, diff --git a/tests/ref/bugs/3841-tabs-in-raw-typ-code.png b/tests/ref/bugs/3841-tabs-in-raw-typ-code.png new file mode 100644 index 0000000000000000000000000000000000000000..37dab1368f2ab727cad8959547c5468d6124f369 GIT binary patch literal 13011 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 MmsXLglrZ%FUl#?7pa1{> literal 0 HcmV?d00001 diff --git a/tests/typ/bugs/3841-tabs-in-raw-typ-code.typ b/tests/typ/bugs/3841-tabs-in-raw-typ-code.typ new file mode 100644 index 000000000..db04fe3c4 --- /dev/null +++ b/tests/typ/bugs/3841-tabs-in-raw-typ-code.typ @@ -0,0 +1,20 @@ +// Issue 3841 Tab chars are not rendered in raw blocks with lang: "typ(c)" +// https://github.com/typst/typst/issues/3841 + +#raw("#if true {\n\tf()\t// typ\n}", lang: "typ") + +#raw("if true {\n\tf()\t// typc\n}", lang: "typc") + +```typ +#if true { + // tabs around f() + f() // typ +} +``` + +```typc +if true { + // tabs around f() + f() // typc +} +```