package notes import ( "bufio" "bytes" "local/notes-server/filetree" "log" "os" "path" "path/filepath" "strings" ) func (n *Notes) Search(phrase string) (string, error) { 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 splits := strings.Split(info.Name(), "."); len(splits) > 1 && !(strings.HasSuffix(info.Name(), ".md") || strings.HasSuffix(info.Name(), ".txt")) { return nil } ok, err := grepFile(walked, []byte(phrase)) 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, phrase []byte) (bool, error) { f, err := os.Open(file) if err != nil { return false, err } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { if bytes.Contains(scanner.Bytes(), phrase) { return true, scanner.Err() } } return false, scanner.Err() }