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

mlange-42 / modo / 12977054124

26 Jan 2025 06:02PM CUT coverage: 61.986%. Remained the same
12977054124

Pull #121

github

web-flow
Merge bb75fb231 into b3ce65ee7
Pull Request #121: Fix link labels for aliases

1 of 1 new or added line in 1 file covered. (100.0%)

1055 of 1702 relevant lines covered (61.99%)

29.77 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 MdBook struct{}
17

18
func (f *MdBook) Accepts(files []string) error {
×
19
        if len(files) > 1 {
×
20
                return fmt.Errorf("mdBook formatter can process only a single JSON file, but %d is given", len(files))
×
21
        }
×
22
        if len(files) == 0 || files[0] == "" {
×
23
                return nil
×
24
        }
×
25
        if s, err := os.Stat(files[0]); err == nil {
×
26
                if s.IsDir() {
×
27
                        return fmt.Errorf("mdBook formatter can process only a single JSON file, but directory '%s' is given", files[0])
×
28
                }
×
29
        } else {
×
30
                return err
×
31
        }
×
32
        return nil
×
33
}
34

35
func (f *MdBook) Render(docs *document.Docs, config *document.Config, subdir string) error {
×
36
        return document.Render(docs, config, f, subdir)
×
37
}
×
38

39
func (f *MdBook) ProcessMarkdown(element any, text string, proc *document.Processor) (string, error) {
×
40
        return text, nil
×
41
}
×
42

43
func (f *MdBook) WriteAuxiliary(p *document.Package, dir string, proc *document.Processor) error {
×
44
        if err := f.writeSummary(p, dir, proc); err != nil {
×
45
                return err
×
46
        }
×
47
        if err := f.writeToml(p, dir, proc); err != nil {
×
48
                return err
×
49
        }
×
50
        if err := f.writeCss(dir, proc); err != nil {
×
51
                return err
×
52
        }
×
53
        return nil
×
54
}
55

56
func (f *MdBook) ToFilePath(p string, kind string) (string, error) {
×
57
        if kind == "package" || kind == "module" {
×
58
                return path.Join(p, "_index.md"), nil
×
59
        }
×
60
        if len(p) == 0 {
×
61
                return p, nil
×
62
        }
×
63
        return p + ".md", nil
×
64
}
65

66
func (f *MdBook) ToLinkPath(p string, kind string) (string, error) {
×
67
        return f.ToFilePath(p, kind)
×
68
}
×
69

70
type summary struct {
71
        Summary   string
72
        Packages  string
73
        Modules   string
74
        Structs   string
75
        Traits    string
76
        Functions string
77
}
78

79
func (f *MdBook) writeSummary(p *document.Package, dir string, proc *document.Processor) error {
×
80
        summary, err := f.renderSummary(p, proc)
×
81
        if err != nil {
×
82
                return err
×
83
        }
×
84
        summaryPath := path.Join(dir, p.GetFileName(), "SUMMARY.md")
×
85
        if proc.Config.DryRun {
×
86
                return nil
×
87
        }
×
88
        if err := os.WriteFile(summaryPath, []byte(summary), 0644); err != nil {
×
89
                return err
×
90
        }
×
91
        return nil
×
92
}
93

94
func (f *MdBook) renderSummary(p *document.Package, proc *document.Processor) (string, error) {
×
95
        s := summary{}
×
96

×
97
        pkgFile, err := f.ToLinkPath("", "package")
×
98
        if err != nil {
×
99
                return "", err
×
100
        }
×
101
        s.Summary = fmt.Sprintf("[`%s`](%s)", p.GetName(), pkgFile)
×
102

×
103
        pkgs := strings.Builder{}
×
104
        for _, p := range p.Packages {
×
105
                if err := f.renderPackage(p, proc.Template, nil, &pkgs); err != nil {
×
106
                        return "", err
×
107
                }
×
108
        }
109
        s.Packages = pkgs.String()
×
110

×
111
        mods := strings.Builder{}
×
112
        for _, m := range p.Modules {
×
113
                if err := f.renderModule(m, nil, &mods); err != nil {
×
114
                        return "", err
×
115
                }
×
116
        }
117
        s.Modules = mods.String()
×
118

×
119
        elems := strings.Builder{}
×
120
        for _, elem := range p.Structs {
×
121
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
122
                        return "", err
×
123
                }
×
124
        }
125
        s.Structs = elems.String()
×
126
        elems = strings.Builder{}
×
127
        for _, elem := range p.Traits {
×
128
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
129
                        return "", err
×
130
                }
×
131
        }
132
        s.Traits = elems.String()
×
133
        elems = strings.Builder{}
×
134
        for _, elem := range p.Functions {
×
135
                if err := f.renderModuleMember(elem, "", 0, &elems); err != nil {
×
136
                        return "", err
×
137
                }
×
138
        }
139
        s.Functions = elems.String()
×
140

×
141
        b := strings.Builder{}
