markdown/markdown.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package markdown import ( "fmt" "os" gotmpl "text/template" "time" "git.icyphox.sh/vite/config" "git.icyphox.sh/vite/markdown/template" bf "git.icyphox.sh/grayfriday" ) var ( bfFlags = bf.UseXHTML | bf.Smartypants | bf.SmartypantsFractions | bf.SmartypantsDashes | bf.NofollowLinks | bf.FootnoteReturnLinks bfExts = bf.NoIntraEmphasis | bf.Tables | bf.FencedCode | bf.Autolink | bf.Strikethrough | bf.SpaceHeadings | bf.BackslashLineBreak | bf.AutoHeadingIDs | bf.HeadingIDs | bf.Footnotes | bf.NoEmptyLineBeforeBlock ) type Output struct { HTML []byte Meta Matter } // Renders markdown to html, and fetches metadata. func (out *Output) RenderMarkdown(source []byte) error { md := MarkdownDoc{} if err := md.Extract(source); err != nil { return fmt.Errorf("markdown: %w", err) } out.HTML = bf.Run( md.Body, bf.WithNoExtensions(), bf.WithRenderer(bf.NewHTMLRenderer(bf.HTMLRendererParameters{Flags: bfFlags})), bf.WithExtensions(bfExts), ) out.Meta = md.Frontmatter return nil } // Renders out.HTML into dst html file, using the template specified // in the frontmatter. data is the template struct. func (out *Output) RenderHTML(dst, tmplDir string, data interface{}) error { metaTemplate := out.Meta["template"] if metaTemplate == "" { metaTemplate = config.Config.DefaultTemplate } tmpl := template.NewTmpl() tmpl.SetFuncs(gotmpl.FuncMap{ "parsedate": func(s string) time.Time { date, _ := time.Parse("2006-01-02", s) return date }, }) if err := tmpl.Load(tmplDir); err != nil { return err } w, err := os.Create(dst) if err != nil { return err } if err = tmpl.ExecuteTemplate(w, metaTemplate, data); err != nil { return err } return nil } |