aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Johnson <[email protected]>2025-05-03 15:12:04 -0400
committerSamuel Johnson <[email protected]>2025-05-03 15:12:04 -0400
commit005a588111e6d27b012bc923c39d97a6129f39f2 (patch)
tree69b2bf16a07bd6ebf97313e9bb9056c57d8bb88c
parent46cdc7254109aaebf6e8b629cbd8ecb46c7ad21b (diff)
Implement basic parser endpoint
-rw-r--r--cmd/parser/main.go81
-rw-r--r--cmd/web/handlers/blog.go12
-rw-r--r--cmd/web/handlers/routes.go10
-rw-r--r--cmd/web/main.go35
-rw-r--r--cmd/web/types/application.go15
-rw-r--r--go.mod1
-rw-r--r--go.sum2
7 files changed, 127 insertions, 29 deletions
diff --git a/cmd/parser/main.go b/cmd/parser/main.go
index cc0602a..3933935 100644
--- a/cmd/parser/main.go
+++ b/cmd/parser/main.go
@@ -1,7 +1,84 @@
package main
-import "fmt"
+import (
+ "bytes"
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+ "strconv"
+
+ "github.com/joho/godotenv"
+ "github.com/yuin/goldmark"
+ "github.com/yuin/goldmark/extension"
+ "github.com/yuin/goldmark/parser"
+ "github.com/yuin/goldmark/renderer/html"
+)
+
+var mdParser goldmark.Markdown
+
+func mdServe(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "POST" {
+ w.WriteHeader(405)
+ w.Write([]byte("Method Not Allowed"))
+ return
+ }
+
+ err := r.ParseForm()
+ if err != nil {
+ w.WriteHeader(500)
+ w.Write([]byte("Failed to retrieve form data"))
+ return
+ }
+
+ var buf bytes.Buffer
+
+ log.Print(r.Form)
+ md := r.PostForm.Get("raw")
+ log.Print(md)
+ err = mdParser.Convert([]byte(md), &buf)
+ if err != nil {
+ w.WriteHeader(500)
+ w.Write([]byte("Failed to compile markdown into html"))
+ return
+ }
+
+ w.Write([]byte(md))
+}
func main() {
- fmt.Printf("Markdown compiler app\n")
+ err := godotenv.Load()
+ if err != nil {
+ log.Fatal("Failed to load env")
+ }
+
+ mdParser = goldmark.New(
+ goldmark.WithExtensions(
+ extension.GFM,
+ extension.Footnote,
+ extension.Typographer,
+ ),
+ goldmark.WithParserOptions(
+ parser.WithAutoHeadingID(),
+ ),
+ goldmark.WithRendererOptions(
+ html.WithHardWraps(),
+ ),
+ )
+
+ router := http.NewServeMux()
+ router.HandleFunc("/", mdServe)
+
+ appPort, err := strconv.ParseUint(os.Getenv("parser_port"), 10, 64)
+ if err != nil {
+ appPort = 5006
+ }
+
+ srv := &http.Server{
+ Addr: fmt.Sprintf(":%d", appPort),
+ Handler: router,
+ }
+
+ err = srv.ListenAndServe()
+ log.Fatal(err)
}
diff --git a/cmd/web/handlers/blog.go b/cmd/web/handlers/blog.go
index 5a874f4..da3aec2 100644
--- a/cmd/web/handlers/blog.go
+++ b/cmd/web/handlers/blog.go
@@ -6,7 +6,13 @@ import (
"net/http"
)
-func (ctx *HandlerContext) blogIndex(w http.ResponseWriter, r *http.Request) {
+type blogContext struct {
+ err *log.Logger
+
+ Name string
+}
+
+func (ctx blogContext) index(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.NotFound(w, r)
return
@@ -19,14 +25,14 @@ func (ctx *HandlerContext) blogIndex(w http.ResponseWriter, r *http.Request) {
compiled, err := template.ParseFiles(files...)
if err != nil {
- log.Println(err.Error())
+ ctx.err.Print(err.Error())
http.Error(w, "Internal Server Error", 500)
return
}
err = compiled.ExecuteTemplate(w, "base", ctx)
if err != nil {
- log.Println(err.Error())
+ ctx.err.Print(err.Error())
http.Error(w, "Internal Server Error", 500)
}
}
diff --git a/cmd/web/handlers/routes.go b/cmd/web/handlers/routes.go
index 5a57440..5c927c4 100644
--- a/cmd/web/handlers/routes.go
+++ b/cmd/web/handlers/routes.go
@@ -2,13 +2,17 @@ package handlers
import (
"github.com/gorilla/mux"
+ "paterissa.net/mblog/cmd/web/types"
)
-func RegisterEndpoints(webmaster string) *mux.Router {
- ctx := HandlerContext{webmaster}
+func RegisterEndpoints(app types.Application) *mux.Router {
+ ctx := blogContext{
+ err: app.Err,
+ Name: app.Env.Webmaster,
+ }
blogRouter := mux.NewRouter()
- blogRouter.HandleFunc("/", ctx.blogIndex)
+ blogRouter.HandleFunc("/", ctx.index)
return blogRouter
}
diff --git a/cmd/web/main.go b/cmd/web/main.go
index cda5300..e260b42 100644
--- a/cmd/web/main.go
+++ b/cmd/web/main.go
@@ -10,42 +10,35 @@ import (
"github.com/joho/godotenv"
"paterissa.net/mblog/cmd/web/handlers"
- "paterissa.net/mblog/internal/context"
+ "paterissa.net/mblog/cmd/web/types"
)
-type application struct {
- err *log.Logger
- info *log.Logger
-
- env context.Environment
-}
-
func main() {
- var app application
+ var app types.Application
- app.err = log.New(os.Stderr, "ERROR\t", log.Ldate | log.Ltime)
- app.info = log.New(os.Stdout, "INFO\t", log.Ldate | log.Ltime)
+ app.Err = log.New(os.Stderr, "ERROR\t", log.Ldate | log.Ltime)
+ app.Info = log.New(os.Stdout, "INFO\t", log.Ldate | log.Ltime)
err := godotenv.Load()
if err != nil {
- app.err.Fatal("Failed to load env")
+ app.Err.Fatal("Failed to load env")
}
- app.env.Webmaster = os.Getenv("webmaster")
- app.env.Db.Username = os.Getenv("db_user")
- app.env.Db.Password = os.Getenv("db_pass")
- app.env.AppPort, err = strconv.ParseUint(os.Getenv("app_port"), 10, 64)
+ app.Env.Webmaster = os.Getenv("webmaster")
+ app.Env.Db.Username = os.Getenv("db_user")
+ app.Env.Db.Password = os.Getenv("db_pass")
+ app.Env.AppPort, err = strconv.ParseUint(os.Getenv("web_port"), 10, 64)
if err != nil {
- app.env.AppPort = 5005
+ app.Env.AppPort = 5005
}
- router := handlers.RegisterEndpoints(app.env.Webmaster)
+ router := handlers.RegisterEndpoints(app)
srv := &http.Server{
- Addr: fmt.Sprintf(":%d", app.env.AppPort),
- ErrorLog: app.err,
+ Addr: fmt.Sprintf(":%d", app.Env.AppPort),
+ ErrorLog: app.Err,
Handler: router,
}
err = srv.ListenAndServe()
- app.err.Fatal(err)
+ app.Err.Fatal(err)
}
diff --git a/cmd/web/types/application.go b/cmd/web/types/application.go
new file mode 100644
index 0000000..c981d64
--- /dev/null
+++ b/cmd/web/types/application.go
@@ -0,0 +1,15 @@
+package types
+
+import (
+ "log"
+
+ "paterissa.net/mblog/internal/context"
+)
+
+type Application struct {
+ Err *log.Logger
+ Info *log.Logger
+
+ Env context.Environment
+}
+
diff --git a/go.mod b/go.mod
index 4813bb2..73a4b66 100644
--- a/go.mod
+++ b/go.mod
@@ -5,4 +5,5 @@ go 1.23.5
require (
github.com/gorilla/mux v1.8.1
github.com/joho/godotenv v1.5.1
+ github.com/yuin/goldmark v1.7.11
)
diff --git a/go.sum b/go.sum
index 2788c54..b71740d 100644
--- a/go.sum
+++ b/go.sum
@@ -2,3 +2,5 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
+github.com/yuin/goldmark v1.7.11 h1:ZCxLyDMtz0nT2HFfsYG8WZ47Trip2+JyLysKcMYE5bo=
+github.com/yuin/goldmark v1.7.11/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=