Compare commits
No commits in common. "f7fc2e4b94a3ed3347069e8bfcb7cb1ac9987301" and "60617398f27b2ca457ffc0e5a01bfe49fe5d69b9" have entirely different histories.
f7fc2e4b94
...
60617398f2
36
README.md
36
README.md
@ -1,36 +0,0 @@
|
||||
# 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.
|
6
build.sh
6
build.sh
@ -6,17 +6,17 @@ export GOARCH=amd64
|
||||
export GOOS=windows
|
||||
go build -o ./build/$GOOS/mdview/ .
|
||||
pushd build/$GOOS
|
||||
7za a mdview.$GOOS.zip mdview
|
||||
7za a mdview.zip mdview
|
||||
popd
|
||||
|
||||
export GOOS=linux
|
||||
go build -o ./build/$GOOS/mdview/ .
|
||||
pushd build/$GOOS
|
||||
tar czvf mdview.$GOOS.tar.gz mdview
|
||||
tar czvf mdview.tar.gz mdview
|
||||
popd
|
||||
|
||||
export GOOS=darwin
|
||||
go build -o ./build/$GOOS/mdview/ .
|
||||
pushd build/$GOOS
|
||||
tar czvf mdview.$GOOS.tar.gz mdview
|
||||
tar czvf mdview.tar.gz mdview
|
||||
popd
|
||||
|
22
go.mod
22
go.mod
@ -1,24 +1,12 @@
|
||||
module foosoft.net/projects/mdview
|
||||
module github.com/FooSoft/mdview
|
||||
|
||||
go 1.18
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
foosoft.net/projects/goldsmith v0.0.0-20220704005305-57dfa350ee16
|
||||
foosoft.net/projects/goldsmith-components v0.0.0-20220704013648-0ef739189a6a
|
||||
github.com/FooSoft/goldsmith v0.0.0-20220410034610-83530f1b2fe4
|
||||
github.com/FooSoft/goldsmith-components v0.0.0-20220508182802-63c3f1cb515d
|
||||
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
49
go.sum
@ -1,46 +1,53 @@
|
||||
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/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=
|
||||
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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
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/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
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/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/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/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/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/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
53
main.go
@ -12,14 +12,11 @@ import (
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"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/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"
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
"github.com/toqueteos/webbrowser"
|
||||
"github.com/yuin/goldmark"
|
||||
@ -62,25 +59,8 @@ 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)).
|
||||
@ -91,38 +71,29 @@ func (self *builder) Build(contentDir, buildDir, cacheDir string) {
|
||||
}
|
||||
|
||||
if !self.open {
|
||||
url := fmt.Sprintf("http://127.0.0.1:%d/%s", self.port, self.path)
|
||||
log.Printf("opening %s in browser...", url)
|
||||
webbrowser.Open(url)
|
||||
webbrowser.Open(fmt.Sprintf("http://127.0.0.1:%d/%s", self.port, self.path))
|
||||
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 {
|
||||
flag.Usage()
|
||||
os.Exit(2)
|
||||
log.Fatal("unexpected number of arguments")
|
||||
}
|
||||
|
||||
path := flag.Arg(0)
|
||||
info, err := os.Stat(path)
|
||||
requestPath := flag.Arg(0)
|
||||
info, err := os.Stat(requestPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
var contentName string
|
||||
contentDir := path
|
||||
contentDir := requestPath
|
||||
if !info.IsDir() {
|
||||
contentName = filepath.Base(path)
|
||||
contentName = filepath.Base(requestPath)
|
||||
contentExt := filepath.Ext(contentName)
|
||||
switch contentExt {
|
||||
case ".md", ".markdown":
|
||||
@ -130,7 +101,7 @@ func main() {
|
||||
contentName += ".html"
|
||||
}
|
||||
|
||||
contentDir = filepath.Dir(path)
|
||||
contentDir = filepath.Dir(requestPath)
|
||||
}
|
||||
|
||||
buildDir, err := ioutil.TempDir("", "mvd-*")
|
||||
|
Loading…
Reference in New Issue
Block a user