diff options
Diffstat (limited to 'files.go')
| -rw-r--r-- | files.go | 93 |
1 files changed, 90 insertions, 3 deletions
@@ -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] = ¤t + } + 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] = ¤t + } + + 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 |
