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

mlange-42 / modo / 12829003556

17 Jan 2025 12:24PM CUT coverage: 56.552% (+20.0%) from 36.563%
12829003556

Pull #54

github

web-flow
Merge 1a1b11cc2 into 41ff6f833
Pull Request #54: More unit tests

32 of 49 new or added lines in 4 files covered. (65.31%)

13 existing lines in 2 files now uncovered.

725 of 1282 relevant lines covered (56.55%)

6.69 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) ProcessMarkdown(element any, text string, proc *document.Processor) (string, error) {
×
19
        return text, nil
×
20
}
×
21

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

35
func (f *MdBookFormatter) ToFilePath(p string, kind string) (string, error) {
×
36
        if kind == "package" || kind == "module" {
×
37
                return path.Join(p, "_index.md"), nil
×
38
        }
×
39
        return p + ".md", nil
×
40
}
41

42
func (f *MdBookFormatter) ToLinkPath(p string, kind string) (string, error) {
×
43
        return f.ToFilePath(p, kind)
×
44
}
×
45

46
type summary struct {
47
        Summary   string
48
        Packages  string
49
        Modules   string
50
        Structs   string
51
        Traits    string
52
        Functions string
53
}
54

55
func (f *MdBookFormatter) writeSummary(p *document.Package, dir string, proc *document.Processor) error {
×
56
        summary, err := f.renderSummary(p, proc)
×
57
        if err != nil {
×
58
                return err
×
59
        }
×
60
        summaryPath := path.Join(dir, p.GetFileName(), "SUMMARY.md")
×
61
        if err := os.WriteFile(summaryPath, []byte(summary), 0666); err != nil {
×
62
                return err
×
63
        }
×
64
        return nil
×
65
}
66

67
func (f *MdBookFormatter) renderSummary(p *document.Package, proc *document.Processor) (string, error) {
×
68
        s := summary{}
×
69

×
70
        pkgFile, err := f.ToLinkPath("", "package")
×
71
        if err != nil {
×
72
                return "", err
×
73
        }
×
74
        s.Summary = fmt.Sprintf("[`%s`](%s)", p.GetName(), pkgFile)
×
75

×
76
        pkgs := strings.Builder{}
×
77
        for _, p := range p.Packages {
×
78
                if err := f.renderPackage(p, proc.Template, nil, &pkgs); err != nil {
×
79
                        return "", err
×
80
                }
×
81
        }
82
        s.Packages = pkgs.String()
×
83

×
84
        mods := strings.Builder{}
×
85
        for _, m := range p.Modules {
×
86
                if err := f.renderModule(m, nil, &mods); err != nil {
×
87
                        return "", err
×
88
                }
×
89
        }
90
        s.Modules = mods.String()
×
91

×
92
        elems := strings.Builder{}
×
93
        for _, elem := range p.Structs {
×
94
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
95
                        return "", err
×
96
                }
×
97
        }
98
        s.Structs = elems.String()
×
99
        elems = strings.Builder{}
×
100
        for _, elem := range p.Traits {
×
101
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
102
                        return "", err
×
103
                }
×
104
        }
105
        s.Traits = elems.String()
×
106
        elems = strings.Builder{}
×
107
        for _, elem := range p.Functions {
×
108
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
109
                        return "", err
×
110
                }
×
111
        }
112
        s.Functions = elems.String()
×
113

×
114
        b := strings.Builder{}
×
115
        if err := proc.Template.ExecuteTemplate(&b, "mdbook_summary.md", &s); err != nil {
×
116
                return "", err
×
117
        }
×
118

119
        return b.String(), nil
×
120
}
121

