mdview/main.go

119 lines
2.5 KiB
Go
Raw Normal View History

2022-05-08 16:09:29 +00:00
package main
import (
2022-05-08 18:00:38 +00:00
_ "embed"
2022-05-08 16:09:29 +00:00
"flag"
2022-05-08 17:19:48 +00:00
"fmt"
2022-05-08 16:09:29 +00:00
"io/ioutil"
"log"
"os"
2022-05-08 17:19:48 +00:00
"os/signal"
2022-05-08 16:09:29 +00:00
"path/filepath"
2022-05-08 18:00:38 +00:00
"strings"
2022-05-08 17:19:48 +00:00
"syscall"
2022-05-08 16:09:29 +00:00
"github.com/FooSoft/goldsmith"
"github.com/FooSoft/goldsmith-components/devserver"
2022-05-08 18:00:38 +00:00
"github.com/FooSoft/goldsmith-components/plugins/document"
2022-05-08 16:09:29 +00:00
"github.com/FooSoft/goldsmith-components/plugins/livejs"
"github.com/FooSoft/goldsmith-components/plugins/markdown"
2022-05-08 18:00:38 +00:00
"github.com/PuerkitoBio/goquery"
2022-05-08 17:19:48 +00:00
"github.com/toqueteos/webbrowser"
2022-05-08 16:09:29 +00:00
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
2022-05-08 18:00:38 +00:00
//go:embed github-markdown.css
var githubStyle string
//go:embed github-fixup.css
var githubFixup string
2022-05-08 17:19:48 +00:00
type builder struct {
port int
browsing bool
}
2022-05-08 16:09:29 +00:00
2022-05-08 18:00:38 +00:00
func embedCss(file *goldsmith.File, doc *goquery.Document) error {
var styleBuilder strings.Builder
styleBuilder.WriteString("<style type=\"text/css\">\n")
styleBuilder.WriteString(githubStyle)
styleBuilder.WriteString(githubFixup)
styleBuilder.WriteString("</style>")
doc.Find("body").AddClass("markdown-body")
doc.Find("head").SetHtml(styleBuilder.String())
return nil
}
2022-05-08 16:09:29 +00:00
func (self *builder) Build(contentDir, buildDir, cacheDir string) {
log.Print("building...")
gm := goldmark.New(
goldmark.WithExtensions(extension.GFM, extension.Typographer),
goldmark.WithParserOptions(parser.WithAutoHeadingID()),
goldmark.WithRendererOptions(html.WithUnsafe()),
)
errs := goldsmith.Begin(contentDir).
Clean(true).
Chain(markdown.NewWithGoldmark(gm)).
Chain(livejs.New()).
2022-05-08 18:00:38 +00:00
Chain(document.New(embedCss)).
2022-05-08 16:09:29 +00:00
End(buildDir)
for _, err := range errs {
log.Print(err)
}
2022-05-08 17:19:48 +00:00
if !self.browsing {
webbrowser.Open(fmt.Sprintf("http://127.0.0.1:%d", self.port))
self.browsing = true
}
2022-05-08 16:09:29 +00:00
}
func main() {
port := flag.Int("port", 8080, "port")
flag.Parse()
if flag.NArg() != 1 {
log.Fatal("unexpected number of arguments")
}
requestPath := flag.Arg(0)
info, err := os.Stat(requestPath)
if err != nil {
log.Fatal(err)
}
contentDir := requestPath
if !info.IsDir() {
contentDir = filepath.Dir(requestPath)
}
2022-05-08 18:00:38 +00:00
buildDir, err := ioutil.TempDir("", "mvd-*")
if err != nil {
log.Fatal(err)
}
defer func() {
log.Println("cleaning up...")
if err := os.RemoveAll(buildDir); err != nil {
log.Fatal(err)
}
}()
2022-05-08 17:19:48 +00:00
go func() {
b := &builder{port: *port}
devserver.DevServe(b, *port, contentDir, buildDir, "")
}()
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
2022-05-08 18:00:38 +00:00
<-sigs
2022-05-08 16:09:29 +00:00
}