diff --git a/pkg/gh/gh.go b/pkg/gh/gh.go index a56fd3a..ad08893 100644 --- a/pkg/gh/gh.go +++ b/pkg/gh/gh.go @@ -3,11 +3,8 @@ package gh import ( "bytes" "errors" - "fmt" "io" "log" - "net/url" - "path" "slices" "strings" "time" @@ -19,21 +16,23 @@ const ( GhURL = "https://github.com/" ) -type ConfigRepos []struct { +type ConfigRepos []ConfigRepo + +type ConfigRepo struct { Type string `yaml:"type"` Repos []Repository `yaml:"repo"` Qs Qs `yaml:"qs,omitempty"` - Md bool `yaml:"md,omitempty"` + // Md bool `yaml:"md,omitempty"` } type Repository struct { LastUpdated time.Time - Doc string `yaml:"doc,omitempty"` - URL string `yaml:"url"` + Doc string `yaml:"doc,omitempty"` // 该repo的官方文档URL + URL string `yaml:"url"` // 该repo的gh URL Name string `yaml:"name,omitempty"` User string - Des string `yaml:"des,omitempty"` - Tag string // used to mark Type + Des string `yaml:"des,omitempty"` // 描述 + Tag string `yaml:"tag"` // used to mark Type Qs Qs `yaml:"qs,omitempty"` Cmd Cmd `yaml:"cmd,omitempty"` // Pix []string `yaml:"pix"` @@ -42,7 +41,7 @@ type Repository struct { // Des string `yaml:"des,omitempty"` // } `yaml:"use,omitempty"` Qq `yaml:"qq,omitempty"` - IsStar bool + IsStar bool // 用来标识gh上star的repo } type Qq []struct { @@ -187,49 +186,49 @@ func (rs Repos) QueryReposByTag(tag string) Repos { func (cr *ConfigRepos) FilterReposMD() ConfigRepos { var filteredConfig ConfigRepos for _, crv := range *cr { - if crv.Md { - var filteredRepos []Repository - for _, repo := range crv.Repos { - if repo.Qs != nil { - // repo.Pix = addMarkdownPicFormat(repo.Pix) - filteredRepos = append(filteredRepos, repo) - } + // if crv.Md { + var filteredRepos []Repository + for _, repo := range crv.Repos { + if repo.Qs != nil { + // repo.Pix = addMarkdownPicFormat(repo.Pix) + filteredRepos = append(filteredRepos, repo) } - crv.Repos = filteredRepos - filteredConfig = append(filteredConfig, crv) } + crv.Repos = filteredRepos + filteredConfig = append(filteredConfig, crv) + // } } return filteredConfig } -func (cr *ConfigRepos) FilterWorksMD() ConfigRepos { - var filteredConfig ConfigRepos - for _, crv := range *cr { - if crv.Md { - var filteredRepos []Repository - crv.Repos = filteredRepos - filteredConfig = append(filteredConfig, crv) - } - } - return filteredConfig -} +// func (cr *ConfigRepos) FilterWorksMD() ConfigRepos { +// var filteredConfig ConfigRepos +// for _, crv := range *cr { +// // if crv.Md { +// var filteredRepos []Repository +// crv.Repos = filteredRepos +// filteredConfig = append(filteredConfig, crv) +// // } +// } +// return filteredConfig +// } // GetFileNameFromURL 从给定的 URL 中提取并返回文件名。 -func GetFileNameFromURL(urlString string) (string, error) { - // 解析 URL - parsedURL, err := url.Parse(urlString) - if err != nil { - return "", fmt.Errorf("error parsing URL: %v", err) - } - - // 获取路径 - urlPath := parsedURL.Path - - // 获取文件名 - fileName := path.Base(urlPath) - - return fileName, nil -} +// func GetFileNameFromURL(urlString string) (string, error) { +// // 解析 URL +// parsedURL, err := url.Parse(urlString) +// if err != nil { +// return "", fmt.Errorf("error parsing URL: %v", err) +// } +// +// // 获取路径 +// urlPath := parsedURL.Path +// +// // 获取文件名 +// fileName := path.Base(urlPath) +// +// return fileName, nil +// } // 用来渲染pic // func addMarkdownPicFormat(URLs []string) []string { diff --git a/yaml2md/cmd/gh.go b/yaml2md/cmd/gh.go index c60a63f..610b500 100644 --- a/yaml2md/cmd/gh.go +++ b/yaml2md/cmd/gh.go @@ -95,43 +95,37 @@ var ghCmd = &cobra.Command{ dfo := gh.NewConfigRepos(f) df := dfo.FilterReposMD() - // tmpl := template.Must(template.New("").Parse(ghTpl)) - // - // file, err := os.Create(targetFile) - // if err != nil { - // log.Fatal(err) - // } - // defer file.Close() - // - // err = tmpl.Execute(file, df) - // if err != nil { - // log.Fatal(err) - // } + + // 清理掉 Qs == nil 的 Type + dfr := FilterRepos(df) var res strings.Builder - for _, d := range df { - if d.Md { - res.WriteString(fmt.Sprintf("## %s \n", d.Type)) - if d.Qs != nil { - res.WriteString(addMarkdownQsFormat(d.Qs)) + for _, d := range dfr { + + res.WriteString(fmt.Sprintf("## %s \n", d.Type)) + if d.Qs != nil { + res.WriteString(addMarkdownQsFormat(d.Qs)) + } + + for _, repo := range d.Repos { + repoName, f := strings.CutPrefix(repo.URL, gh.GhURL) + if !f { + repoName = "" } - for _, repo := range d.Repos { - res.WriteString(fmt.Sprintf("\n\n### %s\n\n", repo.URL)) - if repo.Qs != nil { - res.WriteString(addMarkdownQsFormat(repo.Qs)) - } - if repo.Qq != nil { - for _, s := range repo.Qq { - if s.Qs != nil { - res.WriteString(fmt.Sprintf("\n\n#### %s \n\n", s.Topic)) - res.WriteString(addMarkdownQsFormat(s.Qs)) - } + res.WriteString(fmt.Sprintf("\n\n### [%s](%s)\n\n", repoName, repo.URL)) + if repo.Qs != nil { + res.WriteString(addMarkdownQsFormat(repo.Qs)) + } + if repo.Qq != nil { + for _, s := range repo.Qq { + if s.Qs != nil { + res.WriteString(fmt.Sprintf("\n\n#### %s \n\n", s.Topic)) + res.WriteString(addMarkdownQsFormat(s.Qs)) } } } - } } @@ -167,6 +161,29 @@ func addMarkdownQsFormat(qs gh.Qs) string { return builder.String() } +// FilterRepos 过滤掉Repo中Qs为nil的ConfigRepos +func FilterRepos(configRepos gh.ConfigRepos) (filteredRepos gh.ConfigRepos) { + for _, repoGroup := range configRepos { + // 过滤掉qs为nil的Repository + filteredGroup := gh.ConfigRepo{ + Type: repoGroup.Type, + Repos: make([]gh.Repository, 0), + Qs: make(gh.Qs, 0), + } + filteredGroup.Type = repoGroup.Type + for _, repo := range repoGroup.Repos { + if repo.Qs != nil { // 假设Qs的零值是Qs{} + filteredGroup.Repos = append(filteredGroup.Repos, repo) + } + } + if len(filteredGroup.Repos) > 0 { + // 只有当过滤后的Repositories不为空时,才添加到结果中 + filteredRepos = append(filteredRepos, filteredGroup) + } + } + return filteredRepos +} + func init() { rootCmd.AddCommand(ghCmd)