зеркало из https://github.com/golang/build.git
73 строки
1.7 KiB
Go
73 строки
1.7 KiB
Go
// Copyright 2024 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 relnote
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
md "rsc.io/markdown"
|
|
)
|
|
|
|
// DumpMarkdown writes the internal structure of a markdown
|
|
// document to standard output.
|
|
// It is intended for debugging.
|
|
func DumpMarkdown(d *md.Document) {
|
|
dumpBlocks(d.Blocks, 0)
|
|
}
|
|
|
|
func dumpBlocks(bs []md.Block, depth int) {
|
|
for _, b := range bs {
|
|
dumpBlock(b, depth)
|
|
}
|
|
}
|
|
|
|
func dumpBlock(b md.Block, depth int) {
|
|
typeName := strings.TrimPrefix(fmt.Sprintf("%T", b), "*markdown.")
|
|
dprintf(depth, "%s\n", typeName)
|
|
switch b := b.(type) {
|
|
case *md.Paragraph:
|
|
dumpInlines(b.Text.Inline, depth+1)
|
|
case *md.Heading:
|
|
dumpInlines(b.Text.Inline, depth+1)
|
|
case *md.List:
|
|
dumpBlocks(b.Items, depth+1)
|
|
case *md.Item:
|
|
dumpBlocks(b.Blocks, depth+1)
|
|
default:
|
|
// TODO(jba): additional cases as needed.
|
|
}
|
|
}
|
|
|
|
func dumpInlines(ins []md.Inline, depth int) {
|
|
for _, in := range ins {
|
|
switch in := in.(type) {
|
|
case *md.Plain:
|
|
dprintf(depth, "Plain(%q)\n", in.Text)
|
|
case *md.Code:
|
|
dprintf(depth, "Code(%q)\n", in.Text)
|
|
case *md.Link:
|
|
dprintf(depth, "Link:\n")
|
|
dumpInlines(in.Inner, depth+1)
|
|
dprintf(depth+1, "URL: %q\n", in.URL)
|
|
case *md.Strong:
|
|
dprintf(depth, "Strong(%q):\n", in.Marker)
|
|
dumpInlines(in.Inner, depth+1)
|
|
case *md.Emph:
|
|
dprintf(depth, "Emph(%q):\n", in.Marker)
|
|
dumpInlines(in.Inner, depth+1)
|
|
case *md.Del:
|
|
dprintf(depth, "Del(%q):\n", in.Marker)
|
|
dumpInlines(in.Inner, depth+1)
|
|
default:
|
|
fmt.Printf("%*s%#v\n", depth*4, "", in)
|
|
}
|
|
}
|
|
}
|
|
|
|
func dprintf(depth int, format string, args ...any) {
|
|
fmt.Printf("%*s%s", depth*4, "", fmt.Sprintf(format, args...))
|
|
}
|