diff --git a/main.go b/main.go
index 5ba03fc..66006bd 100644
--- a/main.go
+++ b/main.go
@@ -1,6 +1,4 @@
// Command mycorrhiza is a program that runs a mycorrhiza wiki.
-//
-//go:generate go run github.com/valyala/quicktemplate/qtc -dir=mycoopts
package main
import (
diff --git a/mycoopts/mycoopts.go b/mycoopts/mycoopts.go
index 7fe78a8..86efc4a 100644
--- a/mycoopts/mycoopts.go
+++ b/mycoopts/mycoopts.go
@@ -2,10 +2,14 @@ package mycoopts
import (
"errors"
+ "fmt"
+ "html"
+ "path/filepath"
"github.com/bouncepaw/mycorrhiza/internal/cfg"
"github.com/bouncepaw/mycorrhiza/internal/hyphae"
"github.com/bouncepaw/mycorrhiza/interwiki"
+ "github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/util"
"git.sr.ht/~bouncepaw/mycomarkup/v5/options"
@@ -54,3 +58,58 @@ func MarkupOptions(hyphaName string) options.Options {
ImgSrcFormatForInterwikiPrefix: interwiki.ImgSrcFormatFor,
}.FillTheRest()
}
+
+func mediaRaw(h *hyphae.MediaHypha) string {
+ return Media(h, l18n.New("en", "en"))
+}
+
+func Media(h *hyphae.MediaHypha, lc *l18n.Localizer) string {
+ name := html.EscapeString(h.CanonicalName())
+
+ switch filepath.Ext(h.MediaFilePath()) {
+ case ".jpg", ".gif", ".png", ".webp", ".svg", ".ico":
+ return fmt.Sprintf(
+ `
+

+
`,
+ name, name,
+ )
+
+ case ".ogg", ".webm", ".mp4":
+ return fmt.Sprintf(
+ ``,
+ name,
+ html.EscapeString(lc.Get("ui.media_novideo")),
+ name,
+ html.EscapeString(lc.Get("ui.media_novideo_link")),
+ )
+
+ case ".mp3", ".wav", ".flac":
+ return fmt.Sprintf(
+ ``,
+ name,
+ html.EscapeString(lc.Get("ui.media_noaudio")),
+ name,
+ html.EscapeString(lc.Get("ui.media_noaudio_link")),
+ )
+
+ default:
+ return fmt.Sprintf(
+ ``,
+ name,
+ html.EscapeString(lc.Get("ui.media_download")),
+ )
+ }
+}
diff --git a/mycoopts/view.qtpl b/mycoopts/view.qtpl
deleted file mode 100644
index ce0590c..0000000
--- a/mycoopts/view.qtpl
+++ /dev/null
@@ -1,37 +0,0 @@
-{% import "path/filepath" %}
-
-{% import "github.com/bouncepaw/mycorrhiza/internal/hyphae" %}
-{% import "github.com/bouncepaw/mycorrhiza/l18n" %}
-
-{% func mediaRaw(h *hyphae.MediaHypha) %}{%= Media(h, l18n.New("en", "en")) %}{% endfunc %}
-
-{% func Media(h *hyphae.MediaHypha, lc *l18n.Localizer) %}
- {% switch filepath.Ext(h.MediaFilePath()) %}
-
- {% case ".jpg", ".gif", ".png", ".webp", ".svg", ".ico" %}
-
-
 %})
