impl ui search
parent
b22891b0c4
commit
0e1ced34b2
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue