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
+
+- path
+- title
+- date
+- filetime
+- meta
+
+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