AI-Infra-Guard / common /utils /code_language.go
AbdulElahGwaith's picture
Upload folder using huggingface_hub
ffb6330 verified
package utils
import (
"io/fs"
"path/filepath"
"sort"
"strings"
"sync"
)
func classifyLanguage(ext string) string {
// 扩展名与编程语言映射表(可根据需求扩展)
var extToLang = map[string]string{
".go": "Go",
".py": "Python",
".java": "Java",
".rs": "Rust",
".php": "PHP",
".rb": "Ruby",
".swift": "Swift",
".c": "C",
".h": "C",
".cpp": "C++",
".hpp": "C++",
".js": "JavaScript",
".ts": "TypeScript",
".html": "HTML",
".css": "CSS",
".sql": "SQL",
".sh": "Shell",
}
if lang, exists := extToLang[ext]; exists {
return lang
}
return ""
}
func AnalyzeLanguage(dir string) map[string]int {
var wg sync.WaitGroup
mu := sync.Mutex{}
stats := make(map[string]int)
filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
if err != nil || d.IsDir() {
return nil
}
wg.Add(1)
go func() {
defer wg.Done()
ext := strings.ToLower(filepath.Ext(path))
lang := classifyLanguage(ext)
if lang == "" {
return
}
mu.Lock()
stats[lang]++
mu.Unlock()
}()
return nil
})
wg.Wait()
return stats
}
type LanguageCount struct {
Language string
Count int
}
func GetTopLanguage(stats map[string]int) string {
if len(stats) == 0 {
return "Other"
}
// 将 map 转换为结构体切片
var list []LanguageCount
for lang, count := range stats {
list = append(list, LanguageCount{Language: lang, Count: count})
}
// 按文件数量降序排序
sort.Slice(list, func(i, j int) bool {
return list[i].Count > list[j].Count // 降序排列
})
return list[0].Language
}