diff --git a/hyphae/backlinks.go b/hyphae/backlinks.go
index f6961cb..c7d6020 100644
--- a/hyphae/backlinks.go
+++ b/hyphae/backlinks.go
@@ -52,6 +52,13 @@ func IndexBacklinks() {
}
}
+func BacklinksCount(h *Hypha) int {
+ if _, exists := backlinkIndex[h.Name]; exists {
+ return len(backlinkIndex[h.Name])
+ }
+ return 0
+}
+
func BacklinksOnEdit(h *Hypha, oldText string) {
backlinkIndexMutex.Lock()
newLinks := toLinkSet(ExtractHyphaLinks(h))
diff --git a/views/nav.qtpl b/views/nav.qtpl
index e30c598..2a2a1b5 100644
--- a/views/nav.qtpl
+++ b/views/nav.qtpl
@@ -1,4 +1,5 @@
{% import "net/http" %}
+{% import "fmt" %}
{% import "strings" %}
{% import "github.com/bouncepaw/mycorrhiza/user" %}
{% import "github.com/bouncepaw/mycorrhiza/hyphae" %}
@@ -11,6 +12,17 @@
{% endif %}
{% endfunc %}
+{% code
+func backlinksDisplay(h *hyphae.Hypha) string {
+ n := hyphae.BacklinksCount(h)
+ suffix := "s"
+ if n % 10 == 1 {
+ suffix = ""
+ }
+ return fmt.Sprintf("%d backlink%s", n, suffix)
+}
+%}
+
{% func hyphaInfo(rq *http.Request, h *hyphae.Hypha) %}
{% code
u := user.FromRequest(rq)
@@ -22,7 +34,7 @@
{%= hyphaInfoEntry(h, u, "delete-ask", "Delete") %}
{%= hyphaInfoEntry(h, u, "text", "View markup") %}
{%= hyphaInfoEntry(h, u, "attachment", "Manage attachment") %}
- {%= hyphaInfoEntry(h, u, "backlinks", "Backlinks") %}
+ {%= hyphaInfoEntry(h, u, "backlinks", backlinksDisplay(h)) %}
{% endfunc %}
diff --git a/views/nav.qtpl.go b/views/nav.qtpl.go
index 67ab48a..4660162 100644
--- a/views/nav.qtpl.go
+++ b/views/nav.qtpl.go
@@ -8,258 +8,271 @@ package views
import "net/http"
//line views/nav.qtpl:2
-import "strings"
+import "fmt"
//line views/nav.qtpl:3
-import "github.com/bouncepaw/mycorrhiza/user"
+import "strings"
//line views/nav.qtpl:4
+import "github.com/bouncepaw/mycorrhiza/user"
+
+//line views/nav.qtpl:5
import "github.com/bouncepaw/mycorrhiza/hyphae"
-//line views/nav.qtpl:6
+//line views/nav.qtpl:7
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line views/nav.qtpl:6
+//line views/nav.qtpl:7
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line views/nav.qtpl:6
+//line views/nav.qtpl:7
func streamhyphaInfoEntry(qw422016 *qt422016.Writer, h *hyphae.Hypha, u *user.User, action, displayText string) {
-//line views/nav.qtpl:6
+//line views/nav.qtpl:7
qw422016.N().S(`
`)
-//line views/nav.qtpl:7
+//line views/nav.qtpl:8
if u.CanProceed(action) {
-//line views/nav.qtpl:7
+//line views/nav.qtpl:8
qw422016.N().S(`
`)
-//line views/nav.qtpl:9
+//line views/nav.qtpl:10
qw422016.E().S(displayText)
-//line views/nav.qtpl:9
+//line views/nav.qtpl:10
qw422016.N().S(`
`)
-//line views/nav.qtpl:11
+//line views/nav.qtpl:12
}
-//line views/nav.qtpl:11
+//line views/nav.qtpl:12
qw422016.N().S(`
`)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
}
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
func writehyphaInfoEntry(qq422016 qtio422016.Writer, h *hyphae.Hypha, u *user.User, action, displayText string) {
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
streamhyphaInfoEntry(qw422016, h, u, action, displayText)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
qt422016.ReleaseWriter(qw422016)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
}
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
func hyphaInfoEntry(h *hyphae.Hypha, u *user.User, action, displayText string) string {
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
qb422016 := qt422016.AcquireByteBuffer()
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
writehyphaInfoEntry(qb422016, h, u, action, displayText)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
qs422016 := string(qb422016.B)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
qt422016.ReleaseByteBuffer(qb422016)
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
return qs422016
-//line views/nav.qtpl:12
+//line views/nav.qtpl:13
}
-//line views/nav.qtpl:14
+//line views/nav.qtpl:16
+func backlinksDisplay(h *hyphae.Hypha) string {
+ n := hyphae.BacklinksCount(h)
+ suffix := "s"
+ if n%10 == 1 {
+ suffix = ""
+ }
+ return fmt.Sprintf("%d backlink%s", n, suffix)
+}
+
+//line views/nav.qtpl:26
func streamhyphaInfo(qw422016 *qt422016.Writer, rq *http.Request, h *hyphae.Hypha) {
-//line views/nav.qtpl:14
+//line views/nav.qtpl:26
qw422016.N().S(`
`)
-//line views/nav.qtpl:16
+//line views/nav.qtpl:28
u := user.FromRequest(rq)
-//line views/nav.qtpl:17
+//line views/nav.qtpl:29
qw422016.N().S(`
`)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
}
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
func writehyphaInfo(qq422016 qtio422016.Writer, rq *http.Request, h *hyphae.Hypha) {
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
streamhyphaInfo(qw422016, rq, h)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
qt422016.ReleaseWriter(qw422016)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
}
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
func hyphaInfo(rq *http.Request, h *hyphae.Hypha) string {
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
qb422016 := qt422016.AcquireByteBuffer()
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
writehyphaInfo(qb422016, rq, h)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
qs422016 := string(qb422016.B)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
qt422016.ReleaseByteBuffer(qb422016)
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
return qs422016
-//line views/nav.qtpl:28
+//line views/nav.qtpl:40
}
-//line views/nav.qtpl:30
+//line views/nav.qtpl:42
func streamsiblingHyphaeHTML(qw422016 *qt422016.Writer, siblings string) {
-//line views/nav.qtpl:30
+//line views/nav.qtpl:42
qw422016.N().S(`
`)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
}
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
func writesiblingHyphaeHTML(qq422016 qtio422016.Writer, siblings string) {
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
streamsiblingHyphaeHTML(qw422016, siblings)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
qt422016.ReleaseWriter(qw422016)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
}
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
func siblingHyphaeHTML(siblings string) string {
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
qb422016 := qt422016.AcquireByteBuffer()
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
writesiblingHyphaeHTML(qb422016, siblings)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
qs422016 := string(qb422016.B)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
qt422016.ReleaseByteBuffer(qb422016)
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
return qs422016
-//line views/nav.qtpl:35
+//line views/nav.qtpl:47
}
-//line views/nav.qtpl:37
+//line views/nav.qtpl:49
func StreamSubhyphaeHTML(qw422016 *qt422016.Writer, subhyphae string) {
-//line views/nav.qtpl:37
+//line views/nav.qtpl:49
qw422016.N().S(`
`)
-//line views/nav.qtpl:38
+//line views/nav.qtpl:50
if strings.TrimSpace(subhyphae) != "" {
-//line views/nav.qtpl:38
+//line views/nav.qtpl:50
qw422016.N().S(`
Subhyphae
`)
-//line views/nav.qtpl:47
+//line views/nav.qtpl:59
}
-//line views/nav.qtpl:47
+//line views/nav.qtpl:59
qw422016.N().S(`
`)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
}
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
func WriteSubhyphaeHTML(qq422016 qtio422016.Writer, subhyphae string) {
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
StreamSubhyphaeHTML(qw422016, subhyphae)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
qt422016.ReleaseWriter(qw422016)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
}
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
func SubhyphaeHTML(subhyphae string) string {
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
qb422016 := qt422016.AcquireByteBuffer()
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
WriteSubhyphaeHTML(qb422016, subhyphae)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
qs422016 := string(qb422016.B)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
qt422016.ReleaseByteBuffer(qb422016)
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
return qs422016
-//line views/nav.qtpl:48
+//line views/nav.qtpl:60
}