commit d286c19179e3c573c2f17113c856758a093ec336
parent 5aac27613d2922bb0106337c0ce3b6fcd849465d
Author: Brian C. Lane <bcl@brianlane.com>
Date: Thu, 5 Nov 2020 07:50:20 -0800
Simplify to just a http handler
No need to 'watch' the file, use go routines or channels. Just re-read
it on each request.
Adds actual Markdown to HTML rendering using the blackfriday library.
Diffstat:
5 files changed, 44 insertions(+), 33 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+previewmd
diff --git a/README.md b/README.md
@@ -0,0 +1,10 @@
+# Simple Markdown Preview
+
+No frills, just serve up the raw [Markdown](https://daringfireball.net/projects/markdown/syntax) html
+to a port on localhost.
+
+Build it: `go build ./cmd/previewmd`
+
+Run it: `./previewmd -port 8080 README.md`
+
+Visit http://localhost:8080
diff --git a/cmd/previewmd/main.go b/cmd/previewmd/main.go
@@ -3,9 +3,12 @@ package main
import (
"flag"
"fmt"
+ "io/ioutil"
"log"
+ "net/http"
"os"
- "time"
+
+ "github.com/russross/blackfriday/v2"
)
type cmdlineArgs struct {
@@ -25,53 +28,40 @@ func init() {
flag.Parse()
}
-func PreviewMarkdown(update <-chan string, port int) {
-
- // Read file the first time
- // Render html from markdown
-
- // Setup http server
- for {
- filename := <-update
- fmt.Println(filename)
-
- // re-read the file
-
- // Render html from markdown
- }
-}
-
func main() {
if flag.NArg() == 0 {
flag.Usage()
os.Exit(1)
}
filename := flag.Arg(0)
- lastInfo, err := os.Stat(filename)
+ _, err := os.Stat(filename)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Previewing %s on port %d\n", filename, cfg.Port)
- updatePreview := make(chan string, 1)
- go PreviewMarkdown(updatePreview, cfg.Port)
-
- // Loop, checking the file mtime every second
- // If it has been modified, tell preview to update
- for {
- info, err := os.Stat(filename)
+ preview := func(w http.ResponseWriter, _ *http.Request) {
+ f, err := os.Open(filename)
if err != nil {
- fmt.Println(err)
- time.Sleep(500 * time.Millisecond)
- continue
+ fmt.Printf("Error opening %s: %s\n", filename, err)
+ return
}
- if info.Size() != lastInfo.Size() || info.ModTime() != lastInfo.ModTime() {
- lastInfo = info
- // Send message to preview
- updatePreview <- filename
+ // XXX Is this right inside a loop?
+ defer f.Close()
+ markdown, err := ioutil.ReadAll(f)
+ if err != nil {
+ fmt.Printf("Error reading %s: %s\n", filename, err)
+ return
}
- time.Sleep(1 * time.Second)
+ // Render html from markdown
+ output := blackfriday.Run(markdown)
+ w.Write(output)
}
+
+ http.HandleFunc("/", preview)
+
+ listen := fmt.Sprintf(":%d", cfg.Port)
+ log.Fatal(http.ListenAndServe(listen, nil))
}
diff --git a/go.mod b/go.mod
@@ -1,3 +1,8 @@
module github.com/bcl/previewmd
go 1.15
+
+require (
+ github.com/russross/blackfriday/v2 v2.0.1
+ github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
+)
diff --git a/go.sum b/go.sum
@@ -0,0 +1,5 @@
+github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
+github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=