From f949689b4d56daa9988c821e2f0e1b470cfc7275 Mon Sep 17 00:00:00 2001 From: JP Appel Date: Wed, 23 Jul 2025 02:07:08 -0400 Subject: Update help info --- pkg/index/index.go | 35 ++++++++++++++++++++++++++++++++++- pkg/server/server.go | 32 ++++++++++++++++++++++++++------ pkg/shell/interpreter.go | 4 ++-- 3 files changed, 62 insertions(+), 9 deletions(-) (limited to 'pkg') diff --git a/pkg/index/index.go b/pkg/index/index.go index 50f642e..42f5051 100644 --- a/pkg/index/index.go +++ b/pkg/index/index.go @@ -336,6 +336,39 @@ func (idx Index) Filter(paths []string, numWorkers uint) []string { return fPaths } +// Create a comparison function for documents by field. +// Allowed fields: path,title,date,filetime,meta +func NewDocCmp(field string, reverse bool) (func(*Document, *Document) int, bool) { + descMod := 1 + if reverse { + descMod = -1 + } + switch field { + case "path": + return func(a, b *Document) int { + return descMod * strings.Compare(a.Path, b.Path) + }, true + case "title": + return func(a, b *Document) int { + return descMod * strings.Compare(a.Title, b.Title) + }, true + case "date": + return func(a, b *Document) int { + return descMod * a.Date.Compare(b.Date) + }, true + case "filetime": + return func(a, b *Document) int { + return descMod * a.FileTime.Compare(b.FileTime) + }, true + case "meta": + return func(a, b *Document) int { + return descMod * strings.Compare(a.OtherMeta, b.OtherMeta) + }, true + } + + return nil, false +} + func ParseDoc(path string, opts ParseOpts) (*Document, error) { doc := &Document{Path: path, parseOpts: opts} @@ -430,5 +463,5 @@ func ParseDocs(paths []string, numWorkers uint, opts ParseOpts) (map[string]*Doc } func init() { - linkRegex = regexp.MustCompile(`\[.*\]\(\s*(\S+)\s*\)`) + linkRegex = regexp.MustCompile(`\[.*\]\(\s*([^\)]+)\s*\)`) } diff --git a/pkg/server/server.go b/pkg/server/server.go index a7a5395..68750a2 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -6,6 +6,7 @@ import ( "io" "log/slog" "net/http" + "slices" "strings" "sync" "time" @@ -21,11 +22,20 @@ type Server interface { } func info(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(` -

Atlas Server

-

This is the experimental atlas server! - Try POSTing a query to

/search

- `)) + w.Write([]byte(`

Atlas Server

+

This is the experimental atlas server! +Try POSTing a query to

/search

+
+

You can sort the results using the query param

sortBy
+ +You can change the order using
sortOrder
with asc or desc +

`)) } func NewMux(db *data.Query) *http.ServeMux { @@ -37,7 +47,7 @@ func NewMux(db *data.Query) *http.ServeMux { } mux.HandleFunc("/", info) - mux.HandleFunc("/search", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("POST /search", func(w http.ResponseWriter, r *http.Request) { b := &strings.Builder{} if _, err := io.Copy(b, r.Body); err != nil { w.WriteHeader(http.StatusInternalServerError) @@ -70,6 +80,16 @@ func NewMux(db *data.Query) *http.ServeMux { } } + queryParams := r.URL.Query() + if queryParams.Has("sortBy") { + sortBy := queryParams.Get("sortBy") + sortOrder := queryParams.Get("sortOrder") + docCmp, ok := index.NewDocCmp(sortBy, sortOrder == "desc" || sortOrder == "descending") + if ok { + slices.SortFunc(docs, docCmp) + } + } + if !maxFileTime.IsZero() { w.Header().Add("Last-Modified", maxFileTime.UTC().Format(http.TimeFormat)) } diff --git a/pkg/shell/interpreter.go b/pkg/shell/interpreter.go index c222de0..bb0a441 100644 --- a/pkg/shell/interpreter.go +++ b/pkg/shell/interpreter.go @@ -183,7 +183,7 @@ out: } switch t.Type { case ITOK_CMD_HELP: - printHelp(w) + PrintHelp(w) break out case ITOK_CMD_EXIT: return true, nil @@ -755,7 +755,7 @@ func (inter Interpreter) Tokenize(line string) []IToken { return tokens } -func printHelp(w io.Writer) { +func PrintHelp(w io.Writer) { fmt.Fprintln(w, "Shitty debug shell for atlas") fmt.Fprintln(w, "help - print this help") fmt.Fprintln(w, "exit - exit interactive mode") -- cgit v1.2.3