156 lines
3.0 KiB
Go
156 lines
3.0 KiB
Go
package index
|
|
|
|
import (
|
|
"mime"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var typeRegexp = regexp.MustCompile(`type:(\S+)`)
|
|
|
|
var documentTypes = []string{
|
|
".word",
|
|
".pdf",
|
|
".txt",
|
|
".doc",
|
|
".docx",
|
|
}
|
|
|
|
var compressedFile = []string{
|
|
".7z",
|
|
".rar",
|
|
".zip",
|
|
".tar",
|
|
".tar.gz",
|
|
".tar.xz",
|
|
}
|
|
|
|
type SearchOptions struct {
|
|
Conditions map[string]bool
|
|
LargerThan int
|
|
SmallerThan int
|
|
Terms []string
|
|
}
|
|
|
|
func ParseSearch(value string) *SearchOptions {
|
|
opts := &SearchOptions{
|
|
Conditions: map[string]bool{
|
|
"exact": strings.Contains(value, "case:exact"),
|
|
},
|
|
Terms: []string{},
|
|
}
|
|
|
|
// removes the options from the value
|
|
value = strings.Replace(value, "case:exact", "", -1)
|
|
value = strings.TrimSpace(value)
|
|
|
|
types := typeRegexp.FindAllStringSubmatch(value, -1)
|
|
for _, filterType := range types {
|
|
if len(filterType) == 1 {
|
|
continue
|
|
}
|
|
filter := filterType[1]
|
|
switch filter {
|
|
case "image":
|
|
opts.Conditions["image"] = true
|
|
case "audio", "music":
|
|
opts.Conditions["audio"] = true
|
|
case "video":
|
|
opts.Conditions["video"] = true
|
|
case "doc":
|
|
opts.Conditions["doc"] = true
|
|
case "archive":
|
|
opts.Conditions["archive"] = true
|
|
case "folder":
|
|
opts.Conditions["dir"] = true
|
|
case "file":
|
|
opts.Conditions["dir"] = false
|
|
}
|
|
if len(filter) < 8 {
|
|
continue
|
|
}
|
|
if strings.HasPrefix(filter, "largerThan=") {
|
|
opts.Conditions["larger"] = true
|
|
size := strings.TrimPrefix(filter, "largerThan=")
|
|
opts.LargerThan = updateSize(size)
|
|
}
|
|
if strings.HasPrefix(filter, "smallerThan=") {
|
|
opts.Conditions["larger"] = true
|
|
size := strings.TrimPrefix(filter, "smallerThan=")
|
|
opts.SmallerThan = updateSize(size)
|
|
}
|
|
}
|
|
|
|
if len(types) > 0 {
|
|
// Remove the fields from the search value
|
|
value = typeRegexp.ReplaceAllString(value, "")
|
|
}
|
|
|
|
if value == "" {
|
|
return opts
|
|
}
|
|
|
|
// if the value starts with " and finishes what that character, we will
|
|
// only search for that term
|
|
if value[0] == '"' && value[len(value)-1] == '"' {
|
|
unique := strings.TrimPrefix(value, "\"")
|
|
unique = strings.TrimSuffix(unique, "\"")
|
|
|
|
opts.Terms = []string{unique}
|
|
return opts
|
|
}
|
|
value = strings.TrimSpace(value)
|
|
opts.Terms = strings.Split(value, "|")
|
|
return opts
|
|
}
|
|
|
|
func toInt(str string) int {
|
|
val, err := strconv.Atoi(str)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
return val
|
|
}
|
|
|
|
func updateSize(given string) int {
|
|
size := toInt(given)
|
|
if size == 0 {
|
|
return 100
|
|
} else {
|
|
return size
|
|
}
|
|
}
|
|
|
|
func IsMatchingType(extension string, matchType string) bool {
|
|
mimetype := mime.TypeByExtension(extension)
|
|
if strings.HasPrefix(mimetype, matchType) {
|
|
return true
|
|
}
|
|
switch matchType {
|
|
case "doc":
|
|
return isDoc(extension)
|
|
case "archive":
|
|
return isArchive(extension)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func isDoc(extension string) bool {
|
|
for _, typefile := range documentTypes {
|
|
if extension == typefile {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func isArchive(extension string) bool {
|
|
for _, typefile := range compressedFile {
|
|
if extension == typefile {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|