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 {
|
if err := handler(w, r); err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
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 {
|
func (server *Server) uiSearchHandler(w http.ResponseWriter, r *http.Request) error {
|
||||||
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
|
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
|
||||||
t, err := server.uiTemplate()
|
t, err := server.uiSubTemplates()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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 {
|
func (server *Server) uiFilesHandler(w http.ResponseWriter, r *http.Request) error {
|
||||||
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
|
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
|
||||||
t, err := server.uiTemplate()
|
t, err := server.uiSubTemplates()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return t.Lookup("files").Execute(w, "TODO data")
|
return t.Lookup("files").Execute(w, "TODO data")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (server *Server) uiTemplate() (*template.Template, error) {
|
func (server *Server) uiSubTemplates() (*template.Template, error) {
|
||||||
templateFiles := []string{}
|
templateFiles := []string{}
|
||||||
var loadTemplateFilesFromDir func(string) error
|
var loadTemplateFilesFromDir func(string) error
|
||||||
loadTemplateFilesFromDir = func(root string) error {
|
loadTemplateFilesFromDir = func(root string) error {
|
||||||
|
|
@ -231,14 +249,14 @@ func (server *Server) uiTemplate() (*template.Template, error) {
|
||||||
if err := loadTemplateFilesFromDir(entryPath); err != nil {
|
if err := loadTemplateFilesFromDir(entryPath); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if strings.HasPrefix(path.Base(entryPath), ".") {
|
} else if !strings.HasPrefix(path.Base(entryPath), "_") {
|
||||||
} else if strings.HasSuffix(entryPath, ".ctmpl") {
|
} else if strings.HasSuffix(entryPath, ".ctmpl") {
|
||||||
templateFiles = append(templateFiles, entryPath)
|
templateFiles = append(templateFiles, entryPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := loadTemplateFilesFromDir(server.root); err != nil {
|
if err := loadTemplateFilesFromDir(path.Join(server.root, "ui")); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return template.ParseFiles(templateFiles...)
|
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 {
|
func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request) error {
|
||||||
query := r.URL.Query().Get("q")
|
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, " ")
|
queries := strings.Split(query, " ")
|
||||||
if len(queries) == 0 {
|
if len(queries) == 0 {
|
||||||
w.Write([]byte(`[]`))
|
return [][2]string{}, nil
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
patterns := []*regexp.Regexp{}
|
patterns := []*regexp.Regexp{}
|
||||||
unsafepattern := regexp.MustCompile(`[^a-zA-Z0-9]`)
|
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 {
|
if len(patterns) == 0 {
|
||||||
w.Write([]byte(`[]`))
|
return [][2]string{}, nil
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
tree, err := server.tree().GetRoot()
|
tree, err := server.tree().GetRoot()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
result := []string{}
|
result := [][2]string{}
|
||||||
if err := tree.ForEach(func(id []string, leaf Leaf) error {
|
if err := tree.ForEach(func(id []string, leaf Leaf) error {
|
||||||
for _, pattern := range patterns {
|
for _, pattern := range patterns {
|
||||||
if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) {
|
if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = append(result, server.urlFileId(id))
|
title := leaf.Title
|
||||||
return nil
|
for i := len(id) - 1; i >= 1; i-- {
|
||||||
}); err != nil {
|
parent, err := server.tree().Get(id[:i])
|
||||||
|
if err != nil {
|
||||||
return err
|
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