mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-11-04 09:01:56 +00:00 
			
		
		
		
	Strip BOM from output in interactive mode (#1938)
* Strip BOM from output in interactive mode * Strip BOM when not loop_through, add regression tests * Update CHANGELOG.md * Only strip BOM from beginning of first line * Fix integration test on macOS that relied on color scheme * Fix integration test on Windows that relied on detected terminal width * Fix syntax test that was failing due to a previously wrong (now fixed) highlighting Co-authored-by: David Peter <mail@david-peter.de> Co-authored-by: Martin Nordholts <enselic@gmail.com>
This commit is contained in:
		@@ -10,6 +10,7 @@
 | 
			
		||||
- Prevent fork nightmare with `PAGER=batcat`. See #2235 (@johnmatthiggins)
 | 
			
		||||
- Make `--no-paging`/`-P` override `--paging=...` if passed as a later arg, see #2201 (@themkat)
 | 
			
		||||
- `--map-syntax` and `--ignored-suffix` now works together, see #2093 (@czzrr)
 | 
			
		||||
- Strips byte order mark from output when in non-loop-through mode. See #1922 (@dag-h)
 | 
			
		||||
 | 
			
		||||
## Other
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -419,7 +419,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
        let line = if self.config.show_nonprintable {
 | 
			
		||||
            replace_nonprintable(line_buffer, self.config.tab_width)
 | 
			
		||||
        } else {
 | 
			
		||||
            match self.content_type {
 | 
			
		||||
            let line = match self.content_type {
 | 
			
		||||
                Some(ContentType::BINARY) | None => {
 | 
			
		||||
                    return Ok(());
 | 
			
		||||
                }
 | 
			
		||||
@@ -430,6 +430,15 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
                    .decode(line_buffer, DecoderTrap::Replace)
 | 
			
		||||
                    .map_err(|_| "Invalid UTF-16BE")?,
 | 
			
		||||
                _ => String::from_utf8_lossy(line_buffer).to_string(),
 | 
			
		||||
            };
 | 
			
		||||
            // Remove byte order mark from the first line if it exists
 | 
			
		||||
            if line_number == 1 {
 | 
			
		||||
                match line.strip_prefix('\u{feff}') {
 | 
			
		||||
                    Some(stripped) => stripped.to_string(),
 | 
			
		||||
                    None => line,
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                line
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tests/examples/test_BOM.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/examples/test_BOM.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
hello world
 | 
			
		||||
@@ -758,14 +758,66 @@ fn config_read_arguments_from_file() {
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn utf16() {
 | 
			
		||||
    // The output will be converted to UTF-8 with a leading UTF-8 BOM
 | 
			
		||||
    // The output will be converted to UTF-8 with the leading UTF-16
 | 
			
		||||
    // BOM removed. This behavior is wanted in interactive mode as
 | 
			
		||||
    // some terminals seem to display the BOM character as a space,
 | 
			
		||||
    // and it also breaks syntax highlighting.
 | 
			
		||||
    bat()
 | 
			
		||||
        .arg("--plain")
 | 
			
		||||
        .arg("--decorations=always")
 | 
			
		||||
        .arg("test_UTF-16LE.txt")
 | 
			
		||||
        .assert()
 | 
			
		||||
        .success()
 | 
			
		||||
        .stdout(std::str::from_utf8(b"\xEF\xBB\xBFhello world\n").unwrap());
 | 
			
		||||
        .stdout("hello world\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
 | 
			
		||||
#[test]
 | 
			
		||||
fn bom_not_stripped_in_loop_through_mode() {
 | 
			
		||||
    bat()
 | 
			
		||||
        .arg("--plain")
 | 
			
		||||
        .arg("--decorations=never")
 | 
			
		||||
        .arg("--color=never")
 | 
			
		||||
        .arg("test_BOM.txt")
 | 
			
		||||
        .assert()
 | 
			
		||||
        .success()
 | 
			
		||||
        .stdout("\u{feff}hello world\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
 | 
			
		||||
#[test]
 | 
			
		||||
fn bom_stripped_when_colored_output() {
 | 
			
		||||
    bat()
 | 
			
		||||
        .arg("--color=always")
 | 
			
		||||
        .arg("--decorations=never")
 | 
			
		||||
        .arg("test_BOM.txt")
 | 
			
		||||
        .assert()
 | 
			
		||||
        .success()
 | 
			
		||||
        .stdout(
 | 
			
		||||
            predicate::str::is_match("\u{1b}\\[38;5;[0-9]{3}mhello world\u{1b}\\[0m\n").unwrap(),
 | 
			
		||||
        );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
 | 
			
		||||
#[test]
 | 
			
		||||
fn bom_stripped_when_no_color_and_not_loop_through() {
 | 
			
		||||
    bat()
 | 
			
		||||
        .arg("--color=never")
 | 
			
		||||
        .arg("--decorations=always")
 | 
			
		||||
        .arg("--style=numbers,grid,header")
 | 
			
		||||
        .arg("--terminal-width=80")
 | 
			
		||||
        .arg("test_BOM.txt")
 | 
			
		||||
        .assert()
 | 
			
		||||
        .success()
 | 
			
		||||
        .stdout(
 | 
			
		||||
            "\
 | 
			
		||||
─────┬──────────────────────────────────────────────────────────────────────────
 | 
			
		||||
     │ File: test_BOM.txt
 | 
			
		||||
─────┼──────────────────────────────────────────────────────────────────────────
 | 
			
		||||
   1 │ hello world
 | 
			
		||||
─────┴──────────────────────────────────────────────────────────────────────────
 | 
			
		||||
",
 | 
			
		||||
        );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
[38;2;248;248;242m[0m[38;2;117;113;94m#[0m[38;2;117;113;94m PowerShell script for testing syntax highlighting[0m
 | 
			
		||||
[38;2;117;113;94m#[0m[38;2;117;113;94m PowerShell script for testing syntax highlighting[0m
 | 
			
		||||
 | 
			
		||||
[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet-FutureTime[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
 | 
			
		||||
[38;2;248;248;242m    [0m[38;2;249;38;114mparam[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user