Skip to content

Commit 0fa1ea3

Browse files
committed
rename
update
1 parent 743839d commit 0fa1ea3

File tree

10 files changed

+191
-179
lines changed

10 files changed

+191
-179
lines changed

README.md

Lines changed: 103 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,125 @@
1-
# 代码行数统计工具
1+
# CodeStatistics
22

3-
一个用Go语言编写的代码行数统计工具,可以扫描指定目录下的所有代码文件,统计各种文件类型的行数信息
3+
CodeStatistics 是一个强大的代码统计工具,用于分析项目中的代码文件并生成详细的统计报告
44

5-
## 功能特性
5+
## 功能特点
66

7-
1. **指定代码文件夹路径** - 支持扫描任意指定的目录
8-
2. **自动统计文件类型和数量** - 自动识别并统计所有文件类型
9-
3. **代码行数统计** - 统计总行数、代码行数、空行数、注释行数
10-
4. **文件类型占比** - 计算每种文件类型在项目中的占比
11-
5. **黑名单模式** - 自动排除非代码文件(图片、音视频、压缩包等)
12-
6. **CSV报告输出** - 生成详细的CSV格式统计报告
7+
- **代码行数统计**:统计项目中的总行数、代码行数、注释行数和空行数
8+
- **文件类型分析**:区分不同类型的文件(基于文件扩展名)
9+
- **灵活的过滤机制**:支持白名单和黑名单机制,可以指定要包含或排除的文件类型和目录
10+
- **报告生成**:可以生成CSV格式的统计报告
1311

14-
## 项目结构
12+
## 安装
1513

16-
- `main.go` - 主程序入口和命令行处理
17-
- `types.go` - 数据结构定义
18-
- `config.go` - 配置信息和黑名单设置
19-
- `analyzer.go` - 文件分析和目录扫描逻辑
20-
- `reporter.go` - 报告生成和输出格式化
14+
```bash
15+
# 克隆仓库
16+
git clone https://github.com/WINDOWS/CodeStatistics.git
17+
18+
# 进入项目目录
19+
cd CodeStatistics
20+
21+
# 构建项目
22+
go build
23+
```
2124

2225
## 使用方法
2326

24-
### 编译程序
2527
```bash
26-
go build .
28+
# 基本用法
29+
./CodeStatistics --path /path/to/your/code
30+
31+
# 生成CSV报告
32+
./CodeStatistics --path /path/to/your/code --output report.csv
33+
34+
# 启用注释行检测
35+
./CodeStatistics --path /path/to/your/code --comments
2736
```
2837

29-
### 运行程序
38+
## 命令行选项
39+
40+
| 选项 | 简写 | 描述 |
41+
|------|------|------|
42+
| `--path` | `-p` | 要扫描的代码目录路径 |
43+
| `--output` | `-o` | 输出CSV文件路径 |
44+
| `--comments` | `-c` | 启用注释行检测 |
45+
| `--white-add` | `-w` | 添加扩展名到内置白名单,逗号分隔 (例如: .ext1,.ext2) |
46+
| `--white-cover` | `-W` | 使用扩展名列表覆盖内置白名单,逗号分隔 |
47+
| `--black-add` | `-b` | 添加扩展名到内置黑名单,逗号分隔 |
48+
| `--black-cover` | `-B` | 使用扩展名列表覆盖内置黑名单,逗号分隔 |
49+
| `--only-white` | `-O` | 仅显示白名单文件,跳过黑名单和未知文件分析 |
50+
| `--bdir-add` | `-d` | 添加目录到内置黑名单目录,逗号分隔 (例如: dir1,dir2) |
51+
| `--bdir-cover` | `-D` | 使用目录列表覆盖内置黑名单目录,逗号分隔 |
52+
| `--show-builtin` | `-s` | 显示内置默认白名单/黑名单/黑名单目录 |
53+
| `--lf` | | 日志文件路径 |
54+
| `--ll` | | 日志级别 (debug/info/warn/error) |
55+
| `--cf` | | 控制台日志格式 (T L C M F 组合或 off\|null 禁用) |
56+
57+
## 白名单和黑名单
58+
59+
### 默认白名单(代码文件)
60+
61+
工具内置了常见的代码文件扩展名白名单,包括:
62+
- 编程语言文件:.go, .java, .c, .cpp, .py, .js, .ts 等
63+
- 模板语言文件:.vue, .svelte, .jsx, .tsx 等
64+
- 前端语言文件:.html, .htm 等
65+
- 脚本语言文件:.sh, .bash, .bat, .cmd 等
66+
67+
### 默认黑名单(非代码文件)
68+
69+
工具内置了常见的非代码文件扩展名黑名单,包括:
70+
- 数据库文件:.sql, .mysql 等
71+
- 标记和配置语言文件:.xml, .css, .json, .yaml 等
72+
- 构建和配置文件:.mk, .cmake 等
73+
- 文档文件:.md, .rst, .tex 等
74+
- 图片文件:.jpg, .png, .gif 等
75+
- 音视频文件:.mp3, .mp4, .avi 等
76+
- 压缩文件:.zip, .rar, .7z 等
77+
78+
### 默认跳过目录
79+
80+
工具默认会跳过以下目录:
81+
`.git`, `node_modules`, `vendor`, `.svn`, `.hg`, `target`, `build`, `dist`, `.idea`, `.vscode`
82+
83+
## 示例
84+
85+
### 基本分析
3086

