penguin/flatgit

flatgit showcase

internal/render/markdown.go

raw ยท 986 bytes

package render

import (
	"bytes"
	"path/filepath"
	"strings"

	"github.com/microcosm-cc/bluemonday"
	"github.com/yuin/goldmark"
	"github.com/yuin/goldmark/extension"
	"github.com/yuin/goldmark/parser"
)

func renderMarkdownSafe(src []byte) ([]byte, error) {
	md := goldmark.New(
		goldmark.WithExtensions(extension.GFM),
		goldmark.WithParserOptions(parser.WithAutoHeadingID()),
	)

	var buf bytes.Buffer
	if err := md.Convert(src, &buf); err != nil {
		return nil, err
	}

	policy := bluemonday.UGCPolicy()
	return policy.SanitizeBytes(buf.Bytes()), nil
}

func isMarkdownPath(path string) bool {
	name := strings.ToLower(filepath.Base(path))
	ext := strings.ToLower(filepath.Ext(path))

	return ext == ".md" || name == "readme"
}

func findReadmePath(tree []TreeEntry) string {
	for _, e := range tree {
		if e.Type != "blob" {
			continue
		}

		name := strings.ToLower(e.Path)

		switch name {
		case "readme.md", "readme.markdown", "readme":
			return e.Path
		}
	}

	return ""
}