Skip to content

Commit 8ec565c

Browse files
committed
Implement table extension
Signed-off-by: Jack Baldry <[email protected]>
1 parent 6009c18 commit 8ec565c

File tree

2 files changed

+114
-4
lines changed

2 files changed

+114
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Package extension implements Goldmark extensions.
2+
package extension
3+
4+
import (
5+
"github.com/yuin/goldmark"
6+
gast "github.com/yuin/goldmark/ast"
7+
"github.com/yuin/goldmark/extension"
8+
"github.com/yuin/goldmark/extension/ast"
9+
"github.com/yuin/goldmark/renderer"
10+
"github.com/yuin/goldmark/util"
11+
)
12+
13+
// TableMarkdownRenderer is a renderer.NodeRenderer implementation that
14+
// renders Table nodes.
15+
type TableMarkdownRenderer struct {
16+
extension.TableConfig
17+
}
18+
19+
// NewTableMarkdownRenderer returns a new TableMarkdownRenderer.
20+
func NewTableMarkdownRenderer(opts ...extension.TableOption) renderer.NodeRenderer {
21+
r := &TableMarkdownRenderer{
22+
TableConfig: extension.NewTableConfig(),
23+
}
24+
for _, opt := range opts {
25+
opt.SetTableOption(&r.TableConfig)
26+
}
27+
return r
28+
}
29+
30+
// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs.
31+
func (r *TableMarkdownRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
32+
reg.Register(ast.KindTable, r.renderTable)
33+
reg.Register(ast.KindTableHeader, r.renderTableHeader)
34+
reg.Register(ast.KindTableRow, r.renderTableRow)
35+
reg.Register(ast.KindTableCell, r.renderTableCell)
36+
}
37+
38+
func (r *TableMarkdownRenderer) renderTable(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
39+
if !entering {
40+
_, _ = w.WriteString("\n")
41+
}
42+
43+
return gast.WalkContinue, nil
44+
}
45+
46+
func (r *TableMarkdownRenderer) renderTableHeader(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
47+
if !entering {
48+
_, _ = w.WriteString("\n")
49+
50+
// Add a separator line after the header row.
51+
_, _ = w.WriteString("|")
52+
for i := 0; i < n.ChildCount(); i++ {
53+
_, _ = w.WriteString(" --- |")
54+
}
55+
_, _ = w.WriteString("\n")
56+
}
57+
58+
return gast.WalkContinue, nil
59+
}
60+
61+
func (r *TableMarkdownRenderer) renderTableRow(w util.BufWriter, _ []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
62+
if !entering {
63+
_, _ = w.WriteString("\n")
64+
}
65+
66+
return gast.WalkContinue, nil
67+
}
68+
69+
func (r *TableMarkdownRenderer) renderTableCell(w util.BufWriter, _ []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
70+
if entering {
71+
_, _ = w.WriteString("| ")
72+
} else if n.NextSibling() != nil {
73+
_, _ = w.WriteString(" ")
74+
} else {
75+
_, _ = w.WriteString(" |")
76+
}
77+
78+
return gast.WalkContinue, nil
79+
}
80+
81+
type table struct {
82+
options []extension.TableOption
83+
}
84+
85+
// Table is an extension that allow you to use GFM tables .
86+
var Table = &table{
87+
options: []extension.TableOption{},
88+
}
89+
90+
// NewTable returns a new extension with given options.
91+
func NewTable(opts ...extension.TableOption) goldmark.Extender {
92+
return &table{
93+
options: opts,
94+
}
95+
}
96+
97+
func (e *table) Extend(m goldmark.Markdown) {
98+
m.Renderer().AddOptions(renderer.WithNodeRenderers(
99+
util.Prioritized(NewTableMarkdownRenderer(e.options...), 500),
100+
))
101+
}

tools/transformer/main.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"path/filepath"
1313
"regexp"
1414

15+
"github.com/grafana/killercoda/tools/transformer/goldmark/extension"
1516
"github.com/grafana/killercoda/tools/transformer/killercoda"
1617
"github.com/yuin/goldmark"
1718
"github.com/yuin/goldmark/text"
@@ -91,7 +92,9 @@ func transform(srcFilePath, dstDirPath string) error {
9192
md := goldmark.New(goldmark.WithExtensions(&KillercodaExtension{
9293
Transformers: DefaultKillercodaTransformers,
9394
AdditionalExtenders: []goldmark.Extender{},
94-
}))
95+
},
96+
extension.Table,
97+
))
9598

9699
root := md.Parser().Parse(text.NewReader(data))
97100

@@ -127,7 +130,9 @@ func transform(srcFilePath, dstDirPath string) error {
127130
AdditionalExtenders: []goldmark.Extender{
128131
&StepTransformer{StartMarker: pageIntroStartMarker, EndMarker: pageIntroEndMarker},
129132
},
130-
}))
133+
},
134+
extension.Table,
135+
))
131136

132137
if err := writeFile(md, dstDirPath, "intro.md", data); err != nil {
133138
return err
@@ -142,7 +147,9 @@ func transform(srcFilePath, dstDirPath string) error {
142147
AdditionalExtenders: []goldmark.Extender{
143148
&StepTransformer{StartMarker: pageFinishStartMarker, EndMarker: pageFinishEndMarker},
144149
},
145-
}))
150+
},
151+
extension.Table,
152+
))
146153

147154
if err := writeFile(md, dstDirPath, "finish.md", data); err != nil {
148155
return err
@@ -167,7 +174,9 @@ func transform(srcFilePath, dstDirPath string) error {
167174
AdditionalExtenders: []goldmark.Extender{
168175
&StepTransformer{StartMarker: startMarker, EndMarker: endMarker},
169176
},
170-
}))
177+
},
178+
extension.Table,
179+
))
171180

172181
if err := writeFile(md, dstDirPath, fmt.Sprintf("step%d.md", i), data); err != nil {
173182
errs = errors.Join(errs, err)

0 commit comments

Comments
 (0)