nova-rebolaxe/vistas/letra.go

54 lines
1.5 KiB
Go
Raw Permalink Normal View History

2023-12-04 16:59:57 +01:00
package vistas
import (
"fmt"
"os"
"net/http"
"strings"
"bytes"
"regexp"
"github.com/gin-gonic/gin"
"github.com/yuin/goldmark"
)
func Letra(c *gin.Context) {
letra := c.PostForm("slug") // FIXME: Sanitize
// Sanitize "letra"
letra = regexp.MustCompile(`[^a-zA-Z0-9ñÑáéíóú\- ]+`).ReplaceAllString(letra, "")
arquivo := "./letras/" + letra + ".md"
contido, err := os.ReadFile(arquivo)
if err != nil {
fmt.Println("Error lendo.")
c.Data(http.StatusNotFound, "text/html; charset=utf-8", []byte("Song not found."))
}
toml_marxes_atopados := 0
var markdown string
for _, linea := range strings.Split(string(contido[:]), "\n") {
// quitase a cabeceira toml, fai falta atopar un bloque:
// +++
// title = "Foo, the song"
// +++
if strings.HasPrefix(linea, "+++") {
toml_marxes_atopados = toml_marxes_atopados + 1
}
// Si xa se atoparon os dos marxes do toml e non estamos en un deles:
if toml_marxes_atopados == 2 && !strings.HasPrefix(linea, "+++") {
markdown = markdown + linea +"\n"
}
}
// markdown a html
var buf bytes.Buffer
if err := goldmark.Convert([]byte(markdown), &buf); err != nil {
fmt.Println("Error convertindo markdown a html")
c.Data(http.StatusInternalServerError, "text/html; charset=utf-8", []byte("Error converting to html."))
} else {
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(buf.String()))
}
}