From 78c8d659e1a642e3938e763065da3a67c35f7183 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 8 Jul 2025 23:48:19 +0300 Subject: feat: improve language detection with shebang parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Always check shebang lines for executable files without extensions - Detect AWK scripts with .cgi extension (like awksite) - Support detecting Python, Ruby, Perl, Raku, JavaScript, PHP, Lua via shebang - Add comprehensive shebang parsing for awk/gawk/mawk variants - awksite now correctly shows as 72.1% AWK 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/showcase/language_detector.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'internal/showcase/language_detector.go') diff --git a/internal/showcase/language_detector.go b/internal/showcase/language_detector.go index b82430d..0f356b8 100644 --- a/internal/showcase/language_detector.go +++ b/internal/showcase/language_detector.go @@ -172,6 +172,39 @@ func detectLanguages(repoPath string) (languages []LanguageStats, documentation } } + // Check shebang for executable files when no language was detected + if language == "" && info.Mode()&0111 != 0 { + if file, err := os.Open(path); err == nil { + scanner := bufio.NewScanner(file) + if scanner.Scan() { + firstLine := scanner.Text() + if strings.HasPrefix(firstLine, "#!") { + // Check for various interpreters in shebang + if strings.Contains(firstLine, "python") { + language = "Python" + } else if strings.Contains(firstLine, "node") { + language = "JavaScript" + } else if strings.Contains(firstLine, "ruby") { + language = "Ruby" + } else if strings.Contains(firstLine, "perl") && !strings.Contains(firstLine, "perl6") { + language = "Perl" + } else if strings.Contains(firstLine, "perl6") || strings.Contains(firstLine, "raku") { + language = "Raku" + } else if strings.Contains(firstLine, "awk") || strings.Contains(firstLine, "gawk") || strings.Contains(firstLine, "mawk") { + language = "AWK" + } else if strings.Contains(firstLine, "sh") || strings.Contains(firstLine, "bash") || strings.Contains(firstLine, "zsh") || strings.Contains(firstLine, "fish") { + language = "Shell" + } else if strings.Contains(firstLine, "php") { + language = "PHP" + } else if strings.Contains(firstLine, "lua") { + language = "Lua" + } + } + } + file.Close() + } + } + // If we identified a language, count its lines if language != "" { lines, err := countFileLines(path) -- cgit v1.2.3