31-
#### 基本用法
3287
```bash
33-
# 扫描当前目录
34-
./CodeStatistics
88+
./CodeStatistics --path ./myproject
89+
```
3590

36-
# 扫描指定目录
37-
./CodeStatistics -p /path/to/your/project
91+
### 生成CSV报告
3892

39-
# 指定输出文件
40-
./CodeStatistics -p /path/to/your/project -o report.csv
93+
```bash
94+
./CodeStatistics --path ./myproject --output stats.csv
4195
```
4296

43-
#### 命令行参数
44-
- `-p, --path` : 要扫描的代码目录路径 (默认: 当前目录)
45-
- `-o, --output` : 输出CSV文件路径 (默认: code_statistics.csv)
46-
- `-h, --help` : 显示帮助信息
97+
### 自定义白名单
4798

48-
#### 示例
4999
```bash
50-
# Windows
51-
./CodeStatistics.exe -p "C:\Users\YourName\Projects\MyProject" -o "C:\Reports\stats.csv"
100+
./CodeStatistics --path ./myproject --white-add .custom,.special
101+
```
102+
103+
### 自定义黑名单目录
52104

53-
# Linux/Mac
54-
./CodeStatistics -p ~/projects/myproject -o ~/reports/stats.csv
105+
```bash
106+
./CodeStatistics --path ./myproject --bdir-add cache,temp
55107
```
56108

57-
## 输出格式
58-
59-
### 控制台输出
60-
程序会在控制台显示格式化的统计表格,包含:
61-
- 文件类型
62-
- 文件数量和占比
63-
- 总行数、代码行数、空行数、注释行数
64-
- 代码占比
65-
66-
### CSV报告
67-
生成的CSV文件包含以下列:
68-
- 文件类型
69-
- 文件数量
70-
- 文件占比(%)
71-
- 总行数
72-
- 代码行数
73-
- 空行数
74-
- 注释行数
75-
- 代码占比(%)
76-
77-
## 支持的文件类型
78-
79-
工具支持识别多种编程语言的注释格式:
80-
- Go, JavaScript, TypeScript, Java, C/C++, C#, PHP, Swift, Kotlin
81-
- Python, Shell, Ruby, Perl, YAML
82-
- HTML, XML, Vue
83-
- CSS, SCSS, SASS
84-
- SQL
85-
86-
## 黑名单文件类型
87-
88-
自动排除以下类型的文件:
89-
- 图片文件: .jpg, .png, .gif, .svg 等
90-
- 音视频文件: .mp3, .mp4, .avi 等
91-
- 压缩文件: .zip, .rar, .7z 等
92-
- 文档文件: .pdf, .doc, .xls 等
93-
- 二进制文件和临时文件
94-
95-
## 跳过的目录
96-
97-
自动跳过以下目录:
98-
- .git, .svn, .hg (版本控制)
99-
- node_modules, vendor (依赖包)
100-
- target, build, dist (构建输出)
101-
- .idea, .vscode (IDE配置)
102-
103-
## 技术实现
104-
105-
- 使用结构化设计模式,每个文件不超过300行
106-
- 使用go-flags库处理命令行参数
107-
- 支持跨平台运行 (Windows, Linux, macOS)
108-
- 高效的文件遍历和内容分析
109+
## 输出示例
110+
111+
```
112+
代码统计摘要:
113+
总文件数: 120
114+
总行数: 15000
115+
代码行数: 10000 (66.7%)
116+
空行数: 3000 (20.0%)
117+
注释行数: 2000 (13.3%)
118+
119+
文件类型分布:
120+
.go: 50 文件, 5000 行 (33.3%)
121+
.js: 30 文件, 4000 行 (26.7%)
122+
.html: 20 文件, 3000 行 (20.0%)
123+
.css: 15 文件, 2000 行 (13.3%)
124+
其他: 5 文件, 1000 行 (6.7%)
125+
```

main.go

Lines changed: 9 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,15 @@
11
package main
22

33
import (
4-
"CodeStatistics/logging"
4+
"CodeStatistics/pkg/cmdutils"
5+
"CodeStatistics/pkg/logging"
56
"CodeStatistics/statistics"
67
"errors"
78
"fmt"
8-
"os"
9-
"strings"
10-
119
"github.com/jessevdk/go-flags"
10+
"os"
1211
)
1312

