2026-02-01 04:00:26 +00:00
|
|
|
package progdoc
|
|
|
|
|
|
|
|
|
|
import (
|
2026-02-07 23:20:02 +00:00
|
|
|
"bytes"
|
2026-02-01 04:00:26 +00:00
|
|
|
"io"
|
|
|
|
|
"os"
|
2026-02-07 23:50:39 +00:00
|
|
|
"text/template"
|
2026-02-01 04:00:26 +00:00
|
|
|
|
|
|
|
|
"github.com/yuin/goldmark"
|
|
|
|
|
"github.com/yuin/goldmark/extension"
|
|
|
|
|
"github.com/yuin/goldmark/parser"
|
|
|
|
|
"github.com/yuin/goldmark/renderer/html"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type mdSource struct {
|
|
|
|
|
MDFile string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m mdSource) HTML(w io.Writer, srcCtx *SourceCtx) error {
|
|
|
|
|
srcBytes, err := os.ReadFile(m.MDFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
md := goldmark.New(
|
|
|
|
|
goldmark.WithExtensions(extension.GFM),
|
|
|
|
|
goldmark.WithParserOptions(
|
|
|
|
|
parser.WithAutoHeadingID(),
|
|
|
|
|
),
|
|
|
|
|
goldmark.WithRendererOptions(
|
|
|
|
|
html.WithUnsafe(),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return md.Convert(srcBytes, w)
|
|
|
|
|
}
|
2026-02-07 23:20:02 +00:00
|
|
|
|
|
|
|
|
type mdTemplateSource struct {
|
|
|
|
|
Template *template.Template
|
|
|
|
|
Data interface{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m mdTemplateSource) HTML(w io.Writer, srcCtx *SourceCtx) error {
|
|
|
|
|
var tmplOut bytes.Buffer
|
|
|
|
|
if err := m.Template.Execute(&tmplOut, m.Data); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
md := goldmark.New(
|
|
|
|
|
goldmark.WithExtensions(extension.GFM),
|
|
|
|
|
goldmark.WithParserOptions(
|
|
|
|
|
parser.WithAutoHeadingID(),
|
|
|
|
|
),
|
|
|
|
|
goldmark.WithRendererOptions(
|
|
|
|
|
html.WithUnsafe(),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return md.Convert(tmplOut.Bytes(), w)
|
|
|
|
|
}
|