×
142
        if err := proc.Template.ExecuteTemplate(&b, "mdbook_summary.md", &s); err != nil {
×
143
                return "", err
×
144
        }
×
145

146
        return b.String(), nil
×
147
}
148

149
func (f *MdBook) renderPackage(pkg *document.Package, t *template.Template, linkPath []string, out *strings.Builder) error {
×
150
        newPath := append([]string{}, linkPath...)
×
151
        newPath = append(newPath, pkg.GetFileName())
×
152

×
153
        pkgFile, err := f.ToLinkPath(path.Join(newPath...), "package")
×
154
        if err != nil {
×
155
                return err
×
156
        }
×
157

158
        fmt.Fprintf(out, "%-*s- [`%s`](%s))\n", 2*len(linkPath), "", pkg.GetName(), pkgFile)
×
159
        for _, p := range pkg.Packages {
×
160
                if err := f.renderPackage(p, t, newPath, out); err != nil {
×
161
                        return err
×
162
                }
×
163
        }
164
        for _, m := range pkg.Modules {
×
165
                if err := f.renderModule(m, newPath, out); err != nil {
×
166
                        return err
×
167
                }
×
168
        }
169

170
        pathStr := path.Join(newPath...)
×
171
        childDepth := 2*(len(newPath)-1) + 2
×
172
        for _, elem := range pkg.Structs {
×
173
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
174
                        return err
×
175
                }
×
176
        }
177
        for _, elem := range pkg.Traits {
×
178
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
179
                        return err
×
180
                }
×
181
        }
182
        for _, elem := range pkg.Functions {
×
183
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
184
                        return err
×
185
                }
×
186
        }
187

188
        return nil
×
189
}
190

191
func (f *MdBook) renderModule(mod *document.Module, linkPath []string, out *strings.Builder) error {
×
192
        newPath := append([]string{}, linkPath...)
×
193
        newPath = append(newPath, mod.GetFileName())
×
194

×
195
        pathStr := path.Join(newPath...)
×
196

×
197
        modFile, err := f.ToLinkPath(pathStr, "module")
×
198
        if err != nil {
×
199
                return err
×
200
        }
×
201
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", 2*(len(newPath)-1), "", mod.GetName(), modFile)
×
202

×
203
        childDepth := 2*(len(newPath)-1) + 2
×
204
        for _, elem := range mod.Structs {
×
205
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
206
                        return err
×
207
                }
×
208
        }
209
        for _, elem := range mod.Traits {
×
210
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
211
                        return err
×
212
                }
×
213
        }
214
        for _, elem := range mod.Functions {
×
215
                if err := f.renderModuleMember(elem, pathStr, childDepth, out); err != nil {
×
216
                        return err
×
217
                }
×
218
        }
219
        return nil
×
220
}
221

222
func (f *MdBook) renderModuleMember(mem document.Named, pathStr string, depth int, out io.Writer) error {
×
223
        memPath, err := f.ToLinkPath(path.Join(pathStr, mem.GetFileName(), ""), "")
×
224
        if err != nil {
×
225
                return err
×
226
        }
×
227
        fmt.Fprintf(out, "%-*s- [`%s`](%s)\n", depth, "", mem.GetName(), memPath)
×
228
        return nil
×
229
}
230

231
func (f *MdBook) writeToml(p *document.Package, dir string, proc *document.Processor) error {
×
232
        toml, err := f.renderToml(p, proc.Template)
×
233
        if err != nil {
×
234
                return err
×
235
        }
×
236
        if proc.Config.DryRun {
×
237
                return nil
×
238
        }
×
239
        tomlPath := path.Join(dir, "book.toml")
×
240
        if err := os.WriteFile(tomlPath, []byte(toml), 0644); err != nil {
×
241
                return err
×
242
        }
×
243
        return nil
×
244
}
245

246
func (f *MdBook) renderToml(p *document.Package, t *template.Template) (string, error) {
×
247
        b := strings.Builder{}
×
248
        if err := t.ExecuteTemplate(&b, "book.toml", p); err != nil {
×
249
                return "", err
×
250
        }
×
251
        return b.String(), nil
×
252
}
253

254
func (f *MdBook) writeCss(dir string, proc *document.Processor) error {
×
255
        cssDir := path.Join(dir, "css")
×
256
        if !proc.Config.DryRun {
×
257
                if err := os.MkdirAll(cssDir, os.ModePerm); err != nil && !os.IsExist(err) {
×
258
                        return err
×
259
                }
×
260
        }
261
        css, err := fs.ReadFile(assets.CSS, "css/mdbook.css")
×
262
        if err != nil {
×
263
                return err
×
264
        }
×
265
        if !proc.Config.DryRun {
×
266
                if err := os.WriteFile(path.Join(cssDir, "custom.css"), css, 0644); err != nil {
×
267
                        return err
×
268
                }
×
269
        }
270
        return nil
×
271
}
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