You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.5 KiB
121 lines
2.5 KiB
package ui |
|
|
|
import ( |
|
"fmt" |
|
"os" |
|
"os/exec" |
|
"strings" |
|
"unicode/utf8" |
|
) |
|
|
|
func openURL(tv *TutView, url string) { |
|
for _, m := range tv.tut.Config.OpenPattern.Patterns { |
|
if m.Compiled.Match(url) { |
|
args := append(m.Args, url) |
|
if m.Terminal { |
|
openInTerminal(tv, m.Program, args...) |
|
} else { |
|
exec.Command(m.Program, args...).Start() |
|
} |
|
return |
|
} |
|
} |
|
args := append(tv.tut.Config.Media.LinkArgs, url) |
|
if tv.tut.Config.Media.LinkTerminal { |
|
openInTerminal(tv, tv.tut.Config.Media.LinkViewer, args...) |
|
} else { |
|
exec.Command(tv.tut.Config.Media.LinkViewer, args...).Start() |
|
} |
|
} |
|
|
|
func openInTerminal(tv *TutView, command string, args ...string) error { |
|
cmd := exec.Command(command, args...) |
|
cmd.Stdin = os.Stdin |
|
cmd.Stdout = os.Stdout |
|
cmd.Stderr = os.Stderr |
|
var err error |
|
tv.tut.App.Suspend(func() { |
|
err = cmd.Run() |
|
}) |
|
if err != nil { |
|
tv.ShowError(fmt.Sprintf("Eroror while opening: %v", err)) |
|
} |
|
return nil |
|
} |
|
|
|
func openCustom(tv *TutView, program string, args []string, terminal bool, url string) { |
|
args = append(args, url) |
|
if terminal { |
|
openInTerminal(tv, program, args...) |
|
} else { |
|
exec.Command(program, args...).Start() |
|
} |
|
} |
|
|
|
func OpenEditorLengthLimit(tv *TutView, s string, limit int) (string, error) { |
|
text, err := OpenEditor(tv, s) |
|
if err != nil { |
|
return text, err |
|
} |
|
s = strings.TrimSpace(text) |
|
|
|
if utf8.RuneCountInString(s) > limit { |
|
ns := "" |
|
i := 0 |
|
for _, r := range s { |
|
if i >= limit { |
|
break |
|
} |
|
ns += string(r) |
|
i++ |
|
} |
|
s = ns |
|
} |
|
return s, nil |
|
} |
|
|
|
func OpenEditor(tv *TutView, content string) (string, error) { |
|
var editor string |
|
var exists bool |
|
if tv.tut.Config.General.Editor == strings.TrimSpace("$EDITOR") { |
|
editor, exists = os.LookupEnv("EDITOR") |
|
if !exists || editor == "" { |
|
editor = "vi" |
|
} |
|
} else { |
|
editor = strings.TrimSpace(tv.tut.Config.General.Editor) |
|
} |
|
args := []string{} |
|
parts := strings.Split(editor, " ") |
|
if len(parts) > 1 { |
|
args = append(args, parts[1:]...) |
|
editor = parts[0] |
|
} |
|
f, err := os.CreateTemp("", "tut") |
|
if err != nil { |
|
return "", err |
|
} |
|
if content != "" { |
|
_, err = f.WriteString(content) |
|
if err != nil { |
|
return "", err |
|
} |
|
} |
|
fname := f.Name() |
|
args = append(args, fname) |
|
f.Close() |
|
cmd := exec.Command(editor, args...) |
|
cmd.Stdin = os.Stdin |
|
cmd.Stdout = os.Stdout |
|
cmd.Stderr = os.Stderr |
|
var text []byte |
|
tv.tut.App.Suspend(func() { |
|
cmd.Run() |
|
text, err = os.ReadFile(fname) |
|
}) |
|
os.Remove(fname) |
|
if err != nil { |
|
return "", err |
|
} |
|
return strings.TrimSpace(string(text)), nil |
|
}
|
|
|