80 lines
2 KiB
Go
80 lines
2 KiB
Go
package pages
|
|
|
|
import (
|
|
"bytes"
|
|
"html/template"
|
|
"io/fs"
|
|
"net/http"
|
|
|
|
chromahtml "github.com/alecthomas/chroma/v2/formatters/html"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/yuin/goldmark"
|
|
highlighting "github.com/yuin/goldmark-highlighting/v2"
|
|
"gopkg.in/yaml.v2"
|
|
contentfs "goth.stack/content"
|
|
"goth.stack/lib"
|
|
)
|
|
|
|
type PostProps struct {
|
|
Content template.HTML
|
|
Name string
|
|
Description string
|
|
Date string
|
|
Tags []string
|
|
}
|
|
|
|
func Post(c echo.Context) error {
|
|
postName := c.Param("post")
|
|
|
|
filePath := postName + ".md"
|
|
|
|
md, err := fs.ReadFile(contentfs.FS, filePath)
|
|
if err != nil {
|
|
println(err.Error())
|
|
http.Error(c.Response().Writer, "This post does not exist!", http.StatusNotFound)
|
|
return nil
|
|
}
|
|
|
|
frontmatterBytes, content, err := lib.SplitFrontmatter(md)
|
|
if err != nil {
|
|
http.Error(c.Response().Writer, "There was an issue rendering this post!", http.StatusInternalServerError)
|
|
return nil
|
|
}
|
|
|
|
var frontmatter lib.FrontMatter
|
|
if err := yaml.Unmarshal(frontmatterBytes, &frontmatter); err != nil {
|
|
http.Error(c.Response().Writer, "There was an issue rendering this post!", http.StatusInternalServerError)
|
|
return nil
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
markdown := goldmark.New(
|
|
goldmark.WithExtensions(
|
|
highlighting.NewHighlighting(
|
|
highlighting.WithStyle("fruity"),
|
|
highlighting.WithFormatOptions(
|
|
chromahtml.WithLineNumbers(true),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
|
|
if err := markdown.Convert(content, &buf); err != nil {
|
|
http.Error(c.Response().Writer, "There was an issue rendering this post!", http.StatusInternalServerError)
|
|
return nil
|
|
}
|
|
|
|
props := PostProps{
|
|
Content: template.HTML(buf.String()),
|
|
Name: frontmatter.Name,
|
|
Description: frontmatter.Description,
|
|
Date: frontmatter.Date,
|
|
Tags: frontmatter.Tags,
|
|
}
|
|
|
|
// Specify the partials used by this page
|
|
partials := []string{"header", "navitems"}
|
|
|
|
// Render the template
|
|
return lib.RenderTemplate(c.Response().Writer, "post", partials, props)
|
|
}
|