This repository has been archived by the owner on Mar 20, 2022. It is now read-only.
/
editor.go
103 lines (85 loc) · 2.54 KB
/
editor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package docbasecli
// The original implementation can be found below.
// https://samrapdev.com/capturing-sensitive-input-with-editor-in-golang-from-the-cli/
import (
"context"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"runtime"
"strings"
"github.com/micheam/go-docbase"
)
// DefaultEditor is vim because we're adults ;)
const DefaultEditor = "vim"
// PreferredEditorResolver is a function that returns an editor that the user
// prefers to use, such as the configured `$EDITOR` environment variable.
type PreferredEditorResolver func() string
// GetPreferredEditorFromEnvironment returns the user's editor as defined by the
// `$EDITOR` environment variable, or the `DefaultEditor` if it is not set.
func GetPreferredEditorFromEnvironment() string {
editor := os.Getenv("EDITOR")
if editor == "" {
return DefaultEditor
}
return editor
}
func resolveEditorArguments(executable string, filename string) []string {
args := []string{filename}
if strings.Contains(executable, "Visual Studio Code.app") {
args = append([]string{"--wait"}, args...)
}
// Other common editors
return args
}
// OpenFileInEditor opens filename in a text editor.
func OpenFileInEditor(filename string, resolveEditor PreferredEditorResolver) error {
// Get the full executable path for the editor.
executable, err := exec.LookPath(resolveEditor())
if err != nil {
return err
}
cmd := exec.Command(executable, resolveEditorArguments(executable, filename)...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// CaptureInputFromEditor opens a temporary file in a text editor and returns
// the written bytes on success or an error on failure. It handles deletion
// of the temporary file behind the scenes.
func CaptureInputFromEditor(resolveEditor PreferredEditorResolver, file *os.File) ([]byte, error) {
if err := file.Close(); err != nil {
return []byte{}, err
}
if err := OpenFileInEditor(file.Name(), resolveEditor); err != nil {
return []byte{}, err
}
bytes, err := ioutil.ReadFile(file.Name())
if err != nil {
return []byte{}, err
}
return bytes, nil
}
func OpenBrowser(_ context.Context, post docbase.Post) error {
openbrowser(post.URL)
return nil
}
func openbrowser(url string) {
var err error
switch runtime.GOOS {
case "linux":
err = exec.Command("xdg-open", url).Start()
case "windows":
err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
err = exec.Command("open", url).Start()
default:
err = fmt.Errorf("unsupported platform")
}
if err != nil {
log.Fatal(err)
}
}