/
nvimboat.go
113 lines (105 loc) · 2.5 KB
/
nvimboat.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
104
105
106
107
108
109
110
111
112
113
package nvimboat
import (
"database/sql"
"os"
"github.com/neovim/go-client/nvim"
)
func (nb *Nvimboat) Push(newPage Page) (err error) {
err = nb.Show(newPage)
if err != nil {
return
}
switch page := newPage.(type) {
case *Article:
nb.SyncDBchan <- SyncDB{Unread: 0, ArticleUrls: []string{page.Url}}
}
switch page := nb.Pages.Top().(type) {
case *Filter:
idx, err := page.ChildIdx(newPage)
if err != nil {
return err
}
page.Articles[idx].Unread = 0
}
nb.Pages.Push(newPage)
return
}
func (nb *Nvimboat) Pop() (err error) {
currentPage := nb.Pages.Top()
nb.Pages.Pop()
pos, err := nb.Pages.Top().ChildIdx(currentPage)
if err != nil {
return
}
page, err := nb.Pages.Top().QuerySelf(nb.DBHandler)
if err != nil {
return
}
err = nb.Show(page)
if err != nil {
return
}
err = nb.Nvim.SetWindowCursor(*nb.Window, [2]int{pos + 1, 0})
return
}
func (nb *Nvimboat) Show(newPage Page) (err error) {
defer trimTrail(nb.Nvim, *nb.Buffer)
err = setLines(nb.Nvim, *nb.Buffer, []string{""})
if err != nil {
return
}
err = newPage.Render(nb.Nvim, *nb.Buffer, nb.UnreadOnly, nb.Config["separator"].(string))
if err != nil {
return
}
err = nb.setPageType(newPage)
return
}
func (nb *Nvimboat) init(nv *nvim.Nvim) (err error) {
nb.Nvim = nv
nb.SyncDBchan = make(chan SyncDB)
nb.Config = make(map[string]any)
nb.Window = new(nvim.Window)
nb.Buffer = new(nvim.Buffer)
nb.UnreadOnly = false
execBatch := nv.NewBatch()
execBatch.CurrentWindow(nb.Window)
execBatch.CurrentBuffer(nb.Buffer)
execBatch.ExecLua(nvimboatConfig, &nb.Config)
execBatch.ExecLua(nvimboatFeeds, &nb.Feeds)
execBatch.ExecLua(nvimboatFilters, &nb.Filters)
execBatch.SetBufferOption(*nb.Buffer, "filetype", "nvimboat")
execBatch.SetBufferOption(*nb.Buffer, "buftype", "nofile")
execBatch.SetWindowOption(*nb.Window, "wrap", false)
err = execBatch.Execute()
if err != nil {
return
}
nb.DBHandler, err = initDB(nb.Config["dbpath"].(string))
if err != nil {
return
}
err = SetupLogging(nb.Config["log"].(string))
return
}
func (nb *Nvimboat) setPageType(p Page) (err error) {
t := pageTypeString(p)
err = nb.Nvim.ExecLua(nvimboatSetPageType, new(any), t)
return
}
type (
Nvimboat struct {
Config map[string]any
Pages PageStack
Feeds []map[string]any
Filters []map[string]any
LogFile *os.File
DBHandler *sql.DB
SyncDBchan chan SyncDB
Nvim *nvim.Nvim
Window *nvim.Window
Buffer *nvim.Buffer
UnreadOnly bool
}
Action func(*Nvimboat, *nvim.Nvim, ...string) error
)