package search
import (
"logc/parser"
"strings"
)
func Text(comments []parser.Comment, headers, query string) []parser.Comment {
headerFilter := []parser.Comment{}
headerList := strings.Split(headers, ",")
if headers == "" {
for _, v := range comments {
for i, h := range v.Headers {
if h[0] == '[' {
v.Headers[i] = h[strings.Index(h, "]")+1:]
}
}
}
headerFilter = comments
} else {
for j, v := range comments {
match := false
headersAndTags := v.Headers
headersAndTags = append(headersAndTags, v.Tags...)
for _, h := range headersAndTags {
// !DEVMAN: This is the logic for pulling out optional headers
if len(h) > 0 && h[0] == '[' {
tags := strings.Split(h[1:strings.Index(h, "]")], ",")
m := false
for _, s := range tags {
b := false
for _, t := range headerList {
if s[0] == '!' {
if t == s[1:] {
m = true
b = true
break
} else {
m = false
}
} else if t == s {
m = true
} else if t == headersAndTags[0] {
m = true
}
}
if b {
break
}
}
if !m {
for i, k := range v.Headers {
if k == h {
comments[j].Headers[i] = ""
comments[j].Data[i] = ""
}
}
} else {
// Remove the brackets if it matches
for i, k := range v.Headers {
if k == h {
comments[j].Headers[i] = h[strings.Index(h, "]")+1:]
}
}
}
match = m
} else {
for _, t := range headerList {
if t == h && !match {
match = true
}
}
}
}
if match {
v.Headers = removeEmpty(v.Headers)
v.Data = removeEmpty(v.Data)
headerFilter = append(headerFilter, v)
}
}
}
queryFilter := []parser.Comment{}
if query == "" {
return headerFilter
} else {
lowerQuery := strings.ToLower(query)
for _, v := range headerFilter {
text := strings.Join(v.Data, " ")
text += strings.Join(v.Headers, " ")
text = strings.ToLower(text)
if strings.Contains(text, lowerQuery) {
queryFilter = append(queryFilter, v)
}
}
}
return queryFilter
}
func removeEmpty(input []string) []string {
// Create a new slice to hold non-empty strings
nonEmpty := []string{}
for _, str := range input {
if str != "" { // Check if the string is not empty
nonEmpty = append(nonEmpty, str)
}
}
return nonEmpty
}