@@ -3,30 +3,17 @@ package update
33import (
44 "bytes"
55 "fmt"
6+ "github.com/ppsteven/leetcode-tool/internal/helper"
7+ "github.com/ppsteven/leetcode-tool/internal/meta"
68 "github.com/ppsteven/leetcode-tool/pkg/leetcode"
79 "io/ioutil"
810 "log"
911 "os"
1012 "path/filepath"
11- "regexp"
1213 "sort"
13- "strconv"
1414 "strings"
1515 "sync"
1616 "text/template"
17-
18- "github.com/bmatcuk/doublestar/v2"
19- )
20-
21- var (
22- indexRegex = regexp .MustCompile ("@index (.+)" )
23- titleRegex = regexp .MustCompile ("@title (.+)" )
24- difficultyRegex = regexp .MustCompile ("@difficulty (.+)" )
25- tagsRegex = regexp .MustCompile ("@tags (.+)" )
26- draftRegex = regexp .MustCompile ("@draft (.+)" )
27- linkRegex = regexp .MustCompile ("@link (.+)" )
28- frontendIdRegex = regexp .MustCompile ("@frontendId (.+)" )
29- solvedRegex = regexp .MustCompile ("@solved (.+)" )
3017)
3118
3219const (
@@ -38,155 +25,39 @@ var (
3825 tagTpl = template .Must (template .New ("tag" ).Parse (tagStr ))
3926)
4027
41- type Meta struct {
42- Index string
43- Title string
44- Difficulty string
45- Tags []string
46- Draft bool
47- Fp string
48- Link string
49- FrontendId string
50- Ext string
51- Completed string
52- }
53-
54- type Metas []* Meta
55-
56- func (a Metas ) Len () int { return len (a ) }
57- func (a Metas ) Swap (i , j int ) { a [i ], a [j ] = a [j ], a [i ] }
58- func (a Metas ) Less (i , j int ) bool {
59- iIndex , _ := strconv .Atoi (a [i ].Index )
60- jIndex , _ := strconv .Atoi (a [j ].Index )
61- return iIndex < jIndex
62- }
28+ type (
29+ Meta = meta.Meta
30+ Metas = meta.Metas
31+ )
6332
6433type TableData struct {
6534 Metas Metas
6635 Total int
6736}
6837
69- type TagMetas map [string ](Metas )
70-
71- func addMeta (tagMetas TagMetas , meta * Meta ) {
72- if meta == nil {
73- return
74- }
75- for _ , tag := range meta .Tags {
76- if _ , ok := tagMetas [tag ]; ! ok {
77- tagMetas [tag ] = make (Metas , 0 )
78- }
79- tagMetas [tag ] = append (tagMetas [tag ], meta )
80- }
81- tagMetas ["all" ] = append (tagMetas ["all" ], meta )
82- }
83-
84- func findTag (content []byte , r * regexp.Regexp ) string {
85- res := r .FindSubmatch (content )
86- if len (res ) < 2 {
87- return ""
88- }
89- return string (res [1 ])
90- }
91-
92- func findMeta (content []byte , fp string ) * Meta {
93- draft := findTag (content , draftRegex ) == "" || findTag (content , draftRegex ) == "true"
94- if draft {
95- return nil
96- }
97- tags := strings .Split (findTag (content , tagsRegex ), "," )
98- solved := false
99- if strings .ToLower (findTag (content , solvedRegex )) == "true" {
100- solved = true
101- }
102-
103- return & Meta {
104- Index : findTag (content , indexRegex ),
105- Title : findTag (content , titleRegex ),
106- Difficulty : findTag (content , difficultyRegex ),
107- Tags : tags ,
108- Draft : draft ,
109- Fp : filepath .Dir (fp ),
110- Link : findTag (content , linkRegex ),
111- FrontendId : findTag (content , frontendIdRegex ),
112- Ext : filepath .Ext (fp ),
113- Completed : genCompleted (solved , filepath .Ext (fp )),
114- }
115- }
116-
117- func genCompleted (isCompleted bool , ext string ) string {
118- if isCompleted {
119- return ext [1 :] + " ✅"
120- }
121- return ext [1 :] + " ❎"
122- }
123-
12438func genTable (data * TableData ) string {
12539 var bf bytes.Buffer
12640 sort .Sort (data .Metas )
12741 tableTpl .Execute (& bf , data )
12842 return bf .String ()
12943}
13044
131- func fileExists (path string ) bool {
132- _ , err := os .Stat (path )
133- return ! os .IsNotExist (err )
134- }
135-
136- func isDirectory (path string ) (bool , error ) {
137- fileInfo , err := os .Stat (path )
138- if err != nil {
139- return false , err
140- }
141- return fileInfo .IsDir (), err
142- }
143-
14445func Run () {
145- files , err := doublestar .Glob ("./solve/**/*" )
146- if err != nil {
147- log .Fatal (err )
148- }
149- tagMetas := make (TagMetas , 0 )
150- tagMetas ["all" ] = make (Metas , 0 )
151- wg := sync.WaitGroup {}
152- var lock sync.Mutex
153- for _ , fp := range files {
154- if isFolder , _ := isDirectory (fp ); isFolder {
155- continue
156- }
157-
158- if strings .HasSuffix (fp , ".md" ) {
159- continue
160- }
161- wg .Add (1 )
162- fp := fp
163- go func () {
164- content , err := ioutil .ReadFile (fp )
165- if err != nil {
166- log .Fatal (err )
167- }
168- meta := findMeta (content , fp )
169- if meta != nil {
170- lock .Lock ()
171- addMeta (tagMetas , meta )
172- lock .Unlock ()
173- }
174- wg .Done ()
175- }()
176- }
177- wg .Wait ()
46+ tagMetas := meta .GetTagMetas ()
17847
179- if ! fileExists (toc ) {
48+ if ! helper . FileExists (toc ) {
18049 _ = os .MkdirAll (toc , 0755 )
18150 }
18251
52+ wg := sync.WaitGroup {}
53+
18354 for tag , metas := range tagMetas {
18455 fp := filepath .Join (toc , fmt .Sprintf ("%s.md" , tag ))
18556 wg .Add (1 )
18657 metas := metas
18758 tag := tag
18859 go func () {
189- if ! fileExists (fp ) {
60+ if ! helper . FileExists (fp ) {
19061 var content bytes.Buffer
19162 err := tagTpl .Execute (& content , & leetcode.Tag {Name : tag })
19263 if err != nil {
0 commit comments