• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mlange-42 / modo / 12916744138

22 Jan 2025 08:44PM CUT coverage: 61.572%. Remained the same
12916744138

push

github

web-flow
Package for commands, extend CLI help (#100)

* move commands to package
* improve file structure
* remove commented out code
* add guide link to CLI help
* tweak user guide

987 of 1603 relevant lines covered (61.57%)

29.41 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/format/mdbook.go
1
package format
2

3
import (
4
        "fmt"
5
        "io"
6
        "io/fs"
7
        "os"
8
        "path"
9
        "strings"
10
        "text/template"
11

12
        "github.com/mlange-42/modo/assets"
13
        "github.com/mlange-42/modo/document"
14
)
15

16
type MdBookFormatter struct{}
17

18
func (f *MdBookFormatter) Render(docs *document.Docs, config *document.Config) error {
×
19
        return document.Render(docs, config, f)
×
20
}
×
21

22
func (f *MdBookFormatter) ProcessMarkdown(element any, text string, proc *document.Processor) (string, error) {
×
23
        return text, nil
×
24
}
×
25

26
func (f *MdBookFormatter) WriteAuxiliary(p *document.Package, dir string, proc *document.Processor) error {
×
27
        if err := f.writeSummary(p, dir, proc); err != nil {
×
28
                return err
×
29
        }
×
30
        if err := f.writeToml(p, dir, proc); err != nil {
×
31
                return err
×
32
        }
×
33
        if err := f.writeCss(dir, proc); err != nil {
×
34
                return err
×
35
        }
×
36
        return nil
×
37
}
38

39
func (f *MdBookFormatter) ToFilePath(p string, kind string) (string, error) {
×
40
        if kind == "package" || kind == "module" {
×
41
                return path.Join(p, "_index.md"), nil
×
42
        }
×
43
        if len(p) == 0 {
×
44
                return p, nil
×
45
        }
×
46
        return p + ".md", nil
×
47
}
48

49
func (f *MdBookFormatter) ToLinkPath(p string, kind string) (string, error) {
×
50
        return f.ToFilePath(p, kind)
×
51
}
×
52

53
type summary struct {
54
        Summary   string
55
        Packages  string
56
        Modules   string
57
        Structs   string
58
        Traits    string
59
        Functions string
60
}
61

62
func (f *MdBookFormatter) writeSummary(p *document.Package, dir string, proc *document.Processor) error {
×
63
        summary, err := f.renderSummary(p, proc)
×
64
        if err != nil {
×
65
                return err
×
66
        }
×
67
        summaryPath := path.Join(dir, p.GetFileName(), "SUMMARY.md")
×
68
        if proc.Config.DryRun {
×
69
                return nil
×
70
        }
×
71
        if err := os.WriteFile(summaryPath, []byte(summary), 0644); err != nil {
×
72
                return err
×
73
        }
×
74
        return nil
×
75
}
76

77
func (f *MdBookFormatter) renderSummary(p *document.Package, proc *document.Processor) (string, error) {
×
78
        s := summary{}
×
79

×
80
        pkgFile, err := f.ToLinkPath("", "package")
×
81
        if err != nil {
×
82
                return "", err
×
83
        }
×
84
        s.Summary = fmt.Sprintf("[`%s`](%s)", p.GetName(), pkgFile)
×
85

×
86
        pkgs := strings.Builder{}
×
87
        for _, p := range p.Packages {
×
88
                if err := f.renderPackage(p, proc.Template, nil, &pkgs); err != nil {
×
89
                        return "", err
×
90
                }
×
91
        }
92
        s.Packages = pkgs.String()
×
93

×
94
        mods := strings.Builder{}
×
95
        for _, m := range p.Modules {
×
96
                if err := f.renderModule(m, nil, &mods); err != nil {
×
97
                        return "", err
×
98
                }
×
99
        }
100
        s.Modules = mods.String()
×
101

×
102
        elems := strings.Builder{}
×
103
        for _, elem := range p.Structs {
×
104
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
105
                        return "", err
×
106
                }
×
107
        }
108
        s.Structs = elems.String()
×
109
        elems = strings.Builder{}
×
110
        for _, elem := range p.Traits {
×
111
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
112
                        return "", err
×
113
                }
×
114
        }
115
        s.Traits = elems.String()
×
116
        elems = strings.Builder{}
×
117
        for _, elem := range p.Functions {
×
118
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
119
                        return "", err
×
120
                }
×
121
        }
122
        s.Functions = elems.String()
×
123

×
124
        b := strings.Builder{}
×
125
        if err := proc.Template.ExecuteTemplate(&b, "mdbook_summary.md", &s); err != nil {
×
126
                return "", err
×
127
        }
