Skip to content

Commit bdbded5

Browse files
authored
feat: Support preview markdown from stdin (#71)
1 parent 59901e9 commit bdbded5

File tree

5 files changed

+67
-16
lines changed

5 files changed

+67
-16
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ Or this command will detect README file in the directory automatically.
5151
gh markdown-preview
5252
```
5353

54+
You can also preview Markdown from stdin by piping or using `-`:
55+
56+
```
57+
echo "# Hello" | gh markdown-preview
58+
cat README.md | gh markdown-preview
59+
gh markdown-preview - < README.md
60+
```
61+
5462
Then access the local web server such as `http://localhost:3333` with Chrome, Firefox, or Safari.
5563

5664
Available options:

cmd/app_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestGh(t *testing.T) {
7575

7676
func TestToHTML(t *testing.T) {
7777
markdown := "text"
78-
html, err := toHTML(markdown)
78+
html, err := toHTML(markdown, &Param{})
7979
if err != nil {
8080
t.Errorf(err.Error())
8181
}
@@ -91,7 +91,7 @@ func TestGfmCheckboxes(t *testing.T) {
9191
if err != nil {
9292
t.Errorf(err.Error())
9393
}
94-
html, err := toHTML(string)
94+
html, err := toHTML(string, &Param{})
9595
if err != nil {
9696
t.Errorf(err.Error())
9797
}
@@ -126,7 +126,7 @@ func TestGfmAlerts(t *testing.T) {
126126
if err != nil {
127127
t.Errorf(err.Error())
128128
}
129-
html, err := toHTML(string)
129+
html, err := toHTML(string, &Param{})
130130
if err != nil {
131131
t.Errorf(err.Error())
132132
}

cmd/cli.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"fmt"
5+
"io"
56
"log"
67
"os"
78

@@ -19,6 +20,9 @@ type Param struct {
1920
forceLightMode bool
2021
forceDarkMode bool
2122
autoOpen bool
23+
// stdin support
24+
useStdin bool
25+
stdinContent string
2226
}
2327

2428
var rootCmd = &cobra.Command{
@@ -61,13 +65,36 @@ var rootCmd = &cobra.Command{
6165
autoOpen = false
6266
}
6367

68+
// Detect stdin usage
69+
useStdin := false
70+
stdinContent := ""
71+
if filename == "-" {
72+
data, err := io.ReadAll(os.Stdin)
73+
if err != nil {
74+
log.Fatalf("Error reading stdin: %v", err)
75+
}
76+
stdinContent = string(data)
77+
useStdin = true
78+
} else if filename == "" {
79+
if fi, _ := os.Stdin.Stat(); (fi.Mode() & os.ModeCharDevice) == 0 {
80+
data, err := io.ReadAll(os.Stdin)
81+
if err != nil {
82+
log.Fatalf("Error reading stdin: %v", err)
83+
}
84+
stdinContent = string(data)
85+
useStdin = true
86+
}
87+
}
88+
6489
param := &Param{
6590
filename: filename,
6691
markdownMode: markdownMode,
6792
reload: reload,
6893
forceLightMode: forceLightMode,
6994
forceDarkMode: forceDarkMode,
7095
autoOpen: autoOpen,
96+
useStdin: useStdin,
97+
stdinContent: stdinContent,
7198
}
7299

73100
err := server.Serve(param)

cmd/server.go

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,14 @@ func (server *Server) Serve(param *Param) error {
4040
port = server.port
4141
}
4242

43-
filename, err := targetFile(param.filename)
44-
if err != nil {
45-
return err
43+
// Use a empty filename for stdin
44+
filename := ""
45+
if !param.useStdin {
46+
var err error
47+
filename, err = targetFile(param.filename)
48+
if err != nil {
49+
return err
50+
}
4651
}
4752

4853
dir := filepath.Dir(filename)
@@ -96,10 +101,15 @@ func handler(filename string, param *Param, h http.Handler) http.Handler {
96101
return
97102
}
98103

99-
markdown, err := slurp(filename)
100-
if err != nil {
101-
http.Error(w, err.Error(), http.StatusInternalServerError)
102-
return
104+
var markdown string
105+
if param.useStdin && param.stdinContent != "" && filename == "" {
106+
markdown = param.stdinContent
107+
} else {
108+
markdown, err = slurp(filename)
109+
if err != nil {
110+
http.Error(w, err.Error(), http.StatusInternalServerError)
111+
return
112+
}
103113
}
104114

105115
html, err := toHTML(markdown, param)
@@ -118,11 +128,16 @@ func handler(filename string, param *Param, h http.Handler) http.Handler {
118128

119129
func mdResponse(w http.ResponseWriter, filename string, param *Param) {
120130
w.Header().Set("Content-Type", "text/html; charset=utf-8")
121-
122-
markdown, err := slurp(filename)
123-
if err != nil {
124-
http.Error(w, err.Error(), 500)
125-
return
131+
var markdown string
132+
var err error
133+
if param.useStdin && param.stdinContent != "" && filename == "" {
134+
markdown = param.stdinContent
135+
} else {
136+
markdown, err = slurp(filename)
137+
if err != nil {
138+
http.Error(w, err.Error(), 500)
139+
return
140+
}
126141
}
127142

128143
html, err := toHTML(markdown, param)

cmd/server_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ func TestHandler(t *testing.T) {
4343

4444
func TestMdHandler(t *testing.T) {
4545
filename := "../testdata/markdown-demo.md"
46-
ts := httptest.NewServer(mdHandler(filename))
46+
param := &Param{reload: false}
47+
ts := httptest.NewServer(mdHandler(filename, param))
4748
defer ts.Close()
4849

4950
res, err := http.Get(ts.URL)

0 commit comments

Comments
 (0)