package markdown import ( "bytes" "context" "fmt" "strings" "github.com/yuin/goldmark" "gitea.maximumdirect.net/eric/distributor/internal/bundle" "gitea.maximumdirect.net/eric/distributor/internal/storage" "gitea.maximumdirect.net/eric/distributor/internal/transform" ) type Transformer struct { renderer goldmark.Markdown } func New() *Transformer { return &Transformer{renderer: goldmark.New()} } func (t *Transformer) Generate(ctx context.Context, req transform.Request) ([]transform.Output, error) { if t.renderer == nil { t.renderer = goldmark.New() } var outputs []transform.Output for _, file := range req.SourceBundle.Manifest.Files { if !strings.HasSuffix(file.Path, ".md") { continue } sourcePath, err := storage.Join(req.SourceBundle.RootRelativePath, file.Path) if err != nil { return nil, err } data, err := req.SourceBackend.ReadFile(ctx, sourcePath) if err != nil { return nil, fmt.Errorf("read markdown source %q: %w", file.Path, err) } var rendered bytes.Buffer if err := t.renderer.Convert(data, &rendered); err != nil { return nil, fmt.Errorf("render markdown source %q: %w", file.Path, err) } html := wrapHTML(rendered.Bytes()) outputPath := strings.TrimSuffix(file.Path, ".md") + ".html" outputs = append(outputs, transform.Output{ Path: outputPath, SourcePath: file.Path, Transform: transform.MarkdownToHTML, Data: html, SHA256: bundle.FileDigest(html), Size: int64(len(html)), }) } return outputs, nil }