File size: 1,638 Bytes
ffb6330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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
}