package main import ( "fmt" "github.com/gomarkdown/markdown" "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" "html/template" "io" "log" "net/http" "os" "slices" ) func GetHome(w http.ResponseWriter, r *http.Request) { log.Println("Request for:", r.URL.String()) if r.URL.String() != "/" { ErrorPage(w, "Page Not Found.", 404) return } t := template.Must(template.ParseFiles("templates/template.html")) html, err := MarkdownToHTML("static/home.md") if err != nil { ErrorPage(w, "Internal Server Error", 500) } else { t.Execute(w, template.HTML(html)) } } func GetFiles(w http.ResponseWriter, r *http.Request) { log.Println("Request for:", r.URL.String()) url := fmt.Sprintf("static%s", r.URL.String()) allowed := []string{ "static/rss.xml", "static/card", "static/css/main.css", "static/logos/FirstInitialLogo.svg", "static/logos/FullNameLogo.svg", "static/logos/favicon.png", "static/logos/favicon.svg", "static/logos/favicon16.png", "static/logos/favicon32.png", "static/robots.txt", } if slices.Contains(allowed, url) { http.ServeFile(w, r, url) } else { ErrorPage(w, "Page Not Found.", 404) } } func MarkdownToHTML(path string) (string, error) { extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock p := parser.NewWithExtensions(extensions) f, err := os.Open(path) if err != nil { return "", err } defer f.Close() md, err := io.ReadAll(f) if err != nil { return "", err } doc := p.Parse(md) htmlFlags := html.CommonFlags | html.HrefTargetBlank opts := html.RendererOptions{Flags: htmlFlags} renderer := html.NewRenderer(opts) return string(markdown.Render(doc, renderer)), nil } func ErrorPage(w http.ResponseWriter, message string, code int) { log.Println(code, message) t := template.Must(template.ParseFiles("templates/error.html")) t.Execute(w, struct { Code int Message string }{ Code: code, Message: message, }) } func Usage() { fmt.Fprintf(os.Stderr, "%s [--port port]\n", os.Args[0]) } func main() { port := ":8000" for i := 1; i < len(os.Args); i++ { switch os.Args[i] { case "--port": if i+1 >= len(os.Args) { Usage() } else { port = ":" + os.Args[i+1] i++ } default: log.Println("Unknown option: ", os.Args[i]) Usage() } } http.HandleFunc("/robots.txt", GetFiles) http.HandleFunc("/rss.xml", GetFiles) http.HandleFunc("/card", GetFiles) http.HandleFunc("/css/", GetFiles) http.HandleFunc("/logos/", GetFiles) http.HandleFunc("/", GetHome) log.Fatal(http.ListenAndServe(port, nil)) }