-
-
- {% case ".ogg", ".webm", ".mp4" %}
-
-
- {% case ".mp3", ".wav", ".flac" %}
-
-
- {% default %}
-
-{% endswitch %}
-{% endfunc %}
diff --git a/mycoopts/view.qtpl.go b/mycoopts/view.qtpl.go
deleted file mode 100644
index 2ed91e8..0000000
--- a/mycoopts/view.qtpl.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Code generated by qtc from "view.qtpl". DO NOT EDIT.
-// See https://github.com/valyala/quicktemplate for details.
-
-//line mycoopts/view.qtpl:1
-package mycoopts
-
-//line mycoopts/view.qtpl:1
-import "path/filepath"
-
-//line mycoopts/view.qtpl:3
-import "github.com/bouncepaw/mycorrhiza/internal/hyphae"
-
-//line mycoopts/view.qtpl:4
-import "github.com/bouncepaw/mycorrhiza/l18n"
-
-//line mycoopts/view.qtpl:6
-import (
- qtio422016 "io"
-
- qt422016 "github.com/valyala/quicktemplate"
-)
-
-//line mycoopts/view.qtpl:6
-var (
- _ = qtio422016.Copy
- _ = qt422016.AcquireByteBuffer
-)
-
-//line mycoopts/view.qtpl:6
-func streammediaRaw(qw422016 *qt422016.Writer, h *hyphae.MediaHypha) {
-//line mycoopts/view.qtpl:6
- StreamMedia(qw422016, h, l18n.New("en", "en"))
-//line mycoopts/view.qtpl:6
-}
-
-//line mycoopts/view.qtpl:6
-func writemediaRaw(qq422016 qtio422016.Writer, h *hyphae.MediaHypha) {
-//line mycoopts/view.qtpl:6
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line mycoopts/view.qtpl:6
- streammediaRaw(qw422016, h)
-//line mycoopts/view.qtpl:6
- qt422016.ReleaseWriter(qw422016)
-//line mycoopts/view.qtpl:6
-}
-
-//line mycoopts/view.qtpl:6
-func mediaRaw(h *hyphae.MediaHypha) string {
-//line mycoopts/view.qtpl:6
- qb422016 := qt422016.AcquireByteBuffer()
-//line mycoopts/view.qtpl:6
- writemediaRaw(qb422016, h)
-//line mycoopts/view.qtpl:6
- qs422016 := string(qb422016.B)
-//line mycoopts/view.qtpl:6
- qt422016.ReleaseByteBuffer(qb422016)
-//line mycoopts/view.qtpl:6
- return qs422016
-//line mycoopts/view.qtpl:6
-}
-
-//line mycoopts/view.qtpl:8
-func StreamMedia(qw422016 *qt422016.Writer, h *hyphae.MediaHypha, lc *l18n.Localizer) {
-//line mycoopts/view.qtpl:8
- qw422016.N().S(`
- `)
-//line mycoopts/view.qtpl:9
- switch filepath.Ext(h.MediaFilePath()) {
-//line mycoopts/view.qtpl:11
- case ".jpg", ".gif", ".png", ".webp", ".svg", ".ico":
-//line mycoopts/view.qtpl:11
- qw422016.N().S(`
-
-

-//line mycoopts/view.qtpl:13
- qw422016.N().S(h.CanonicalName())
-//line mycoopts/view.qtpl:13
- qw422016.N().S(`)
-
-
- `)
-//line mycoopts/view.qtpl:16
- case ".ogg", ".webm", ".mp4":
-//line mycoopts/view.qtpl:16
- qw422016.N().S(`
-
-
- `)
-//line mycoopts/view.qtpl:24
- case ".mp3", ".wav", ".flac":
-//line mycoopts/view.qtpl:24
- qw422016.N().S(`
-
-
- `)
-//line mycoopts/view.qtpl:32
- default:
-//line mycoopts/view.qtpl:32
- qw422016.N().S(`
-
-`)
-//line mycoopts/view.qtpl:36
- }
-//line mycoopts/view.qtpl:36
- qw422016.N().S(`
-`)
-//line mycoopts/view.qtpl:37
-}
-
-//line mycoopts/view.qtpl:37
-func WriteMedia(qq422016 qtio422016.Writer, h *hyphae.MediaHypha, lc *l18n.Localizer) {
-//line mycoopts/view.qtpl:37
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line mycoopts/view.qtpl:37
- StreamMedia(qw422016, h, lc)
-//line mycoopts/view.qtpl:37
- qt422016.ReleaseWriter(qw422016)
-//line mycoopts/view.qtpl:37
-}
-
-//line mycoopts/view.qtpl:37
-func Media(h *hyphae.MediaHypha, lc *l18n.Localizer) string {
-//line mycoopts/view.qtpl:37
- qb422016 := qt422016.AcquireByteBuffer()
-//line mycoopts/view.qtpl:37
- WriteMedia(qb422016, h, lc)
-//line mycoopts/view.qtpl:37
- qs422016 := string(qb422016.B)
-//line mycoopts/view.qtpl:37
- qt422016.ReleaseByteBuffer(qb422016)
-//line mycoopts/view.qtpl:37
- return qs422016
-//line mycoopts/view.qtpl:37
-}