73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
| package search
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 	"path"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/spf13/afero"
 | |
| 
 | |
| 	"github.com/filebrowser/filebrowser/v2/rules"
 | |
| )
 | |
| 
 | |
| type searchOptions struct {
 | |
| 	CaseSensitive bool
 | |
| 	Conditions    []condition
 | |
| 	Terms         []string
 | |
| }
 | |
| 
 | |
| // Search searches for a query in a fs.
 | |
| func Search(fs afero.Fs, scope, query string, checker rules.Checker, found func(path string, f os.FileInfo) error) error {
 | |
| 	search := parseSearch(query)
 | |
| 
 | |
| 	scope = filepath.ToSlash(filepath.Clean(scope))
 | |
| 	scope = path.Join("/", scope)
 | |
| 
 | |
| 	return afero.Walk(fs, scope, func(fPath string, f os.FileInfo, err error) error {
 | |
| 		fPath = filepath.ToSlash(filepath.Clean(fPath))
 | |
| 		fPath = path.Join("/", fPath)
 | |
| 		relativePath := strings.TrimPrefix(fPath, scope)
 | |
| 		relativePath = strings.TrimPrefix(relativePath, "/")
 | |
| 
 | |
| 		if fPath == scope {
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		if !checker.Check(fPath) {
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		if len(search.Conditions) > 0 {
 | |
| 			match := false
 | |
| 
 | |
| 			for _, t := range search.Conditions {
 | |
| 				if t(fPath) {
 | |
| 					match = true
 | |
| 					break
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if !match {
 | |
| 				return nil
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if len(search.Terms) > 0 {
 | |
| 			for _, term := range search.Terms {
 | |
| 				_, fileName := path.Split(fPath)
 | |
| 				if !search.CaseSensitive {
 | |
| 					fileName = strings.ToLower(fileName)
 | |
| 					term = strings.ToLower(term)
 | |
| 				}
 | |
| 				if strings.Contains(fileName, term) {
 | |
| 					return found(relativePath, f)
 | |
| 				}
 | |
| 			}
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		return found(relativePath, f)
 | |
| 	})
 | |
| }
 |