Documentation ¶
Overview ¶
Package toc provides support for building a Table of Contents from a goldmark Markdown document.
The package operates in two stages: inspection and rendering. During inspection, the package analyzes an existing Markdown document, and builds a Table of Contents from it.
markdown := goldmark.New(...) parser := markdown.Parser() doc := parser.Parse(text.NewReader(src)) tocTree, err := toc.Inspect(doc, src)
During rendering, it converts the Table of Contents into a list of headings with nested items under each as a goldmark Markdown document. You may manipulate the TOC, removing items from it or simplifying it, before rendering.
if len(tocTree.Items) == 0 { // No headings in the document. return } tocList := toc.RenderList(tocTree)
You can render that Markdown document using goldmark into whatever form you prefer.
renderer := markdown.Renderer() renderer.Render(out, src, tocList)
The following diagram summarizes the flow of information with goldmark-toc.
src +--------+ +-------------------+ | | goldmark/Parser.Parse | | | []byte :---------------------------> goldmark/ast.Node | | | | | +---.----+ +-------.-----.-----+ | | | '----------------. .-----------------' | \ / | \ / | | | | toc.Inspect | | | +----v----+ | | | | | toc.TOC | | | | | +----.----+ | | | | toc/Renderer.Render | | | +---------v---------+ | | | | | goldmark/ast.Node | | | | | +---------.---------+ | | | '-------. .--------------' \ / | goldmark/Renderer.Render | | v +------+ | HTML | +------+
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func RenderList ¶
RenderList renders a table of contents as a nested list with a sane, default configuration for the ListRenderer.
If the TOC is nil or empty, nil is returned. Do not call Goldmark's renderer if the returned node is nil.
Types ¶
type Extender ¶
type Extender struct{}
Extender extends a Goldmark Markdown parser and renderer to always include a table of contents in the output.
To use this, install it into your Goldmark Markdown object.
md := goldmark.New( // ... goldmark.WithParserOptions(parser.WithAutoHeadingID()), goldmark.WithExtensions( // ... &toc.Extender{ }, ), )
This will install the default Transformer. For more control, install the Transformer directly on the Markdown Parser.
NOTE: Unless you've supplied your own parser.IDs implementation, you'll need to enable the WithAutoHeadingID option on the parser to generate IDs and links for headings.
type Item ¶
type Item struct { // Title of this item in the table of contents. // // This may be blank for items that don't refer to a heading, and only // have sub-items. Title []byte // ID is the identifier for the heading that this item refers to. This // is the fragment portion of the link without the "#". // // This may be blank if the item doesn't have an id assigned to it, or // if it doesn't have a title. // // Enable AutoHeadingID in your parser if you expected these to be set // but they weren't. ID []byte // Items references children of this item. // // For a heading at level 3, Items, contains the headings at level 4 // under that section. Items Items }
Item is a single item in the table of contents.
type ListRenderer ¶
type ListRenderer struct { // Marker for elements of the list, e.g. '-', '*', etc. // // Defaults to '*'. Marker byte }
ListRenderer builds a nested list from a table of contents.
For example,
# Foo ## Bar ## Baz # Qux // becomes - Foo - Bar - Baz - Qux
type TOC ¶
type TOC struct { // Items holds the top-level headings under the table of contents. // // Items is empty if there are no headings in the document. Items Items }
TOC is the table of contents. It's the top-level object under which the rest of the table of contents resides.
type Transformer ¶
type Transformer struct{}
Transformer is a Goldmark AST transformer adds a TOC to the top of a Markdown document.
To use this, either install the Extender on the goldmark.Markdown object, or install the AST transformer on the Markdown parser like so.
markdown := goldmark.New(...) markdown.Parser().AddOptions( parser.WithAutoHeadingID(), parser.WithASTTransformers( util.Prioritized(&toc.Transformer{}, 100), ), )
NOTE: Unless you've supplied your own parser.IDs implementation, you'll need to enable the WithAutoHeadingID option on the parser to generate IDs and links for headings.