mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-11-04 09:01:56 +00:00 
			
		
		
		
	Handle line with invalid UTF-8
This commit is contained in:
		
				
					committed by
					
						
						David Peter
					
				
			
			
				
	
			
			
			
						parent
						
							d0782ef954
						
					
				
				
					commit
					12cb438aa4
				
			
							
								
								
									
										31
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -162,30 +162,15 @@ fn print_file(
 | 
			
		||||
 | 
			
		||||
    printer.print_header(filename)?;
 | 
			
		||||
 | 
			
		||||
    let mut line_nr = 1;
 | 
			
		||||
    let mut line_buffer = String::new();
 | 
			
		||||
    loop {
 | 
			
		||||
        line_buffer.clear();
 | 
			
		||||
        let num_bytes = reader.read_line(&mut line_buffer);
 | 
			
		||||
    let mut buffer = Vec::new();
 | 
			
		||||
    while reader.read_until(b'\n', &mut buffer)? > 0 {
 | 
			
		||||
        {
 | 
			
		||||
            let line = String::from_utf8_lossy(&buffer);
 | 
			
		||||
            let regions = highlighter.highlight(line.as_ref());
 | 
			
		||||
 | 
			
		||||
        let line = match num_bytes {
 | 
			
		||||
            Ok(0) => {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            Ok(_) => {
 | 
			
		||||
                if !line_buffer.ends_with('\n') {
 | 
			
		||||
                    line_buffer.push('\n');
 | 
			
		||||
                }
 | 
			
		||||
                &line_buffer
 | 
			
		||||
            }
 | 
			
		||||
            Err(_) => "<bat: INVALID UTF-8>\n",
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let regions = highlighter.highlight(line);
 | 
			
		||||
 | 
			
		||||
        printer.print_line(line_nr, ®ions)?;
 | 
			
		||||
 | 
			
		||||
        line_nr += 1;
 | 
			
		||||
            printer.print_line(®ions)?;
 | 
			
		||||
        }
 | 
			
		||||
        buffer.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printer.print_footer()?;
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ pub struct Printer<'a> {
 | 
			
		||||
    config: &'a Config<'a>,
 | 
			
		||||
    decorations: Vec<Box<Decoration>>,
 | 
			
		||||
    panel_width: usize,
 | 
			
		||||
    line_number: usize,
 | 
			
		||||
    pub line_changes: Option<LineChanges>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -64,6 +65,7 @@ impl<'a> Printer<'a> {
 | 
			
		||||
            colors,
 | 
			
		||||
            config,
 | 
			
		||||
            decorations,
 | 
			
		||||
            line_number: 0,
 | 
			
		||||
            line_changes: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -108,11 +110,8 @@ impl<'a> Printer<'a> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn print_line(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        line_number: usize,
 | 
			
		||||
        regions: &[(highlighting::Style, &str)],
 | 
			
		||||
    ) -> Result<()> {
 | 
			
		||||
    pub fn print_line(&mut self, regions: &[(highlighting::Style, &str)]) -> Result<()> {
 | 
			
		||||
        self.line_number += 1;
 | 
			
		||||
        let mut cursor: usize = 0;
 | 
			
		||||
        let mut cursor_max: usize = self.config.term_width;
 | 
			
		||||
        let mut panel_wrap: Option<String> = None;
 | 
			
		||||
@@ -122,7 +121,7 @@ impl<'a> Printer<'a> {
 | 
			
		||||
            let decorations = self
 | 
			
		||||
                .decorations
 | 
			
		||||
                .iter()
 | 
			
		||||
                .map(|ref d| d.generate(line_number, false, self))
 | 
			
		||||
                .map(|ref d| d.generate(self.line_number, false, self))
 | 
			
		||||
                .collect::<Vec<_>>();
 | 
			
		||||
 | 
			
		||||
            for deco in decorations {
 | 
			
		||||
@@ -184,7 +183,7 @@ impl<'a> Printer<'a> {
 | 
			
		||||
                                "{} ",
 | 
			
		||||
                                self.decorations
 | 
			
		||||
                                    .iter()
 | 
			
		||||
                                    .map(|ref d| d.generate(line_number, true, self).text)
 | 
			
		||||
                                    .map(|ref d| d.generate(self.line_number, true, self).text)
 | 
			
		||||
                                    .collect::<Vec<String>>()
 | 
			
		||||
                                    .join(" ")
 | 
			
		||||
                            ))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user