notes-server/notes/search.go

61 lines
1.2 KiB
Go
Executable File

package notes
import (
"bufio"
"local/notes-server/filetree"
"log"
"os"
"path"
"path/filepath"
"regexp"
)
func (n *Notes) Search(phrase string) (string, error) {
pattern, err := regexp.Compile("(?i)" + phrase)
if err != nil {
return "", err
}
files := filetree.NewFiles()
err = filepath.Walk(n.root,
func(walked string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
if size := info.Size(); size < 1 || size > (5*1024*1024) {
return nil
}
ok, err := grepFile(walked, pattern)
if err != nil && err.Error() == "bufio.Scanner: token too long" {
err = nil
}
if err == nil && ok {
p := filetree.NewPathFromLocal(path.Dir(walked))
files.Push(p, info)
}
if err != nil {
log.Printf("failed to scan %v: %v", walked, err)
}
return err
},
)
return filetree.Paths(*files).List(true), err
}
func grepFile(file string, pattern *regexp.Regexp) (bool, error) {
f, err := os.Open(file)
if err != nil {
return false, err
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
if pattern.Match(scanner.Bytes()) {
return true, scanner.Err()
}
}
return false, scanner.Err()
}