Skip to content

Commit

Permalink
Made it possible to open files with the default browser.
Browse files Browse the repository at this point in the history
  • Loading branch information
a-h committed Sep 23, 2020
1 parent f259e05 commit a7b37b0
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 13 deletions.
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -8,5 +8,5 @@ require (
github.com/mattn/go-runewidth v0.0.9
github.com/natefinch/atomic v0.0.0-20200526193002-18c0533a5b09
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
golang.org/x/text v0.3.3 // indirect
golang.org/x/text v0.3.3
)
2 changes: 0 additions & 2 deletions go.sum
@@ -1,6 +1,4 @@
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/a-h/gemini v0.0.14 h1:p3ZJOv4Fqu34P7P2B080B+nnBJSbEtnOwhkZQNZOpoY=
github.com/a-h/gemini v0.0.14/go.mod h1:p9wvIRDc2s3Lnbkw7CgNzDNgJHPuXDwh3dOF7w0NT8s=
github.com/a-h/gemini v0.0.44 h1:mK+WFhHVoGxRtR9Z3/1Lc5wqLgkkR966Xcm41V54Rb0=
github.com/a-h/gemini v0.0.44/go.mod h1:PatDaeVQiNS3FNRktd3EwcL/0Vr6D/FgSBnq/8oIJt8=
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
Expand Down
47 changes: 37 additions & 10 deletions main.go
Expand Up @@ -523,21 +523,26 @@ func handleSuccessResponse(state *State) {
return
}
if !(mediaType == "text/gemini" || mediaType == "text/plain") {
opts := []string{"Open", "Save", "Cancel"}
if !strings.HasPrefix(mediaType, "text/") {
opts = []string{"Save", "Cancel"}
}
fileName := getFileNameFromURL(state.U, mediaType)
switch NewOptions(state.Screen, fmt.Sprintf("Server returned a %q file (%v)\n\n%s", meta, fileName, state.U.String()), opts...).Focus() {
case "Save":
err := atomic.WriteFile(fileName, state.Response.Body)
tmp := path.Join(os.TempDir(), fileName)
err := atomic.WriteFile(tmp, state.Response.Body)
if err != nil {
NewOptions(state.Screen, fmt.Sprintf("Failed to save file: %v", err), "OK").Focus()
return
}
switch NewOptions(state.Screen, fmt.Sprintf("Server returned a %q file (%v)\n\n%s", meta, fileName, state.U.String()), "Open", "Keep", "Discard").Focus() {
case "Open":
browser.OpenFile(tmp)
case "Keep":
_, err = copy(tmp, fileName)
if err != nil {
NewOptions(state.Screen, fmt.Sprintf("Failed to save file: %v", err), "OK").Focus()
return
}
return
case "Cancel":
return
case "Discard":
os.Remove(tmp)
}
return
}
// Use the charset to load the content.
var cs string
Expand All @@ -562,6 +567,28 @@ func handleSuccessResponse(state *State) {
return
}

func copy(src, dst string) (int64, error) {
sourceFileStat, err := os.Stat(src)
if err != nil {
return 0, err
}
if !sourceFileStat.Mode().IsRegular() {
return 0, fmt.Errorf("%s is not a regular file", src)
}
source, err := os.Open(src)
if err != nil {
return 0, err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return 0, err
}
defer destination.Close()
nBytes, err := io.Copy(destination, source)
return nBytes, err
}

func getFileNameFromURL(u *url.URL, mimeType string) string {
fileName := path.Base(u.String())
if fileName == "." {
Expand Down

0 comments on commit a7b37b0

Please sign in to comment.