Compare commits

..

10 Commits

Author SHA1 Message Date
f7fc2e4b94 Update README 2023-12-04 20:04:53 -08:00
7e034e3779 Update README 2022-07-14 14:19:36 -07:00
a1ea695846 Switch to foosoft.net imports 2022-07-03 20:24:49 -07:00
242a14086d Update goldsmith 2022-05-15 18:32:10 -07:00
e92528b04c Add filters to files to be output 2022-05-14 20:52:32 -07:00
fe86afed2e Fix build script 2022-05-08 18:01:00 -07:00
9883eb5a8c Fix README 2022-05-08 17:53:43 -07:00
d049bd6818 Update README 2022-05-08 17:51:59 -07:00
ab10b65a96 Add readme 2022-05-08 17:39:37 -07:00
f5ac804c2b Cleanup 2022-05-08 16:59:37 -07:00
5 changed files with 118 additions and 48 deletions

36
README.md Normal file
View File

@ -0,0 +1,36 @@
# MdView
MdView is a tool for viewing [GitHub Flavored Markdown](https://github.github.com/gfm/) files in your web browser.
MdView recursively renders the parent directory of the user-provided file and serves its contents over HTTP on port
8080. The default browser is then launched, displaying the Markdown file as an HTML document.
## Features
* Works on Linux, Mac OS, and Windows.
* Single executable; no installation or configuration required.
* Preview is automatically refreshed when source files change.
* Output supports GitHub styles, including light and dark modes.
* Automatically skips any included front matter header data.
## Usage
Simply execute MdView with the path of the Markdown file you wish to view:
```
mdview path/to/file.md
```
Execute MdView with `--help` to view options:
```
Usage mdview [options] [path]
Parameters:
-port int
port (default 8080)
```
## Installation
If you already have the Go environment and toolchain set up, you can get the latest version by running:
```
go install foosoft.net/projects/mdview@latest
```
Otherwise, you can use the [pre-built binaries](https://github.com/FooSoft/mdview/releases) from the project page.

View File

@ -6,17 +6,17 @@ export GOARCH=amd64
export GOOS=windows
go build -o ./build/$GOOS/mdview/ .
pushd build/$GOOS
7za a mdview.zip mdview
7za a mdview.$GOOS.zip mdview
popd
export GOOS=linux
go build -o ./build/$GOOS/mdview/ .
pushd build/$GOOS
tar czvf mdview.tar.gz mdview
tar czvf mdview.$GOOS.tar.gz mdview
popd
export GOOS=darwin
go build -o ./build/$GOOS/mdview/ .
pushd build/$GOOS
tar czvf mdview.tar.gz mdview
tar czvf mdview.$GOOS.tar.gz mdview
popd

22
go.mod
View File

@ -1,12 +1,24 @@
module github.com/FooSoft/mdview
module foosoft.net/projects/mdview
go 1.16
go 1.18
require (
github.com/FooSoft/goldsmith v0.0.0-20220410034610-83530f1b2fe4
github.com/FooSoft/goldsmith-components v0.0.0-20220508182802-63c3f1cb515d
foosoft.net/projects/goldsmith v0.0.0-20220704005305-57dfa350ee16
foosoft.net/projects/goldsmith-components v0.0.0-20220704013648-0ef739189a6a
github.com/PuerkitoBio/goquery v1.8.0
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/toqueteos/webbrowser v1.2.0
github.com/yuin/goldmark v1.4.12
)
require (
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/bmatcuk/doublestar v1.3.4 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/naoina/go-stringutil v0.1.0 // indirect
github.com/naoina/toml v0.1.1 // indirect
github.com/rogpeppe/go-internal v1.8.1 // indirect
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 // indirect
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

49
go.sum
View File

@ -1,53 +1,46 @@
github.com/FooSoft/goldsmith v0.0.0-20220410034610-83530f1b2fe4 h1:W2bAdY9EnmttiB4RpUxKGWG3pfdI/3P5Prz+zq41SSI=
github.com/FooSoft/goldsmith v0.0.0-20220410034610-83530f1b2fe4/go.mod h1:4Xvg5yaavuqsFYPiQgc2bB3R3O+qZrWxgvfIQTZxt34=
github.com/FooSoft/goldsmith-components v0.0.0-20220508182802-63c3f1cb515d h1:SIyviizjazDK9ChRWZmdYiQjHr1f0aZ9RVPkTW7nHww=
github.com/FooSoft/goldsmith-components v0.0.0-20220508182802-63c3f1cb515d/go.mod h1:YZzhSiGmvUYvL9mnv0iBoMFZspACi5dQuMzAeLIqwsU=
foosoft.net/projects/goldsmith v0.0.0-20220704005305-57dfa350ee16 h1:l1frLxPKO6q4OFj03MlDtV5D+6ao3LOC3Nos4oMBvmA=
foosoft.net/projects/goldsmith v0.0.0-20220704005305-57dfa350ee16/go.mod h1:/wzELI7txdHxRKr/koeTN9PlulwIB4Mtw9kzU4JRfUA=
foosoft.net/projects/goldsmith-components v0.0.0-20220704013648-0ef739189a6a h1:ovW8xNmxqWHC7rdeOD+A52hE4/PMa2IzDEH8QmSTXIU=
foosoft.net/projects/goldsmith-components v0.0.0-20220704013648-0ef739189a6a/go.mod h1:/gU7EOC+3C7aBbNNK6iBzVCpLINP6UK2m7wu5DHOkLk=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0=
github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/fsnotify/fsnotify v1.5.3 h1:vNFpj2z7YIbwh2bw7x35sqYpp2wfuq+pivKbWG09B8c=
github.com/fsnotify/fsnotify v1.5.3/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA=
github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks=
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8=
github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/tdewolff/minify/v2 v2.11.2/go.mod h1:NxozhBtgUVypPLzQdV96wkIu9J9vAiVmBcKhfC2zMfg=
github.com/tdewolff/parse/v2 v2.5.29/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
github.com/yuin/goldmark v1.4.12 h1:6hffw6vALvEDqJ19dOJvJKOoAOKe4NDaTqvd2sktGN0=
github.com/yuin/goldmark v1.4.12/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

53
main.go
View File

@ -12,11 +12,14 @@ import (
"strings"
"syscall"
"github.com/FooSoft/goldsmith"
"github.com/FooSoft/goldsmith-components/devserver"
"github.com/FooSoft/goldsmith-components/plugins/document"
"github.com/FooSoft/goldsmith-components/plugins/livejs"
"github.com/FooSoft/goldsmith-components/plugins/markdown"
"foosoft.net/projects/goldsmith"
"foosoft.net/projects/goldsmith-components/devserver"
"foosoft.net/projects/goldsmith-components/filters/operator"
"foosoft.net/projects/goldsmith-components/filters/wildcard"
"foosoft.net/projects/goldsmith-components/plugins/document"
"foosoft.net/projects/goldsmith-components/plugins/frontmatter"
"foosoft.net/projects/goldsmith-components/plugins/livejs"
"foosoft.net/projects/goldsmith-components/plugins/markdown"
"github.com/PuerkitoBio/goquery"
"github.com/toqueteos/webbrowser"
"github.com/yuin/goldmark"
@ -59,8 +62,25 @@ func (self *builder) Build(contentDir, buildDir, cacheDir string) {
goldmark.WithRendererOptions(html.WithUnsafe()),
)
allowedPaths := []string{
"**/*.gif",
"**/*.html",
"**/*.jpeg",
"**/*.jpg",
"**/*.md",
"**/*.png",
"**/*.svg",
}
forbiddenPaths := []string{
"**/.*/**",
}
errs := goldsmith.Begin(contentDir).
Clean(true).
FilterPush(wildcard.New(allowedPaths...)).
FilterPush(operator.Not(wildcard.New(forbiddenPaths...))).
Chain(frontmatter.New()).
Chain(markdown.NewWithGoldmark(gm)).
Chain(livejs.New()).
Chain(document.New(embedCss)).
@ -71,29 +91,38 @@ func (self *builder) Build(contentDir, buildDir, cacheDir string) {
}
if !self.open {
webbrowser.Open(fmt.Sprintf("http://127.0.0.1:%d/%s", self.port, self.path))
url := fmt.Sprintf("http://127.0.0.1:%d/%s", self.port, self.path)
log.Printf("opening %s in browser...", url)
webbrowser.Open(url)
self.open = true
}
}
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage %s [options] [path]\n\n", filepath.Base(os.Args[0]))
fmt.Fprintln(os.Stderr, "Parameters:")
flag.PrintDefaults()
}
port := flag.Int("port", 8080, "port")
flag.Parse()
if flag.NArg() != 1 {
log.Fatal("unexpected number of arguments")
flag.Usage()
os.Exit(2)
}
requestPath := flag.Arg(0)
info, err := os.Stat(requestPath)
path := flag.Arg(0)
info, err := os.Stat(path)
if err != nil {
log.Fatal(err)
}
var contentName string
contentDir := requestPath
contentDir := path
if !info.IsDir() {
contentName = filepath.Base(requestPath)
contentName = filepath.Base(path)
contentExt := filepath.Ext(contentName)
switch contentExt {
case ".md", ".markdown":
@ -101,7 +130,7 @@ func main() {
contentName += ".html"
}
contentDir = filepath.Dir(requestPath)
contentDir = filepath.Dir(path)
}
buildDir, err := ioutil.TempDir("", "mvd-*")