aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/bookmarks/bookmarks.go1
-rw-r--r--internal/config/config.go2
-rw-r--r--internal/web/server.go8
-rw-r--r--internal/web/server_test.go6
-rw-r--r--internal/web/templates/bookmarks.html2
-rw-r--r--internal/web/templates/reader.html1
6 files changed, 15 insertions, 5 deletions
diff --git a/internal/bookmarks/bookmarks.go b/internal/bookmarks/bookmarks.go
index 4b839ed..ac8926d 100644
--- a/internal/bookmarks/bookmarks.go
+++ b/internal/bookmarks/bookmarks.go
@@ -19,6 +19,7 @@ type Bookmark struct {
ID string `json:"id"`
Book string `json:"book"` // canonical English name (Bible-corpus key)
Chapter int `json:"chapter"`
+ Verse int `json:"verse,omitempty"` // 0 = whole chapter; >0 = a specific verse
Note string `json:"note"`
Tags []string `json:"tags"`
Created string `json:"created"` // RFC3339
diff --git a/internal/config/config.go b/internal/config/config.go
index e3299e1..4293bd2 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -25,7 +25,7 @@ var seedTOML []byte
// Version is lectio's release version, shared by every binary's
// -v/--version output (lectio, lectio-ui, lectio-web).
-const Version = "0.16.1"
+const Version = "0.17.0"
// validVersions are the five scripture versions lectio understands.
var validVersions = map[string]bool{
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 @@
<div class="bookmarks">
{{range .Items}}
<div class="bookmark">
- <a href="/reader?book={{.Book}}&chap={{.Chapter}}">{{.Display}} {{.Chapter}}</a>
+ <a href="/reader?book={{.Book}}&chap={{.Chapter}}">{{.Display}} {{.Chapter}}{{if .Verse}}:{{.Verse}}{{end}}</a>
{{if .Note}}<span class="note">{{.Note}}</span>{{end}}
{{if .Tags}}<span class="tags">{{range .Tags}}#{{.}} {{end}}</span>{{end}}
<form method="post" action="/bookmarks/delete">
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 @@
<form class="bookmark-add" method="post" action="/reader/bookmark">
<input type="hidden" name="book" value="{{.Book}}">
<input type="hidden" name="chap" value="{{.Chap}}">
+ <input type="number" name="verse" min="1" placeholder="verse (optional)">
<input type="text" name="note" placeholder="note">
<input type="text" name="tags" placeholder="tags, comma-separated">
<button type="submit">★ bookmark</button>