69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package routes
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"foobar/database"
|
|
"foobar/model"
|
|
"foobar/views"
|
|
"net/http"
|
|
|
|
"github.com/a-h/templ"
|
|
"github.com/gomarkdown/markdown"
|
|
"github.com/gomarkdown/markdown/html"
|
|
"github.com/gomarkdown/markdown/parser"
|
|
"github.com/microcosm-cc/bluemonday"
|
|
)
|
|
|
|
func boxUpload(w http.ResponseWriter, r *http.Request) (templ.Component, error) {
|
|
boxURL, err := GetBoxURL(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
box, err := database.SelectBox(boxURL)
|
|
if err != nil {
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return views.NewBox(boxURL, readmeTemplate), nil
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|
|
return views.BoxUpload(box), nil
|
|
}
|
|
|
|
func checkBox(w http.ResponseWriter, r *http.Request) (templ.Component, error) {
|
|
boxURL, err := GetBoxURL(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
box, err := database.SelectBox(boxURL)
|
|
if err != nil {
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return views.Box(boxURL, []model.File{}), nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
boxFiles, err := database.SelectBoxFiles(box.ID())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return views.Box(boxURL, boxFiles), nil
|
|
}
|
|
|
|
func mdToHTML(md []byte) model.Markdown {
|
|
// create markdown parser with extensions
|
|
extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
|
|
p := parser.NewWithExtensions(extensions)
|
|
doc := p.Parse(md)
|
|
|
|
// create HTML renderer with extensions
|
|
htmlFlags := html.CommonFlags | html.HrefTargetBlank
|
|
opts := html.RendererOptions{Flags: htmlFlags}
|
|
renderer := html.NewRenderer(opts)
|
|
|
|
sanitizer := bluemonday.UGCPolicy()
|
|
return model.Markdown(sanitizer.SanitizeBytes(markdown.Render(doc, renderer)))
|
|
}
|