122
func (f *MdBookFormatter) renderPackage(pkg *document.Package, t *template.Template, linkPath []string, out *strings.Builder) error {
×
123
        newPath := append([]string{}, linkPath...)
×
124
        newPath = append(newPath, pkg.GetFileName())
×
125

×
126
        pkgFile, err := f.ToLinkPath(path.Join(newPath...), "package")
×
127
        if err != nil {
×
128
                return err
×
129
        }
×
130

131
        fmt.Fprintf(out, "%-*s- [`%s`](%s))\n", 2*len(linkPath), "", pkg.GetName(), pkgFile)
×
132
        for _, p := range pkg.Packages {
×
133
                if err := f.renderPackage(p, t, newPath, out); err != nil {
×
134
                        return err
×
135
                }
×
136
        }
137
        for _, m := range pkg.Modules {
×
138
                if err := f.renderModule(m, newPath, out); err != nil {
×
139
                        return err
×
140
                }
×
141
        }
142

143
        pathStr := path.Join(newPath...)
×
144
        childDepth := 2*(len(newPath)-1) + 2
×
145
        for _, elem := range pkg.Structs {
×
146
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
147
                        return err
×
148
                }
×
149
        }
150
        for _, elem := range pkg.Traits {
×
151
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
152
                        return err
×
153
                }
×
154
        }
155
        for _, elem := range pkg.Functions {
×
156
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
157
                        return err
×
158
                }
×
159
        }
160

161
        return nil
×
162
}
163

164
func (f *MdBookFormatter) renderModule(mod *document.Module, linkPath []string, out *strings.Builder) error {
×
165
        newPath := append([]string{}, linkPath...)
×
166
        newPath = append(newPath, mod.GetFileName())
×
167

×
168
        pathStr := path.Join(newPath...)
×
169

×
170
        modFile, err := f.ToLinkPath(pathStr, "module")
×
171
        if err != nil {
×
172
                return err
×
173
        }
×
174
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", 2*(len(newPath)-1), "", mod.GetName(), modFile)
×
175

×
176
        childDepth := 2*(len(newPath)-1) + 2
×
177
        for _, elem := range mod.Structs {
×
178
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
179
                        return err
×
180
                }
×
181
        }
182
        for _, elem := range mod.Traits {
×
183
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
184
                        return err
×
185
                }
×
186
        }
187
        for _, elem := range mod.Functions {
×
188
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
189
                        return err
×
190
                }
×
191
        }
192
        return nil
×
193
}
194

195
func (f *MdBookFormatter) renderModuleMember(mem document.Named, pathStr string, depth int, out io.Writer) error {
×
196
        memPath, err := f.ToLinkPath(path.Join(pathStr, mem.GetFileName(), ""), "")
×
197
        if err != nil {
×
198
                return err
×
199
        }
×
200
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", depth, "", mem.GetName(), memPath)
×
201
        return nil
×
202
}
203

204
func (f *MdBookFormatter) writeToml(p *document.Package, dir string, t *template.Template) error {
×
205
        toml, err := f.renderToml(p, t)
×
206
        if err != nil {
×
207
                return err
×
208
        }
×
209
        tomlPath := path.Join(dir, "book.toml")
×
210
        if err := os.WriteFile(tomlPath, []byte(toml), 0666); err != nil {
×
211
                return err
×
212
        }
×
213
        return nil
×
214
}
215

216
func (f *MdBookFormatter) renderToml(p *document.Package, t *template.Template) (string, error) {
×
217
        b := strings.Builder{}
×
218
        if err := t.ExecuteTemplate(&b, "book.toml", p); err != nil {
×
219
                return "", err
×
220
        }
×
221
        return b.String(), nil
×
222
}
223

224
func (f *MdBookFormatter) writeCss(dir string) error {
×
225
        cssDir := path.Join(dir, "css")
×
226
        if err := os.MkdirAll(cssDir, os.ModePerm); err != nil && !os.IsExist(err) {
×
227
                return err
×
228
        }
×
229
        css, err := fs.ReadFile(assets.CSS, "css/mdbook.css")
×
230
        if err != nil {
×
231
                return err
×
232
        }
×
233
        if err := os.WriteFile(path.Join(cssDir, "custom.css"), css, 0666); err != nil {
×
234
                return err
×
235
        }
×
236
        return nil
×
237
}
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