14-
// parseExtensionList parses comma-separated extension list
15-
func parseExtensionList(extensionStr string) []string {
16-
if extensionStr == "" {
17-
return nil
18-
}
19-
20-
extensions := strings.Split(extensionStr, ",")
21-
var result []string
22-
23-
for _, ext := range extensions {
24-
ext = strings.TrimSpace(ext)
25-
if ext == "" {
26-
continue
27-
}
28-
29-
// Ensure extension starts with dot
30-
if !strings.HasPrefix(ext, ".") {
31-
ext = "." + ext
32-
}
33-
34-
// Convert to lowercase
35-
ext = strings.ToLower(ext)
36-
result = append(result, ext)
37-
}
38-
39-
return result
40-
}
41-
42-
// parseDirectoryList parses comma-separated directory list
43-
func parseDirectoryList(dirStr string) []string {
44-
if dirStr == "" {
45-
return nil
46-
}
47-
48-
directories := strings.Split(dirStr, ",")
49-
var result []string
50-
51-
for _, dir := range directories {
52-
dir = strings.TrimSpace(dir)
53-
if dir == "" {
54-
continue
55-
}
56-
57-
// Convert to lowercase for consistency
58-
dir = strings.ToLower(dir)
59-
result = append(result, dir)
60-
}
61-
62-
return result
63-
}
64-
6513
// Options command line options
6614
type Options struct {
6715
Path string `short:"p" long:"path" description:"Code directory path to scan (default: null)"`
@@ -133,26 +81,26 @@ func main() {
13381
var whitelistConfig *statistics.WhitelistConfig
13482
if opts.WhiteAdd != "" || opts.WhiteCover != "" {
13583
whitelistConfig = &statistics.WhitelistConfig{
136-
Add: parseExtensionList(opts.WhiteAdd),
137-
Override: parseExtensionList(opts.WhiteCover),
84+
Add: cmdutils.ParseExtensionList(opts.WhiteAdd),
85+
Override: cmdutils.ParseExtensionList(opts.WhiteCover),
13886
}
13987
}
14088

14189
// Parse blacklist configuration
14290
var blacklistConfig *statistics.BlacklistConfig
14391
if opts.BlackAdd != "" || opts.BlackCover != "" {
14492
blacklistConfig = &statistics.BlacklistConfig{
145-
Add: parseExtensionList(opts.BlackAdd),
146-
Override: parseExtensionList(opts.BlackCover),
93+
Add: cmdutils.ParseExtensionList(opts.BlackAdd),
94+
Override: cmdutils.ParseExtensionList(opts.BlackCover),
14795
}
14896
}
14997

15098
// Parse directory blacklist configuration
15199
var blackDirConfig *statistics.BlackDirConfig
152100
if opts.BDirAdd != "" || opts.BDirCover != "" {
153101
blackDirConfig = &statistics.BlackDirConfig{
154-
Add: parseDirectoryList(opts.BDirAdd),
155-
Override: parseDirectoryList(opts.BDirCover),
102+
Add: cmdutils.ParseCommaStrToList(opts.BDirAdd),
103+
Override: cmdutils.ParseCommaStrToList(opts.BDirCover),
156104
}
157105
}
158106

pkg/cmdutils/comma.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package cmdutils
2+
3+
import "strings"
4+
5+
// ParseCommaStrToList 解析逗号分隔字符串为列表
6+
func ParseCommaStrToList(str string) []string {
7+
if str == "" {
8+
return nil
9+
}
10+
11+
directories := strings.Split(str, ",")
12+
var result []string
13+
14+
for _, dir := range directories {
15+
dir = strings.TrimSpace(dir)
16+
if dir == "" {
17+
continue
18+
}
19+
20+
// Convert to lowercase for consistency
21+
dir = strings.ToLower(dir)
22+
result = append(result, dir)
23+
}
24+
25+
return result
26+
}
27+
28+
// EnsurePrefix 如果数组中的某元素没有前缀,则为其添加前缀
29+
func EnsurePrefix(extList []string, prefix string) []string {
30+
if len(extList) > 0 {
31+
for i, ext := range extList {
32+
if !strings.HasPrefix(ext, prefix) {
33+
extList[i] = prefix + ext
34+
}
35+
}
36+
}
37+
return extList
38+
}
39+
40+
// ParseExtensionList 解析逗号分隔的扩展名列表
41+
func ParseExtensionList(extensionStr string) []string {
42+
result := ParseCommaStrToList(extensionStr)
43+
result = EnsurePrefix(result, ".")
44+
return result
45+
}

pkg/cmdutils/cover.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cmdutils
2+
3+
// BuildAddOrCoverMap 构建映射表(用于白名单或黑名单)
4+
func BuildAddOrCoverMap(defaultList, addList, coverList []string) map[string]bool {
5+
result := make(map[string]bool)
6+
7+
// 如果有覆盖配置,优先使用覆盖配置
8+
if len(coverList) > 0 {
9+
for _, ext := range coverList {
10+
result[ext] = true
11+
}
12+
} else {
13+
// 否则使用默认 + 追加
14+
for _, ext := range defaultList {
15+
result[ext] = true
16+
}
17+
for _, ext := range addList {
18+
result[ext] = true
19+
}
20+
}
21+
22+
return result
23+
}
File renamed without changes.

statistics/analyzer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package statistics
22

33
import (
4-
"CodeStatistics/logging"
4+
"CodeStatistics/pkg/logging"
55
"bufio"
66
"os"
77
"path/filepath"

0 commit comments

Comments
 (0)