-
Notifications
You must be signed in to change notification settings - Fork 1
/
misc.go
98 lines (86 loc) · 1.65 KB
/
misc.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
package csvi
import (
"strings"
"github.com/mattn/go-runewidth"
)
func cutStrInWidth(s string, cellwidth int) (string, int) {
w := 0
for n, c := range s {
w1 := runewidth.RuneWidth(c)
if w+w1 > cellwidth {
return s[:n], w
}
w += w1
}
return s, w
}
type Candidate []string
func (c Candidate) Len() int {
return len(c)
}
func (c Candidate) At(n int) string {
return c[len(c)-n-1]
}
func (c Candidate) Delimiters() string {
return ""
}
func (c Candidate) Enclosures() string {
return ""
}
func (c Candidate) List(field []string) (fullnames, basenames []string) {
return c, c
}
func makeCandidate(row, col int, cursor *RowPtr) Candidate {
result := Candidate(make([]string, 0, 100))
set := make(map[string]struct{})
for ; cursor != nil; cursor = cursor.Prev() {
if col >= len(cursor.Cell) {
break
}
value := cursor.Cell[col].Text()
if value == "" {
break
}
if _, ok := set[value]; !ok {
result = append(result, value)
set[value] = struct{}{}
if len(set) > 100 {
break
}
}
}
if len(result) <= 0 {
result = append(result, "")
}
return result
}
func searchForward(cursor *RowPtr, c int, target string) (*RowPtr, int) {
c++
for cursor != nil {
for c < len(cursor.Cell) {
if strings.Contains(cursor.Cell[c].Text(), target) {
return cursor, c
}
c++
}
cursor = cursor.Next()
c = 0
}
return nil, c
}
func searchBackward(cursor *RowPtr, c int, target string) (*RowPtr, int) {
c--
for {
for c >= 0 {
if strings.Contains(cursor.Cell[c].Text(), target) {
return cursor, c
}
c--
}
cursor = cursor.Prev()
if cursor == nil {
return nil, c
}
c = len(cursor.Cell) - 1
}
}