1// Copyright 2023 The goldmark-figure authors
  2//
  3// Use of this source code is governed by an MIT-style
  4// license that can be found in the LICENSE file or at
  5// https://opensource.org/licenses/MIT.
  6package ast
  7
  8import (
  9	gast "github.com/yuin/goldmark/ast"
 10	"github.com/yuin/goldmark/renderer"
 11	"github.com/yuin/goldmark/util"
 12)
 13
 14// KindFigure is a NodeKind of the Figure node.
 15var KindFigure = gast.NewNodeKind("Figure")
 16
 17// A Figure struct represents a table of Markdown(GFM) text.
 18type Figure struct {
 19	gast.BaseBlock
 20}
 21
 22// Kind implements Node.Kind.
 23func (n *Figure) Kind() gast.NodeKind {
 24	return KindFigure
 25}
 26
 27// Dump implements Node.Dump
 28func (n *Figure) Dump(source []byte, level int) {
 29	gast.DumpHelper(n, source, level, nil, func(level int) {
 30	})
 31}
 32
 33// NewFigure returns a new Table node.
 34func NewFigure() *Figure {
 35	return &Figure{}
 36}
 37
 38// KindFigureImage is a NodeKind of the FigureImage node.
 39var KindFigureImage = gast.NewNodeKind("FigureImage")
 40
 41// A FigureImage struct represents a table of Markdown(GFM) text.
 42type FigureImage struct {
 43	gast.BaseBlock
 44}
 45
 46// Kind implements Node.Kind.
 47func (n *FigureImage) Kind() gast.NodeKind {
 48	return KindFigureImage
 49}
 50
 51// Dump implements Node.Dump
 52func (n *FigureImage) Dump(source []byte, level int) {
 53	gast.DumpHelper(n, source, level, nil, func(level int) {
 54	})
 55}
 56
 57// NewFigureImage returns a new Table node.
 58func NewFigureImage() *FigureImage {
 59	return &FigureImage{}
 60}
 61
 62// KindFigureCaption is a NodeKind of the FigureCaption node.
 63var KindFigureCaption = gast.NewNodeKind("FigureCaption")
 64
 65// A FigureCaption struct represents a table of Markdown(GFM) text.
 66type FigureCaption struct {
 67	gast.BaseBlock
 68}
 69
 70// Kind implements Node.Kind.
 71func (n *FigureCaption) Kind() gast.NodeKind {
 72	return KindFigureCaption
 73}
 74
 75// Dump implements Node.Dump
 76func (n *FigureCaption) Dump(source []byte, level int) {
 77	gast.DumpHelper(n, source, level, nil, func(level int) {
 78	})
 79}
 80
 81// NewFigureCaption returns a new Table node.
 82func NewFigureCaption() *FigureCaption {
 83	return &FigureCaption{}
 84}
 85
 86// FigureHTMLRenderer is a renderer.NodeRenderer implementation that
 87// renders Figure nodes.
 88type FigureHTMLRenderer struct {
 89}
 90
 91// NewFigureHTMLRenderer returns a new FigureHTMLRenderer.
 92func NewFigureHTMLRenderer() renderer.NodeRenderer {
 93	return &FigureHTMLRenderer{}
 94}
 95
 96// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs.
 97func (r *FigureHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
 98	reg.Register(KindFigure, r.renderFigure)
 99	reg.Register(KindFigureCaption, r.renderFigureCaption)
100}
101
102func (r *FigureHTMLRenderer) renderFigure(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
103	if entering {
104		_, _ = w.WriteString("<figure>\n")
105	} else {
106		_, _ = w.WriteString("</figure>\n")
107	}
108	return gast.WalkContinue, nil
109}
110
111func (r *FigureHTMLRenderer) renderFigureCaption(w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) {
112	if entering {
113		_, _ = w.WriteString("<figcaption><p>")
114	} else {
115		_, _ = w.WriteString("</p></figcaption>\n")
116	}
117	return gast.WalkContinue, nil
118}