/
parse.go
96 lines (86 loc) · 2.44 KB
/
parse.go
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
94
95
96
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package mdicons
import (
"bytes"
"fmt"
"go/format"
"os"
"sort"
)
func Parse(mdicons string, pkg string, genData, genDataTest bool, outSize float32) error {
f, err := os.Open(mdicons)
if err != nil {
return fmt.Errorf("%v\n\nDid you pass a directory to -mdicons <directory>?", err)
}
defer f.Close()
infos, err := f.Readdir(-1)
if err != nil {
return err
}
names := []string{}
for _, info := range infos {
if !info.IsDir() {
continue
}
name := info.Name()
if name[0] == '.' {
continue
}
names = append(names, name)
}
sort.Strings(names)
out := &bytes.Buffer{}
// Generate data.go.
if genData {
out.WriteString(fmt.Sprintf("// generated by mdicons; DO NOT EDIT\n\npackage %s\n\n", pkg))
stats := Statistics{}
for _, name := range names {
if stat, err := ParseDir(mdicons, name, outSize, out); err != nil {
return err
} else {
stats = stats.Add(stat)
}
}
fmt.Fprintf(out,
"// In total, %d SVG bytes in %d files (%d PNG bytes at 24px * 24px,\n"+
"// %d PNG bytes at 48px * 48px) converted to %d IconVG bytes.\n",
stats.TotalSVGBytes, stats.TotalFiles, stats.TotalPNG24Bytes, stats.TotalPNG48Bytes, stats.TotalIVGBytes)
if len(stats.Failures) != 0 {
out.WriteString("\n/*\nFAILURES:\n\n")
for _, failure := range stats.Failures {
out.WriteString(failure)
out.WriteByte('\n')
}
out.WriteString("\n*/")
}
raw := out.Bytes()
formatted, err := format.Source(raw)
if err != nil {
return fmt.Errorf("gofmt failed: %v\n\nGenerated code:\n%s", err, raw)
}
if err := os.WriteFile("data.go", formatted, 0644); err != nil {
return fmt.Errorf("WriteFile failed: %s", err)
}
// Generate data_test.go.
if genDataTest {
out.Reset()
out.WriteString(fmt.Sprintf("// generated by mdicons; DO NOT EDIT\n\npackage %s\n\n", pkg))
out.WriteString("var list = []struct{ name string; data []byte } {\n")
for _, v := range stats.VarNames {
fmt.Fprintf(out, "{%q, %s},\n", v, v)
}
out.WriteString("}\n\n")
raw := out.Bytes()
formatted, err := format.Source(raw)
if err != nil {
return fmt.Errorf("gofmt failed: %v\n\nGenerated code:\n%s", err, raw)
}
if err := os.WriteFile("data_test.go", formatted, 0644); err != nil {
return fmt.Errorf("WriteFile failed: %s", err)
}
}
}
return nil
}