From 0d6d889dfe32f793f63027e1d773aebe65c38c6f Mon Sep 17 00:00:00 2001 From: A Farzat Date: Sun, 7 Jun 2026 19:57:48 +0300 Subject: Start adding shebang filetype detection --- src/renderer.rs | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'src/renderer.rs') diff --git a/src/renderer.rs b/src/renderer.rs index 14d30d6..164012e 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -64,7 +64,7 @@ impl Renderer { fn write_file(&mut self, filename: &Path, contents: &str) -> std::io::Result<()> { let name = display_path(filename); let fence = outer_backticks(contents); - let language = detect_language(filename); + let language = detect_language(filename, contents); self.log_file_render(filename); writeln!(self.output)?; writeln!(self.output, "## File: {}", name)?; @@ -142,7 +142,7 @@ fn human_readable_size(bytes: u64) -> String { } } -fn detect_language(filename: &Path) -> &'static str { +fn detect_language(filename: &Path, contents: &str) -> &'static str { let ext = filename .extension() .and_then(|e| e.to_str()) @@ -152,7 +152,14 @@ fn detect_language(filename: &Path) -> &'static str { Some("rs") => "rust", Some("py") => "python", Some("json") => "json", - _ => "", + _ => { + if let Some(first_line) = contents.lines().next() + && first_line.contains("python") + { + return "python"; + } + "" + } } } @@ -245,6 +252,18 @@ mod tests { assert_eq!(String::from_utf8(output).unwrap(), expected); } + #[test] + fn txt_file_has_no_language_fence() { + let mut output = Vec::new(); + let mut renderer = Renderer::new(&mut output); + + let input = Cursor::new("hello world"); + renderer.render_file(Path::new("hello.txt"), input).unwrap(); + let expected = "\n## File: hello.txt\n```\nhello world\n```\n"; + + assert_eq!(String::from_utf8(output).unwrap(), expected); + } + #[test] fn python_file_has_python_language_fence() { let mut output = Vec::new(); @@ -281,6 +300,18 @@ mod tests { assert_eq!(String::from_utf8(output).unwrap(), expected); } + #[test] + fn python_file_detected_from_shebang() { + let mut output = Vec::new(); + let mut renderer = Renderer::new(&mut output); + + let input = Cursor::new("#! /bin/python3\nprint('hello')"); + renderer.render_file(Path::new("hello"), input).unwrap(); + let expected = "\n## File: hello\n```python\n#! /bin/python3\nprint('hello')\n```\n"; + + assert_eq!(String::from_utf8(output).unwrap(), expected); + } + #[test] fn renderer_places_placeholder_for_large_files_by_default() { let mut output = Vec::new(); -- cgit v1.3.1