impl ui search

master
Bel LaPointe 2022-02-15 15:40:19 -07:00
parent b22891b0c4
commit 0e1ced34b2
1 changed files with 51 additions and 15 deletions

View File

@ -73,6 +73,7 @@ func (server *Server) tryCatchHttpHandler(handler func(http.ResponseWriter, *htt
}
if err := handler(w, r); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
log.Printf("failed handling %s: %v", r.URL.String(), err)
}
}
}
@ -201,23 +202,40 @@ func (server *Server) putContentHandler(filePath string, w http.ResponseWriter,
func (server *Server) uiSearchHandler(w http.ResponseWriter, r *http.Request) error {
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
t, err := server.uiTemplate()
t, err := server.uiSubTemplates()
if err != nil {
return err
}
return t.Lookup("search").Execute(w, "TODO data")
t, err = t.ParseFiles(path.Join(server.root, "ui", "search.ctmpl"))
if err != nil {
return err
}
idsTitles, err := server._apiV0SearchHandler(r.URL.Query().Get("q"))
if err != nil {
return err
}
data := make([]struct {
Title string
ID string
}, len(idsTitles))
for i := range idsTitles {
data[i].ID = idsTitles[i][0]
data[i].Title = idsTitles[i][1]
}
log.Printf("ui search: %v", data)
return t.Lookup("search").Execute(w, map[string]interface{}{"Results": data})
}
func (server *Server) uiFilesHandler(w http.ResponseWriter, r *http.Request) error {
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
t, err := server.uiTemplate()
t, err := server.uiSubTemplates()
if err != nil {
return err
}
return t.Lookup("files").Execute(w, "TODO data")
}
func (server *Server) uiTemplate() (*template.Template, error) {
func (server *Server) uiSubTemplates() (*template.Template, error) {
templateFiles := []string{}
var loadTemplateFilesFromDir func(string) error
loadTemplateFilesFromDir = func(root string) error {
@ -231,14 +249,14 @@ func (server *Server) uiTemplate() (*template.Template, error) {
if err := loadTemplateFilesFromDir(entryPath); err != nil {
return err
}
} else if strings.HasPrefix(path.Base(entryPath), ".") {
} else if !strings.HasPrefix(path.Base(entryPath), "_") {
} else if strings.HasSuffix(entryPath, ".ctmpl") {
templateFiles = append(templateFiles, entryPath)
}
}
return nil
}
if err := loadTemplateFilesFromDir(server.root); err != nil {
if err := loadTemplateFilesFromDir(path.Join(server.root, "ui")); err != nil {
return nil, err
}
return template.ParseFiles(templateFiles...)
@ -394,10 +412,21 @@ func (server *Server) apiV0FilesIDPutHandler(w http.ResponseWriter, r *http.Requ
func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request) error {
query := r.URL.Query().Get("q")
idsTitles, err := server._apiV0SearchHandler(query)
if err != nil {
return err
}
result := make([]string, len(idsTitles))
for i := range idsTitles {
result[i] = idsTitles[i][0]
}
return json.NewEncoder(w).Encode(result)
}
func (server *Server) _apiV0SearchHandler(query string) ([][2]string, error) {
queries := strings.Split(query, " ")
if len(queries) == 0 {
w.Write([]byte(`[]`))
return nil
return [][2]string{}, nil
}
patterns := []*regexp.Regexp{}
unsafepattern := regexp.MustCompile(`[^a-zA-Z0-9]`)
@ -408,24 +437,31 @@ func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request)
}
}
if len(patterns) == 0 {
w.Write([]byte(`[]`))
return nil
return [][2]string{}, nil
}
tree, err := server.tree().GetRoot()
if err != nil {
return err
return nil, err
}
result := []string{}
result := [][2]string{}
if err := tree.ForEach(func(id []string, leaf Leaf) error {
for _, pattern := range patterns {
if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) {
return nil
}
}
result = append(result, server.urlFileId(id))
return nil
}); err != nil {
title := leaf.Title
for i := len(id) - 1; i >= 1; i-- {
parent, err := server.tree().Get(id[:i])
if err != nil {
return err
}
return json.NewEncoder(w).Encode(result)
title = path.Join(parent.Title, title)
}
result = append(result, [2]string{server.urlFileId(id), title})
return nil
}); err != nil {
return nil, err
}
return result, nil
}