From f48b79d8860e4c4616821ceeeea091ab4b838197 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 24 Jul 2026 15:56:28 +0200 Subject: bookmarks: per-verse (optional Verse field); web reader verse input + list shows Book Ch:V; v0.17.0 --- internal/web/server.go | 8 +++++++- internal/web/server_test.go | 6 ++++-- internal/web/templates/bookmarks.html | 2 +- internal/web/templates/reader.html | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) (limited to 'internal/web') diff --git a/internal/web/server.go b/internal/web/server.go index cd50e5a..006bbdb 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -527,10 +527,15 @@ func addBookmark(s *server) http.HandlerFunc { } book := r.PostForm.Get("book") chap := atoiOr(r.PostForm.Get("chap"), 0) + verse := atoiOr(r.PostForm.Get("verse"), 0) + if verse < 0 { + verse = 0 + } if book != "" && chap > 0 { _, _ = s.bm.Add(bookmarks.Bookmark{ Book: book, Chapter: chap, + Verse: verse, Note: strings.TrimSpace(r.PostForm.Get("note")), Tags: bookmarks.ParseTags(r.PostForm.Get("tags")), }) @@ -545,6 +550,7 @@ type bookmarkView struct { Book string // canonical (for the ?book= open link) Display string // dialect display name Chapter int + Verse int // 0 = whole chapter Note string Tags []string Created string @@ -578,7 +584,7 @@ func listBookmarks(s *server) http.HandlerFunc { if disp == "" { disp = b.Book } - views = append(views, bookmarkView{ID: b.ID, Book: b.Book, Display: disp, Chapter: b.Chapter, Note: b.Note, Tags: b.Tags, Created: b.Created}) + views = append(views, bookmarkView{ID: b.ID, Book: b.Book, Display: disp, Chapter: b.Chapter, Verse: b.Verse, Note: b.Note, Tags: b.Tags, Created: b.Created}) } allTags, _ := s.bm.Tags() data := bookmarksData{Items: views, AllTags: allTags, Tag: tag, L: i18n.Get(cfg.UILanguage), Lang: cfg.UILanguage} diff --git a/internal/web/server_test.go b/internal/web/server_test.go index f6c050b..0754b08 100644 --- a/internal/web/server_test.go +++ b/internal/web/server_test.go @@ -606,6 +606,7 @@ func TestBookmarksFlow(t *testing.T) { form := url.Values{} form.Set("book", "John") form.Set("chap", "3") + form.Set("verse", "16") form.Set("note", "for God so loved") form.Set("tags", "grace, gospel") post := httptest.NewRequest("POST", "/reader/bookmark", strings.NewReader(form.Encode())) @@ -620,8 +621,9 @@ func TestBookmarksFlow(t *testing.T) { list := httptest.NewRecorder() srv.ServeHTTP(list, httptest.NewRequest("GET", "/bookmarks", nil)) b := list.Body.String() - if !strings.Contains(b, "John") || !strings.Contains(b, "for God so loved") || !strings.Contains(b, `book=John&chap=3`) { - t.Errorf("bookmark not listed:\n%s", b) + if !strings.Contains(b, "John") || !strings.Contains(b, "for God so loved") || + !strings.Contains(b, `book=John&chap=3`) || !strings.Contains(b, "John 3:16") { + t.Errorf("bookmark not listed with verse:\n%s", b) } // Tag filter. diff --git a/internal/web/templates/bookmarks.html b/internal/web/templates/bookmarks.html index f51515b..3597b74 100644 --- a/internal/web/templates/bookmarks.html +++ b/internal/web/templates/bookmarks.html @@ -33,7 +33,7 @@
{{range .Items}}
- {{.Display}} {{.Chapter}} + {{.Display}} {{.Chapter}}{{if .Verse}}:{{.Verse}}{{end}} {{if .Note}}{{.Note}}{{end}} {{if .Tags}}{{range .Tags}}#{{.}} {{end}}{{end}}
diff --git a/internal/web/templates/reader.html b/internal/web/templates/reader.html index 7e506c2..02ecf38 100644 --- a/internal/web/templates/reader.html +++ b/internal/web/templates/reader.html @@ -58,6 +58,7 @@ + -- cgit v1.3