diff options
author | Samuel Johnson <[email protected]> | 2025-05-03 15:12:04 -0400 |
---|---|---|
committer | Samuel Johnson <[email protected]> | 2025-05-03 15:12:04 -0400 |
commit | 005a588111e6d27b012bc923c39d97a6129f39f2 (patch) | |
tree | 69b2bf16a07bd6ebf97313e9bb9056c57d8bb88c | |
parent | 46cdc7254109aaebf6e8b629cbd8ecb46c7ad21b (diff) |
Implement basic parser endpoint
-rw-r--r-- | cmd/parser/main.go | 81 | ||||
-rw-r--r-- | cmd/web/handlers/blog.go | 12 | ||||
-rw-r--r-- | cmd/web/handlers/routes.go | 10 | ||||
-rw-r--r-- | cmd/web/main.go | 35 | ||||
-rw-r--r-- | cmd/web/types/application.go | 15 | ||||
-rw-r--r-- | go.mod | 1 | ||||
-rw-r--r-- | go.sum | 2 |
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 +} + @@ -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 ) @@ -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= |