diff options
| author | Jonathan Amsterdam <jba@google.com> | 2026-03-21 16:52:49 -0400 |
|---|---|---|
| committer | Jonathan Amsterdam <jba@google.com> | 2026-03-27 11:54:39 -0700 |
| commit | 0f438ccc7dbe2f891f5f97594f7b6510e490c742 (patch) | |
| tree | 616118e6c6178e26d3268dab682c27e1fe773898 /internal/api/render.go | |
| parent | c59880de3cd54955ef11b4187daf7f930badb5e2 (diff) | |
| download | go-x-pkgsite-0f438ccc7dbe2f891f5f97594f7b6510e490c742.tar.xz | |
internal/api: render markdown documentation
Change-Id: I8adf1e62d19cf592cc8204264d99953e12da5843
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/760260
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
kokoro-CI: kokoro <noreply+kokoro@google.com>
Reviewed-by: Ethan Lee <ethanalee@google.com>
Diffstat (limited to 'internal/api/render.go')
| -rw-r--r-- | internal/api/render.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/internal/api/render.go b/internal/api/render.go index 47b157af..656a8405 100644 --- a/internal/api/render.go +++ b/internal/api/render.go @@ -14,6 +14,9 @@ import ( "io" "slices" "strings" + + "golang.org/x/text/cases" + "golang.org/x/text/language" ) // A renderer prints symbol documentation for a package. @@ -101,6 +104,77 @@ func (r *textRenderer) printf(format string, args ...any) { } } +type markdownRenderer struct { + fset *token.FileSet + w io.Writer + pkg *doc.Package + parser *comment.Parser + printer *comment.Printer + caser cases.Caser + err error +} + +func (r *markdownRenderer) start(pkg *doc.Package) { + r.pkg = pkg + r.parser = pkg.Parser() + r.printer = pkg.Printer() + r.printer.HeadingLevel = 3 + r.caser = cases.Title(language.English) + + r.printf("# package %s\n", pkg.Name) + if pkg.Doc != "" { + r.printf("\n") + _, err := r.w.Write(r.printer.Markdown(r.parser.Parse(pkg.Doc))) + if err != nil { + r.err = err + } + } + r.printf("\n") +} + +func (r *markdownRenderer) end() error { return r.err } + +func (r *markdownRenderer) startSection(name string) { + if name == "" { + return + } + r.printf("## %s\n\n", r.caser.String(name)) +} + +func (r *markdownRenderer) endSection() {} + +func (r *markdownRenderer) emit(comment string, node ast.Node) { + if r.err != nil { + return + } + r.printf("```\n") + err := format.Node(r.w, r.fset, node) + if err != nil { + r.err = err + return + } + r.printf("\n```\n") + formatted := r.printer.Markdown(r.parser.Parse(comment)) + if len(formatted) > 0 { + _, err = r.w.Write(formatted) + if err != nil { + r.err = err + return + } + } + r.printf("\n") +} + +func (r *markdownRenderer) printf(format string, args ...any) { + if r.err != nil { + return + } + _, err := fmt.Fprintf(r.w, format, args...) + if err != nil { + r.err = err + } +} + // renderDoc renders the documentation for dpkg using the given renderer. // TODO(jba): support examples. func renderDoc(dpkg *doc.Package, r renderer) error { |
