markdown.go (1100B)
1 package utils 2 3 import ( 4 "bytes" 5 "strings" 6 7 "github.com/yuin/goldmark" 8 "github.com/yuin/goldmark/extension" 9 "github.com/yuin/goldmark/parser" 10 "github.com/yuin/goldmark/renderer/html" 11 ) 12 13 var markdownRenderer = goldmark.New( 14 goldmark.WithExtensions( 15 extension.GFM, 16 extension.Typographer, 17 ), 18 goldmark.WithParserOptions( 19 parser.WithAutoHeadingID(), 20 ), 21 goldmark.WithRendererOptions( 22 html.WithHardWraps(), 23 html.WithXHTML(), 24 ), 25 ) 26 27 func MarkdownToHTML(markdown string) (string, error) { 28 markdown = strings.TrimSpace(markdown) 29 if markdown == "" { 30 return "", nil 31 } 32 33 var buf bytes.Buffer 34 if err := markdownRenderer.Convert([]byte(markdown), &buf); err != nil { 35 return "", err 36 } 37 38 return buf.String(), nil 39 } 40 41 func RemoveFirstH1(markdown string) string { 42 lines := strings.Split(markdown, "\n") 43 var result []string 44 skippedFirstH1 := false 45 46 for _, line := range lines { 47 trimmed := strings.TrimSpace(line) 48 if !skippedFirstH1 && strings.HasPrefix(trimmed, "# ") { 49 skippedFirstH1 = true 50 continue 51 } 52 result = append(result, line) 53 } 54 55 return strings.Join(result, "\n") 56 }