×
128

129
        return b.String(), nil
×
130
}
131

132
func (f *MdBookFormatter) renderPackage(pkg *document.Package, t *template.Template, linkPath []string, out *strings.Builder) error {
×
133
        newPath := append([]string{}, linkPath...)
×
134
        newPath = append(newPath, pkg.GetFileName())
×
135

×
136
        pkgFile, err := f.ToLinkPath(path.Join(newPath...), "package")
×
137
        if err != nil {
×
138
                return err
×
139
        }
×
140

141
        fmt.Fprintf(out, "%-*s- [`%s`](%s))\n", 2*len(linkPath), "", pkg.GetName(), pkgFile)
×
142
        for _, p := range pkg.Packages {
×
143
                if err := f.renderPackage(p, t, newPath, out); err != nil {
×
144
                        return err
×
145
                }
×
146
        }
147
        for _, m := range pkg.Modules {
×
148
                if err := f.renderModule(m, newPath, out); err != nil {
×
149
                        return err
×
150
                }
×
151
        }
152

153
        pathStr := path.Join(newPath...)
×
154
        childDepth := 2*(len(newPath)-1) + 2
×
155
        for _, elem := range pkg.Structs {
×
156
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
157
                        return err
×
158
                }
×
159
        }
160
        for _, elem := range pkg.Traits {
×
161
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
162
                        return err
×
163
                }
×
164
        }
165
        for _, elem := range pkg.Functions {
×
166
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
167
                        return err
×
168
                }
×
169
        }
170

171
        return nil
×
172
}
173

174
func (f *MdBookFormatter) renderModule(mod *document.Module, linkPath []string, out *strings.Builder) error {
×
175
        newPath := append([]string{}, linkPath...)
×
176
        newPath = append(newPath, mod.GetFileName())
×
177

×
178
        pathStr := path.Join(newPath...)
×
179

×
180
        modFile, err := f.ToLinkPath(pathStr, "module")
×
181
        if err != nil {
×
182
                return err
×
183
        }
×
184
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", 2*(len(newPath)-1), "", mod.GetName(), modFile)
×
185

×
186
        childDepth := 2*(len(newPath)-1) + 2
×
187
        for _, elem := range mod.Structs {
×
188
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
189
                        return err
×
190
                }
×
191
        }
192
        for _, elem := range mod.Traits {
×
193
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
194
                        return err
×
195
                }
×
196
        }
197
        for _, elem := range mod.Functions {
×
198
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
199
                        return err
×
200
                }
×
201
        }
202
        return nil
×
203
}
204

205
func (f *MdBookFormatter) renderModuleMember(mem document.Named, pathStr string, depth int, out io.Writer) error {
×
206
        memPath, err := f.ToLinkPath(path.Join(pathStr, mem.GetFileName(), ""), "")
×
207
        if err != nil {
×
208
                return err
×
209
        }
×
210
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", depth, "", mem.GetName(), memPath)
×
211
        return nil
×
212
}
213

214
func (f *MdBookFormatter) writeToml(p *document.Package, dir string, proc *document.Processor) error {
×
215
        toml, err := f.renderToml(p, proc.Template)
×
216
        if err != nil {
×
217
                return err
×
218
        }
×
219
        if proc.Config.DryRun {
×
220
                return nil
×
221
        }
×
222
        tomlPath := path.Join(dir, "book.toml")
×
223
        if err := os.WriteFile(tomlPath, []byte(toml), 0644); err != nil {
×
224
                return err
×
225
        }
×
226
        return nil
×
227
}
228

229
func (f *MdBookFormatter) renderToml(p *document.Package, t *template.Template) (string, error) {
×
230
        b := strings.Builder{}
×
231
        if err := t.ExecuteTemplate(&b, "book.toml", p); err != nil {
×
232
                return "", err
×
233
        }
×
234
        return b.String(), nil
×
235
}
236

237
func (f *MdBookFormatter) writeCss(dir string, proc *document.Processor) error {
×
238
        cssDir := path.Join(dir, "css")
×
239
        if !proc.Config.DryRun {
×
240
                if err := os.MkdirAll(cssDir, os.ModePerm); err != nil && !os.IsExist(err) {
×
241
                        return err
×
242
                }
×
243
        }
244
        css, err := fs.ReadFile(assets.CSS, "css/mdbook.css")
×
245
        if err != nil {
×
246
                return err
×
247
        }
×
248
        if !proc.Config.DryRun {
×
249
                if err := os.WriteFile(path.Join(cssDir, "custom.css"), css, 0644); err != nil {
×
250
                        return err
×
251
                }
×
252
        }
253
        return nil
×
254
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc