diff --git a/hypview/hypview.go b/hypview/hypview.go
new file mode 100644
index 0000000..54bc232
--- /dev/null
+++ b/hypview/hypview.go
@@ -0,0 +1,62 @@
+package hypview
+
+import (
+ "embed"
+ "fmt"
+ "github.com/bouncepaw/mycorrhiza/cfg"
+ "github.com/bouncepaw/mycorrhiza/viewutil"
+ "log"
+ "strings"
+ "text/template"
+)
+
+var (
+ //go:embed *.html
+ fs embed.FS
+ ruTranslation = ``
+ chainNaviTitle viewutil.Chain
+)
+
+func Init() {
+ chainNaviTitle = viewutil.
+ En(viewutil.CopyEnWith(fs, "view_navititle.html")).
+ Ru(template.Must(viewutil.CopyRuWith(fs, "view_navititle.html").Parse(ruTranslation)))
+}
+
+type naviTitleData struct {
+ HyphaNameParts []string
+ HyphaNamePartsWithParents []string
+ Icon string
+ HomeHypha string
+}
+
+func NaviTitle(meta viewutil.Meta, hyphaName string) string {
+ parts, partsWithParents := naviTitleify(hyphaName)
+ var buf strings.Builder
+ err := chainNaviTitle.Get(meta).ExecuteTemplate(&buf, "navititle", naviTitleData{
+ HyphaNameParts: parts,
+ HyphaNamePartsWithParents: partsWithParents,
+ Icon: cfg.NaviTitleIcon,
+ HomeHypha: cfg.HomeHypha,
+ })
+ if err != nil {
+ log.Println(err)
+ }
+ return buf.String()
+}
+
+func naviTitleify(hyphaName string) ([]string, []string) {
+ var (
+ prevAcc = "/hypha"
+ parts = strings.Split(hyphaName, "/")
+ partsWithParents []string
+ )
+
+ for _, part := range parts {
+ prevAcc += "/" + part
+ partsWithParents = append(partsWithParents, prevAcc)
+ }
+
+ fmt.Printf("%q — %q\n", parts, partsWithParents)
+ return parts, partsWithParents
+}
diff --git a/hypview/view_navititle.html b/hypview/view_navititle.html
new file mode 100644
index 0000000..98f6013
--- /dev/null
+++ b/hypview/view_navititle.html
@@ -0,0 +1,17 @@
+{{define "navititle"}}
+
+ {{- $withParents := .HyphaNamePartsWithParents -}}
+ {{- $parts := .HyphaNameParts -}}
+
+ {{- .Icon -}}
+ :
+ {{- range $i, $part := .HyphaNameParts -}}
+ {{- if gt $i 0 -}}
+ /
+ {{- end -}}
+
+ {{- beautifulName $part -}}
+
+ {{- end}}
+
+{{end}}
\ No newline at end of file
diff --git a/views/hypha.qtpl b/views/hypha.qtpl
index 924cff3..cdf07df 100644
--- a/views/hypha.qtpl
+++ b/views/hypha.qtpl
@@ -1,5 +1,4 @@
{% import "path/filepath" %}
-{% import "strings" %}
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/hyphae" %}
@@ -47,34 +46,6 @@
{% endfunc %}
-{% func NaviTitle(h hyphae.Hypha) %}
-{% code
- var (
- prevAcc = "/hypha/"
- parts = strings.Split(h.CanonicalName(), "/")
- )
-%}
-
-{% stripspace %}
-
- {%-s= cfg.NaviTitleIcon -%}
- :
-
-
- {% for i, part := range parts %}
- {% if i > 0 %}
- /
- {% endif %}
-
-
- {%s= util.BeautifulName(part) %}
-
- {% code prevAcc += part + "/" %}
- {% endfor %}
-{% endstripspace %}
-
-{% endfunc %}
-
{% func MediaRaw(h *hyphae.MediaHypha) %}{%= Media(h, l18n.New("en", "en")) %}{% endfunc %}
{% func Media(h *hyphae.MediaHypha, lc *l18n.Localizer) %}
diff --git a/views/hypha.qtpl.go b/views/hypha.qtpl.go
index b5882d8..f36fe0d 100644
--- a/views/hypha.qtpl.go
+++ b/views/hypha.qtpl.go
@@ -7,204 +7,201 @@ package views
//line views/hypha.qtpl:1
import "path/filepath"
-//line views/hypha.qtpl:2
-import "strings"
-
-//line views/hypha.qtpl:4
+//line views/hypha.qtpl:3
import "github.com/bouncepaw/mycorrhiza/cfg"
-//line views/hypha.qtpl:5
+//line views/hypha.qtpl:4
import "github.com/bouncepaw/mycorrhiza/hyphae"
-//line views/hypha.qtpl:6
+//line views/hypha.qtpl:5
import "github.com/bouncepaw/mycorrhiza/l18n"
-//line views/hypha.qtpl:7
+//line views/hypha.qtpl:6
import "github.com/bouncepaw/mycorrhiza/user"
-//line views/hypha.qtpl:8
+//line views/hypha.qtpl:7
import "github.com/bouncepaw/mycorrhiza/util"
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
func streambeautifulLink(qw422016 *qt422016.Writer, hyphaName string) {
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qw422016.N().S(``)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qw422016.E().S(util.BeautifulName(hyphaName))
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qw422016.N().S(``)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
}
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
func writebeautifulLink(qq422016 qtio422016.Writer, hyphaName string) {
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
streambeautifulLink(qw422016, hyphaName)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
}
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
func beautifulLink(hyphaName string) string {
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
writebeautifulLink(qb422016, hyphaName)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
return qs422016
-//line views/hypha.qtpl:10
+//line views/hypha.qtpl:9
}
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
func streammycoLink(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qw422016.N().S(``)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qw422016.E().S(lc.Get("ui.notexist_write_myco"))
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qw422016.N().S(``)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
}
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
func writemycoLink(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
streammycoLink(qw422016, lc)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
}
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
func mycoLink(lc *l18n.Localizer) string {
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
writemycoLink(qb422016, lc)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
return qs422016
-//line views/hypha.qtpl:12
+//line views/hypha.qtpl:11
}
-//line views/hypha.qtpl:14
+//line views/hypha.qtpl:13
func streamnonExistentHyphaNotice(qw422016 *qt422016.Writer, h hyphae.Hypha, u *user.User, lc *l18n.Localizer) {
-//line views/hypha.qtpl:14
+//line views/hypha.qtpl:13
qw422016.N().S(`
`)
-//line views/hypha.qtpl:16
+//line views/hypha.qtpl:15
qw422016.E().S(lc.Get("ui.notexist_heading"))
-//line views/hypha.qtpl:16
+//line views/hypha.qtpl:15
qw422016.N().S(`
`)
-//line views/hypha.qtpl:17
+//line views/hypha.qtpl:16
if cfg.UseAuth && u.Group == "anon" {
-//line views/hypha.qtpl:17
+//line views/hypha.qtpl:16
qw422016.N().S(`
`)
-//line views/hypha.qtpl:18
+//line views/hypha.qtpl:17
qw422016.E().S(lc.Get("ui.notexist_norights"))
-//line views/hypha.qtpl:18
+//line views/hypha.qtpl:17
qw422016.N().S(`
`)
-//line views/hypha.qtpl:23
+//line views/hypha.qtpl:22
} else {
-//line views/hypha.qtpl:23
+//line views/hypha.qtpl:22
qw422016.N().S(`
🖼 `)
-//line views/hypha.qtpl:34
+//line views/hypha.qtpl:33
qw422016.E().S(lc.Get("ui.notexist_media"))
-//line views/hypha.qtpl:34
+//line views/hypha.qtpl:33
qw422016.N().S(`
`)
-//line views/hypha.qtpl:35
+//line views/hypha.qtpl:34
qw422016.E().S(lc.Get("ui.notexist_media_tip1"))
-//line views/hypha.qtpl:35
+//line views/hypha.qtpl:34
qw422016.N().S(`
`)
-//line views/hypha.qtpl:46
+//line views/hypha.qtpl:45
}
-//line views/hypha.qtpl:46
+//line views/hypha.qtpl:45
qw422016.N().S(`
`)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
}
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
func writenonExistentHyphaNotice(qq422016 qtio422016.Writer, h hyphae.Hypha, u *user.User, lc *l18n.Localizer) {
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
streamnonExistentHyphaNotice(qw422016, h, u, lc)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
}
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
func nonExistentHyphaNotice(h hyphae.Hypha, u *user.User, lc *l18n.Localizer) string {
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
writenonExistentHyphaNotice(qb422016, h, u, lc)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
return qs422016
-//line views/hypha.qtpl:48
+//line views/hypha.qtpl:47
}
-//line views/hypha.qtpl:50
-func StreamNaviTitle(qw422016 *qt422016.Writer, h hyphae.Hypha) {
-//line views/hypha.qtpl:50
- qw422016.N().S(`
-`)
-//line views/hypha.qtpl:52
- var (
- prevAcc = "/hypha/"
- parts = strings.Split(h.CanonicalName(), "/")
- )
-
-//line views/hypha.qtpl:56
- qw422016.N().S(`
-
-`)
-//line views/hypha.qtpl:76
-}
-
-//line views/hypha.qtpl:76
-func WriteNaviTitle(qq422016 qtio422016.Writer, h hyphae.Hypha) {
-//line views/hypha.qtpl:76
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:76
- StreamNaviTitle(qw422016, h)
-//line views/hypha.qtpl:76
- qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:76
-}
-
-//line views/hypha.qtpl:76
-func NaviTitle(h hyphae.Hypha) string {
-//line views/hypha.qtpl:76
- qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:76
- WriteNaviTitle(qb422016, h)
-//line views/hypha.qtpl:76
- qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:76
- qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:76
- return qs422016
-//line views/hypha.qtpl:76
-}
-
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
func StreamMediaRaw(qw422016 *qt422016.Writer, h *hyphae.MediaHypha) {
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
StreamMedia(qw422016, h, l18n.New("en", "en"))
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
}
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
func WriteMediaRaw(qq422016 qtio422016.Writer, h *hyphae.MediaHypha) {
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
StreamMediaRaw(qw422016, h)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
}
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
func MediaRaw(h *hyphae.MediaHypha) string {
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
WriteMediaRaw(qb422016, h)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
return qs422016
-//line views/hypha.qtpl:78
+//line views/hypha.qtpl:49
}
-//line views/hypha.qtpl:80
+//line views/hypha.qtpl:51
func StreamMedia(qw422016 *qt422016.Writer, h *hyphae.MediaHypha, lc *l18n.Localizer) {
-//line views/hypha.qtpl:80
+//line views/hypha.qtpl:51
qw422016.N().S(`
`)
-//line views/hypha.qtpl:81
+//line views/hypha.qtpl:52
switch filepath.Ext(h.MediaFilePath()) {
-//line views/hypha.qtpl:83
+//line views/hypha.qtpl:54
case ".jpg", ".gif", ".png", ".webp", ".svg", ".ico":
-//line views/hypha.qtpl:83
+//line views/hypha.qtpl:54
qw422016.N().S(`
`)
-//line views/hypha.qtpl:88
+//line views/hypha.qtpl:59
case ".ogg", ".webm", ".mp4":
-//line views/hypha.qtpl:88
+//line views/hypha.qtpl:59
qw422016.N().S(`
`)
-//line views/hypha.qtpl:96
+//line views/hypha.qtpl:67
case ".mp3":
-//line views/hypha.qtpl:96
+//line views/hypha.qtpl:67
qw422016.N().S(`
`)
-//line views/hypha.qtpl:104
+//line views/hypha.qtpl:75
default:
-//line views/hypha.qtpl:104
+//line views/hypha.qtpl:75
qw422016.N().S(`
`)
-//line views/hypha.qtpl:108
+//line views/hypha.qtpl:79
}
-//line views/hypha.qtpl:108
+//line views/hypha.qtpl:79
qw422016.N().S(`
`)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
}
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
func WriteMedia(qq422016 qtio422016.Writer, h *hyphae.MediaHypha, lc *l18n.Localizer) {
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
StreamMedia(qw422016, h, lc)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
qt422016.ReleaseWriter(qw422016)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
}
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
func Media(h *hyphae.MediaHypha, lc *l18n.Localizer) string {
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
qb422016 := qt422016.AcquireByteBuffer()
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
WriteMedia(qb422016, h, lc)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
qs422016 := string(qb422016.B)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
qt422016.ReleaseByteBuffer(qb422016)
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
return qs422016
-//line views/hypha.qtpl:109
+//line views/hypha.qtpl:80
}
diff --git a/views/readers.qtpl b/views/readers.qtpl
index 952ec7b..3797b72 100644
--- a/views/readers.qtpl
+++ b/views/readers.qtpl
@@ -5,6 +5,7 @@
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/hyphae" %}
+{% import "github.com/bouncepaw/mycorrhiza/hypview" %}
{% import "github.com/bouncepaw/mycorrhiza/categories" %}
{% import "github.com/bouncepaw/mycorrhiza/l18n" %}
{% import "github.com/bouncepaw/mycorrhiza/mimetype" %}
@@ -109,7 +110,7 @@ If you rename .prevnext, change the docs too.
{% endif %}
{% endif %}
- {%s= NaviTitle(h) %}
+ {%s= hypview.NaviTitle(meta, h.CanonicalName()) %}
{% switch h.(type) %}
{% case *hyphae.EmptyHypha %}
{%= nonExistentHyphaNotice(h, meta.U, meta.Lc) %}
@@ -135,11 +136,11 @@ If you rename .prevnext, change the docs too.
{%= viewScripts() %}
{% endfunc %}
-{% func Revision(rq *http.Request, lc *l18n.Localizer, h hyphae.Hypha, contents, revHash string) %}
+{% func Revision(meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) %}
diff --git a/views/readers.qtpl.go b/views/readers.qtpl.go
index bf5f036..27c2bf3 100644
--- a/views/readers.qtpl.go
+++ b/views/readers.qtpl.go
@@ -23,613 +23,616 @@ import "github.com/bouncepaw/mycorrhiza/cfg"
import "github.com/bouncepaw/mycorrhiza/hyphae"
//line views/readers.qtpl:8
-import "github.com/bouncepaw/mycorrhiza/categories"
+import "github.com/bouncepaw/mycorrhiza/hypview"
//line views/readers.qtpl:9
-import "github.com/bouncepaw/mycorrhiza/l18n"
+import "github.com/bouncepaw/mycorrhiza/categories"
//line views/readers.qtpl:10
-import "github.com/bouncepaw/mycorrhiza/mimetype"
+import "github.com/bouncepaw/mycorrhiza/l18n"
//line views/readers.qtpl:11
-import "github.com/bouncepaw/mycorrhiza/tree"
+import "github.com/bouncepaw/mycorrhiza/mimetype"
//line views/readers.qtpl:12
-import "github.com/bouncepaw/mycorrhiza/user"
+import "github.com/bouncepaw/mycorrhiza/tree"
//line views/readers.qtpl:13
-import "github.com/bouncepaw/mycorrhiza/util"
+import "github.com/bouncepaw/mycorrhiza/user"
//line views/readers.qtpl:14
+import "github.com/bouncepaw/mycorrhiza/util"
+
+//line views/readers.qtpl:15
import "github.com/bouncepaw/mycorrhiza/viewutil"
-//line views/readers.qtpl:16
+//line views/readers.qtpl:17
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
-//line views/readers.qtpl:16
+//line views/readers.qtpl:17
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
-//line views/readers.qtpl:16
+//line views/readers.qtpl:17
func StreamMediaMenu(qw422016 *qt422016.Writer, rq *http.Request, h hyphae.Hypha, u *user.User) {
-//line views/readers.qtpl:16
+//line views/readers.qtpl:17
qw422016.N().S(`
`)
-//line views/readers.qtpl:18
+//line views/readers.qtpl:19
lc := l18n.FromRequest(rq)
-//line views/readers.qtpl:19
+//line views/readers.qtpl:20
qw422016.N().S(`
`)
-//line views/readers.qtpl:21
+//line views/readers.qtpl:22
qw422016.N().S(lc.Get("ui.media_title", &l18n.Replacements{"name": beautifulLink(h.CanonicalName())}))
-//line views/readers.qtpl:21
+//line views/readers.qtpl:22
qw422016.N().S(`
`)
-//line views/readers.qtpl:22
+//line views/readers.qtpl:23
switch h.(type) {
-//line views/readers.qtpl:23
+//line views/readers.qtpl:24
case *hyphae.MediaHypha:
-//line views/readers.qtpl:23
+//line views/readers.qtpl:24
qw422016.N().S(`
`)
-//line views/readers.qtpl:24
+//line views/readers.qtpl:25
qw422016.E().S(lc.Get("ui.media_tip"))
-//line views/readers.qtpl:24
+//line views/readers.qtpl:25
qw422016.N().S(` `)
-//line views/readers.qtpl:24
+//line views/readers.qtpl:25
qw422016.E().S(lc.Get("ui.media_what_is"))
-//line views/readers.qtpl:24
+//line views/readers.qtpl:25
qw422016.N().S(`
`)
-//line views/readers.qtpl:25
+//line views/readers.qtpl:26
default:
-//line views/readers.qtpl:25
+//line views/readers.qtpl:26
qw422016.N().S(`
`)
-//line views/readers.qtpl:26
+//line views/readers.qtpl:27
qw422016.E().S(lc.Get("ui.media_empty"))
-//line views/readers.qtpl:26
+//line views/readers.qtpl:27
qw422016.N().S(` `)
-//line views/readers.qtpl:26
+//line views/readers.qtpl:27
qw422016.E().S(lc.Get("ui.media_what_is"))
-//line views/readers.qtpl:26
+//line views/readers.qtpl:27
qw422016.N().S(`
`)
-//line views/readers.qtpl:27
+//line views/readers.qtpl:28
}
-//line views/readers.qtpl:27
+//line views/readers.qtpl:28
qw422016.N().S(`
`)
-//line views/readers.qtpl:30
+//line views/readers.qtpl:31
switch h := h.(type) {
-//line views/readers.qtpl:31
+//line views/readers.qtpl:32
case *hyphae.MediaHypha:
-//line views/readers.qtpl:31
+//line views/readers.qtpl:32
qw422016.N().S(`
`)
-//line views/readers.qtpl:33
+//line views/readers.qtpl:34
mime := mimetype.FromExtension(path.Ext(h.MediaFilePath()))
fileinfo, err := os.Stat(h.MediaFilePath())
-//line views/readers.qtpl:34
+//line views/readers.qtpl:35
qw422016.N().S(`
`)
-//line views/readers.qtpl:35
+//line views/readers.qtpl:36
if err == nil {
-//line views/readers.qtpl:35
+//line views/readers.qtpl:36
qw422016.N().S(`
`)
-//line views/readers.qtpl:41
+//line views/readers.qtpl:42
}
-//line views/readers.qtpl:41
+//line views/readers.qtpl:42
qw422016.N().S(`
`)
-//line views/readers.qtpl:43
+//line views/readers.qtpl:44
if strings.HasPrefix(mime, "image/") {
-//line views/readers.qtpl:43
+//line views/readers.qtpl:44
qw422016.N().S(`
`)
-//line views/readers.qtpl:49
+//line views/readers.qtpl:50
}
-//line views/readers.qtpl:49
+//line views/readers.qtpl:50
qw422016.N().S(`
`)
-//line views/readers.qtpl:50
+//line views/readers.qtpl:51
}
-//line views/readers.qtpl:50
+//line views/readers.qtpl:51
qw422016.N().S(`
`)
-//line views/readers.qtpl:52
+//line views/readers.qtpl:53
if u.CanProceed("upload-binary") {
-//line views/readers.qtpl:52
+//line views/readers.qtpl:53
qw422016.N().S(`
`)
-//line views/readers.qtpl:65
+//line views/readers.qtpl:66
}
-//line views/readers.qtpl:65
+//line views/readers.qtpl:66
qw422016.N().S(`
`)
-//line views/readers.qtpl:68
+//line views/readers.qtpl:69
switch h := h.(type) {
-//line views/readers.qtpl:69
+//line views/readers.qtpl:70
case *hyphae.MediaHypha:
-//line views/readers.qtpl:69
+//line views/readers.qtpl:70
qw422016.N().S(`
`)
-//line views/readers.qtpl:70
+//line views/readers.qtpl:71
if u.CanProceed("remove-media") {
-//line views/readers.qtpl:70
+//line views/readers.qtpl:71
qw422016.N().S(`
`)
-//line views/readers.qtpl:78
+//line views/readers.qtpl:79
}
-//line views/readers.qtpl:78
+//line views/readers.qtpl:79
qw422016.N().S(`
`)
-//line views/readers.qtpl:79
+//line views/readers.qtpl:80
}
-//line views/readers.qtpl:79
+//line views/readers.qtpl:80
qw422016.N().S(`
`)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
}
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
func WriteMediaMenu(qq422016 qtio422016.Writer, rq *http.Request, h hyphae.Hypha, u *user.User) {
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
StreamMediaMenu(qw422016, rq, h, u)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
qt422016.ReleaseWriter(qw422016)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
}
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
func MediaMenu(rq *http.Request, h hyphae.Hypha, u *user.User) string {
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
qb422016 := qt422016.AcquireByteBuffer()
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
WriteMediaMenu(qb422016, rq, h, u)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
qs422016 := string(qb422016.B)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
qt422016.ReleaseByteBuffer(qb422016)
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
return qs422016
-//line views/readers.qtpl:83
+//line views/readers.qtpl:84
}
// If `contents` == "", a helpful message is shown instead.
//
// If you rename .prevnext, change the docs too.
-//line views/readers.qtpl:88
+//line views/readers.qtpl:89
func StreamHypha(qw422016 *qt422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents string) {
-//line views/readers.qtpl:88
+//line views/readers.qtpl:89
qw422016.N().S(`
`)
-//line views/readers.qtpl:90
+//line views/readers.qtpl:91
siblings, subhyphae, prevHyphaName, nextHyphaName := tree.Tree(h.CanonicalName())
lc := meta.Lc
-//line views/readers.qtpl:92
+//line views/readers.qtpl:93
qw422016.N().S(`
`)
-//line views/readers.qtpl:95
+//line views/readers.qtpl:96
if meta.U.CanProceed("edit") {
-//line views/readers.qtpl:95
+//line views/readers.qtpl:96
qw422016.N().S(`
`)
-//line views/readers.qtpl:99
+//line views/readers.qtpl:100
}
-//line views/readers.qtpl:99
+//line views/readers.qtpl:100
qw422016.N().S(`
`)
-//line views/readers.qtpl:101
+//line views/readers.qtpl:102
if cfg.UseAuth && util.IsProfileName(h.CanonicalName()) && meta.U.Name == strings.TrimPrefix(h.CanonicalName(), cfg.UserHypha+"/") {
-//line views/readers.qtpl:101
+//line views/readers.qtpl:102
qw422016.N().S(`
`)
-//line views/readers.qtpl:105
+//line views/readers.qtpl:106
if meta.U.Group == "admin" {
-//line views/readers.qtpl:105
+//line views/readers.qtpl:106
qw422016.N().S(`
`)
-//line views/readers.qtpl:109
+//line views/readers.qtpl:110
}
-//line views/readers.qtpl:109
+//line views/readers.qtpl:110
qw422016.N().S(`
`)
-//line views/readers.qtpl:110
+//line views/readers.qtpl:111
}
-//line views/readers.qtpl:110
+//line views/readers.qtpl:111
qw422016.N().S(`
`)
-//line views/readers.qtpl:112
- qw422016.N().S(NaviTitle(h))
-//line views/readers.qtpl:112
+//line views/readers.qtpl:113
+ qw422016.N().S(hypview.NaviTitle(meta, h.CanonicalName()))
+//line views/readers.qtpl:113
qw422016.N().S(`
`)
-//line views/readers.qtpl:113
+//line views/readers.qtpl:114
switch h.(type) {
-//line views/readers.qtpl:114
+//line views/readers.qtpl:115
case *hyphae.EmptyHypha:
-//line views/readers.qtpl:114
+//line views/readers.qtpl:115
qw422016.N().S(`
`)
-//line views/readers.qtpl:115
+//line views/readers.qtpl:116
streamnonExistentHyphaNotice(qw422016, h, meta.U, meta.Lc)
-//line views/readers.qtpl:115
+//line views/readers.qtpl:116
qw422016.N().S(`
`)
-//line views/readers.qtpl:116
+//line views/readers.qtpl:117
default:
-//line views/readers.qtpl:116
+//line views/readers.qtpl:117
qw422016.N().S(`
`)
-//line views/readers.qtpl:117
+//line views/readers.qtpl:118
qw422016.N().S(contents)
-//line views/readers.qtpl:117
+//line views/readers.qtpl:118
qw422016.N().S(`
`)
-//line views/readers.qtpl:118
+//line views/readers.qtpl:119
}
-//line views/readers.qtpl:118
+//line views/readers.qtpl:119
qw422016.N().S(`
`)
-//line views/readers.qtpl:128
+//line views/readers.qtpl:129
StreamSubhyphae(qw422016, subhyphae, meta.Lc)
-//line views/readers.qtpl:128
+//line views/readers.qtpl:129
qw422016.N().S(`
`)
-//line views/readers.qtpl:130
+//line views/readers.qtpl:131
streamhyphaInfo(qw422016, meta, h)
-//line views/readers.qtpl:130
+//line views/readers.qtpl:131
qw422016.N().S(`
`)
-//line views/readers.qtpl:133
+//line views/readers.qtpl:134
qw422016.N().S(categories.CategoryCard(meta, h.CanonicalName()))
-//line views/readers.qtpl:133
+//line views/readers.qtpl:134
qw422016.N().S(`
`)
-//line views/readers.qtpl:134
+//line views/readers.qtpl:135
streamsiblingHyphae(qw422016, siblings, meta.Lc)
-//line views/readers.qtpl:134
+//line views/readers.qtpl:135
qw422016.N().S(`
`)
-//line views/readers.qtpl:135
+//line views/readers.qtpl:136
streamviewScripts(qw422016)
-//line views/readers.qtpl:135
+//line views/readers.qtpl:136
qw422016.N().S(`
`)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
}
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
func WriteHypha(qq422016 qtio422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents string) {
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
StreamHypha(qw422016, meta, h, contents)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
qt422016.ReleaseWriter(qw422016)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
}
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
func Hypha(meta viewutil.Meta, h hyphae.Hypha, contents string) string {
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
qb422016 := qt422016.AcquireByteBuffer()
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
WriteHypha(qb422016, meta, h, contents)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
qs422016 := string(qb422016.B)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
qt422016.ReleaseByteBuffer(qb422016)
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
return qs422016
-//line views/readers.qtpl:136
+//line views/readers.qtpl:137
}
-//line views/readers.qtpl:138
-func StreamRevision(qw422016 *qt422016.Writer, rq *http.Request, lc *l18n.Localizer, h hyphae.Hypha, contents, revHash string) {
-//line views/readers.qtpl:138
+//line views/readers.qtpl:139
+func StreamRevision(qw422016 *qt422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) {
+//line views/readers.qtpl:139
qw422016.N().S(`
`)
-//line views/readers.qtpl:146
+//line views/readers.qtpl:147
streamviewScripts(qw422016)
-//line views/readers.qtpl:146
+//line views/readers.qtpl:147
qw422016.N().S(`
`)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
}
-//line views/readers.qtpl:147
-func WriteRevision(qq422016 qtio422016.Writer, rq *http.Request, lc *l18n.Localizer, h hyphae.Hypha, contents, revHash string) {
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
+func WriteRevision(qq422016 qtio422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) {
+//line views/readers.qtpl:148
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/readers.qtpl:147
- StreamRevision(qw422016, rq, lc, h, contents, revHash)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
+ StreamRevision(qw422016, meta, h, contents, revHash)
+//line views/readers.qtpl:148
qt422016.ReleaseWriter(qw422016)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
}
-//line views/readers.qtpl:147
-func Revision(rq *http.Request, lc *l18n.Localizer, h hyphae.Hypha, contents, revHash string) string {
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
+func Revision(meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) string {
+//line views/readers.qtpl:148
qb422016 := qt422016.AcquireByteBuffer()
-//line views/readers.qtpl:147
- WriteRevision(qb422016, rq, lc, h, contents, revHash)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
+ WriteRevision(qb422016, meta, h, contents, revHash)
+//line views/readers.qtpl:148
qs422016 := string(qb422016.B)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
qt422016.ReleaseByteBuffer(qb422016)
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
return qs422016
-//line views/readers.qtpl:147
+//line views/readers.qtpl:148
}
-//line views/readers.qtpl:149
+//line views/readers.qtpl:150
func streamviewScripts(qw422016 *qt422016.Writer) {
-//line views/readers.qtpl:149
+//line views/readers.qtpl:150
qw422016.N().S(`
`)
-//line views/readers.qtpl:150
+//line views/readers.qtpl:151
for _, scriptPath := range cfg.ViewScripts {
-//line views/readers.qtpl:150
+//line views/readers.qtpl:151
qw422016.N().S(`
`)
-//line views/readers.qtpl:152
+//line views/readers.qtpl:153
}
-//line views/readers.qtpl:152
+//line views/readers.qtpl:153
qw422016.N().S(`
`)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
}
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
func writeviewScripts(qq422016 qtio422016.Writer) {
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
streamviewScripts(qw422016)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
qt422016.ReleaseWriter(qw422016)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
}
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
func viewScripts() string {
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
qb422016 := qt422016.AcquireByteBuffer()
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
writeviewScripts(qb422016)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
qs422016 := string(qb422016.B)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
qt422016.ReleaseByteBuffer(qb422016)
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
return qs422016
-//line views/readers.qtpl:153
+//line views/readers.qtpl:154
}
diff --git a/viewutil/viewutil.go b/viewutil/viewutil.go
index c7018d3..08791ca 100644
--- a/viewutil/viewutil.go
+++ b/viewutil/viewutil.go
@@ -35,6 +35,7 @@ func Init() {
BaseEn = m(m(template.New("").
Funcs(template.FuncMap{
"beautifulName": util.BeautifulName,
+ "inc": func(i int) int { return i + 1 },
}).ParseFS(fsys, "base.html")).
Parse(dataText))
if !cfg.UseAuth {
diff --git a/web/readers.go b/web/readers.go
index acccb33..577f57b 100644
--- a/web/readers.go
+++ b/web/readers.go
@@ -145,8 +145,7 @@ func handlerRevision(w http.ResponseWriter, rq *http.Request) {
}
}
page := views.Revision(
- rq,
- lc,
+ viewutil.MetaFrom(w, rq),
h,
contents,
revHash,
diff --git a/web/web.go b/web/web.go
index 2511e6b..9cf16b4 100644
--- a/web/web.go
+++ b/web/web.go
@@ -5,6 +5,7 @@ import (
"github.com/bouncepaw/mycorrhiza/backlinks"
"github.com/bouncepaw/mycorrhiza/categories"
"github.com/bouncepaw/mycorrhiza/help"
+ "github.com/bouncepaw/mycorrhiza/hypview"
"github.com/bouncepaw/mycorrhiza/misc"
"io"
"net/http"
@@ -52,6 +53,7 @@ func Handler() http.Handler {
backlinks.InitHandlers(wikiRouter)
categories.InitHandlers(wikiRouter)
misc.InitHandlers(wikiRouter)
+ hypview.Init()
// Admin routes.
if cfg.UseAuth {