summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Peter <sharkdp@users.noreply.github.com>2024-02-23 21:59:45 +0100
committerGitHub <noreply@github.com>2024-02-23 21:59:45 +0100
commite1a3fc5529d55abc73aa5fb18368d22f9b9bb71c (patch)
tree3d4267038a7c0687caa8c3391db9e77e6dbda4a9
parentdbe4cfb7634c06d8812dc77ff15db02dd817daf5 (diff)
parent1ae9e843edf0798cce915556780e8476a9204b31 (diff)
Merge pull request #2857 from eth-p/skip-highlighting-when-no-color
Skip syntax parsing when color is not being output.
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/printer.rs75
2 files changed, 49 insertions, 27 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8df1ea71..3c95cf9f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@
- Pull in fix for unsafe-libyaml security advisory, see #2812 (@dtolnay)
- Update git-version dependency to use Syn v2, see #2816 (@dtolnay)
- Update git2 dependency to v0.18.2, see #2852 (@eth-p)
+- Improve performance when color output disabled, see #2397 and #2857 (@eth-p)
- Relax syntax mapping rule restrictions to allow brace expansion #2865 (@cyqsimon)
- Apply clippy fixes #2864 (@cyqsimon)
diff --git a/src/printer.rs b/src/printer.rs
index f413fdc3..8fd6bc8e 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -9,6 +9,7 @@ use bytesize::ByteSize;
use syntect::easy::HighlightLines;
use syntect::highlighting::Color;
+use syntect::highlighting::FontStyle;
use syntect::highlighting::Theme;
use syntect::parsing::SyntaxSet;
@@ -48,6 +49,22 @@ const ANSI_UNDERLINE_DISABLE: EscapeSequence = EscapeSequence::CSI {
final_byte: "m",
};
+const EMPTY_SYNTECT_STYLE: syntect::highlighting::Style = syntect::highlighting::Style {
+ foreground: Color {
+ r: 127,
+ g: 127,
+ b: 127,
+ a: 255,
+ },
+ background: Color {
+ r: 127,
+ g: 127,
+ b: 127,
+ a: 255,
+ },
+ font_style: FontStyle::empty(),
+};
+
pub enum OutputHandle<'a> {
IoWrite(&'a mut dyn io::Write),
FmtWrite(&'a mut dyn fmt::Write),
@@ -222,11 +239,13 @@ impl<'a> InteractivePrinter<'a> {
panel_width = 0;
}
- let highlighter_from_set = if input
+ // Get the highlighter for the output.
+ let is_printing_binary = input
.reader
.content_type
- .map_or(false, |c| c.is_binary() && !config.show_nonprintable)
- {
+ .map_or(false, |c| c.is_binary() && !config.show_nonprintable);
+
+ let highlighter_from_set = if is_printing_binary || config.colored_output == false {
None
} else {
// Determine the type of syntax for highlighting
@@ -346,6 +365,31 @@ impl<'a> InteractivePrinter<'a> {
self.print_header_component_with_indent(handle, content)
}
+ fn highlight_regions_for_line<'b>(
+ &mut self,
+ line: &'b str,
+ ) -> Result<Vec<(syntect::highlighting::Style, &'b str)>> {
+ let highlighter_from_set = match self.highlighter_from_set {
+ Some(ref mut highlighter_from_set) => highlighter_from_set,
+ _ => return Ok(vec![(EMPTY_SYNTECT_STYLE, line)]),
+ };
+
+ // skip syntax highlighting on long lines
+ let too_long = line.len() > 1024 * 16;
+
+ let for_highlighting: &str = if too_long { "\n" } else { &line };
+
+ let mut highlighted_line = highlighter_from_set
+ .highlighter
+ .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
+
+ if too_long {
+ highlighted_line[0].1 = &line;
+ }
+
+ Ok(highlighted_line)
+ }
+
fn preprocess(&self, text: &str, cursor: &mut usize) -> String {
if self.config.tab_width > 0 {
return expand_tabs(text, self.config.tab_width, cursor);
@@ -528,30 +572,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
}
};
- let regions = {
- let highlighter_from_set = match self.highlighter_from_set {
- Some(ref mut highlighter_from_set) => highlighter_from_set,
- _ => {
- return Ok(());
- }
- };
-
- // skip syntax highlighting on long lines
- let too_long = line.len() > 1024 * 16;
-
- let for_highlighting: &str = if too_long { "\n" } else { &line };
-
- let mut highlighted_line = highlighter_from_set
- .highlighter
- .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
-
- if too_long {
- highlighted_line[0].1 = &line;
- }
-
- highlighted_line
- };
-
+ let regions = self.highlight_regions_for_line(&line)?;
if out_of_range {
return Ok(());
}