|
| 1 | +package readme |
| 2 | + |
| 3 | +import ( |
| 4 | + "bufio" |
| 5 | + "bytes" |
| 6 | + "fmt" |
| 7 | + "io" |
| 8 | + "io/ioutil" |
| 9 | + "os" |
| 10 | + "strings" |
| 11 | + |
| 12 | + "github.com/openset/leetcode/internal/base" |
| 13 | + "github.com/openset/leetcode/internal/leetcode" |
| 14 | +) |
| 15 | + |
| 16 | +var CmdReadme = &base.Command{ |
| 17 | + Run: runReadme, |
| 18 | + UsageLine: "readme", |
| 19 | + Short: "build README.md file", |
| 20 | + Long: "build README.md file.", |
| 21 | +} |
| 22 | + |
| 23 | +const ( |
| 24 | + filename = "README.md" |
| 25 | + lineNum = 12 |
| 26 | +) |
| 27 | + |
| 28 | +func runReadme(cmd *base.Command, args []string) { |
| 29 | + if len(args) != 0 { |
| 30 | + cmd.Usage() |
| 31 | + } |
| 32 | + wb := bytes.NewBuffer(nil) |
| 33 | + f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0666) |
| 34 | + base.CheckErr(err) |
| 35 | + defer f.Close() |
| 36 | + rb := bufio.NewReader(f) |
| 37 | + for ln := 0; ln < lineNum; ln++ { |
| 38 | + line, _, err := rb.ReadLine() |
| 39 | + if err == io.EOF { |
| 40 | + break |
| 41 | + } |
| 42 | + base.CheckErr(err) |
| 43 | + wb.Write(line) |
| 44 | + wb.WriteString("\n") |
| 45 | + } |
| 46 | + writeProblems(wb) |
| 47 | + err = ioutil.WriteFile(filename, wb.Bytes(), 0644) |
| 48 | + base.CheckErr(err) |
| 49 | +} |
| 50 | + |
| 51 | +func writeProblems(wb *bytes.Buffer) { |
| 52 | + problems := leetcode.ProblemsAll() |
| 53 | + problemsSet := make(map[int]string) |
| 54 | + maxId := 0 |
| 55 | + for _, problem := range problems.StatStatusPairs { |
| 56 | + id := problem.Stat.FrontendQuestionId |
| 57 | + title := strings.TrimSpace(problem.Stat.QuestionTitle) |
| 58 | + slug := problem.Stat.QuestionTitleSlug |
| 59 | + levelName := problem.Difficulty.LevelName() |
| 60 | + format := "| %d | [%s](https://leetcode.com/problems/%s) | [Go](https://github.com/openset/leetcode/tree/master/solution/%s) | %s |\n" |
| 61 | + problemsSet[id] = fmt.Sprintf(format, id, title, slug, slug, levelName) |
| 62 | + if id > maxId { |
| 63 | + maxId = id |
| 64 | + } |
| 65 | + } |
| 66 | + for i := 0; i <= maxId; i++ { |
| 67 | + if row, ok := problemsSet[i]; ok { |
| 68 | + wb.WriteString(row) |
| 69 | + } |
| 70 | + } |
| 71 | +} |
0 commit comments