summaryrefslogtreecommitdiff
path: root/files.go
diff options
context:
space:
mode:
Diffstat (limited to 'files.go')
-rw-r--r--files.go93
1 files changed, 90 insertions, 3 deletions
diff --git a/files.go b/files.go
index e5fba09..f818ddb 100644
--- a/files.go
+++ b/files.go
@@ -4,6 +4,7 @@ import (
"bufio"
"errors"
"fmt"
+ "net/url"
"os"
"path/filepath"
"strings"
@@ -16,6 +17,7 @@ type Config struct {
DefaultScheme string `toml:"default_scheme"`
SoftWrap int `toml:"soft_wrap"`
DownloadFolder string `toml:"download_folder"`
+ VimKeys bool `toml:"vim_keys"`
}
func getConfig() (*Config, error) {
@@ -31,6 +33,7 @@ func getConfig() (*Config, error) {
}
c := Config{
+ VimKeys: true,
DefaultScheme: "gemini",
SoftWrap: 80,
DownloadFolder: home,
@@ -56,8 +59,9 @@ func getMarks() (map[string]string, error) {
if err != nil {
return nil, err
}
- rdr := bufio.NewScanner(f)
+ defer func() { _ = f.Close() }()
+ rdr := bufio.NewScanner(f)
for rdr.Scan() {
line := rdr.Text()
name, target, _ := strings.Cut(line, ":")
@@ -76,7 +80,7 @@ func saveMarks(marks map[string]string) error {
return err
}
- f, err := os.OpenFile(path, os.O_WRONLY, 0o600)
+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0o600)
if err != nil {
return err
}
@@ -93,12 +97,95 @@ func saveMarks(marks map[string]string) error {
}
func marksFilePath() (string, error) {
+ return dataFilePath("marks")
+}
+
+func getTours() (map[string]*Tour, error) {
+ path, err := toursFilePath()
+ if err != nil {
+ return nil, err
+ }
+
+ tours := make(map[string]*Tour)
+ var current Tour
+ var currentName string
+
+ f, err := os.Open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer func() { _ = f.Close() }()
+
+ rdr := bufio.NewScanner(f)
+ for rdr.Scan() {
+ line := rdr.Text()
+ if strings.HasSuffix(line, ":") {
+ if currentName != "" {
+ tours[currentName] = &current
+ }
+ currentName = strings.TrimSuffix(line, ":")
+ current = Tour{}
+ } else {
+ u, err := url.Parse(line)
+ if err != nil {
+ return nil, err
+ }
+ current.Links = append(current.Links, u)
+ }
+ }
+ if err := rdr.Err(); err != nil {
+ return nil, err
+ }
+
+ if currentName != "" {
+ tours[currentName] = &current
+ }
+
+ return tours, nil
+}
+
+func saveTours(tours map[string]*Tour) error {
+ path, err := toursFilePath()
+ if err != nil {
+ return err
+ }
+
+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0o600)
+ if err != nil {
+ return err
+ }
+ defer func() { _ = f.Close() }()
+
+ for name, tour := range tours {
+ if len(tour.Links) == 0 {
+ continue
+ }
+
+ if _, err := fmt.Fprintf(f, "%s:\n", name); err != nil {
+ return err
+ }
+
+ for _, link := range tour.Links {
+ if _, err := fmt.Fprintf(f, "%s\n", link.String()); err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
+func toursFilePath() (string, error) {
+ return dataFilePath("tours")
+}
+
+func dataFilePath(filename string) (string, error) {
home := os.Getenv("HOME")
path := os.Getenv("XDG_DATA_HOME")
if path == "" {
path = filepath.Join(home, ".local", "share")
}
- path = filepath.Join(path, "x-1", "marks")
+ path = filepath.Join(path, "x-1", filename)
if err := ensurePath(path); err != nil {
return "", err