From 68a757376481d5fb086fc08fa543707ca8101b1a Mon Sep 17 00:00:00 2001 From: Timur Ismagilov Date: Sat, 29 Jun 2024 20:19:13 +0300 Subject: [PATCH] Make views multi-file and break compilation --- hypview/hypview.go | 22 +- hypview/readers.qtpl | 3 - hypview/readers.qtpl.go | 543 ++++++++++---------------------------- internal/shroom/upload.go | 13 +- internal/tree/tree.go | 4 +- web/newtmpl/newtmpl.go | 4 +- web/pages.go | 87 +++++- 7 files changed, 228 insertions(+), 448 deletions(-) diff --git a/hypview/hypview.go b/hypview/hypview.go index 5ec43f1..6fdd26b 100644 --- a/hypview/hypview.go +++ b/hypview/hypview.go @@ -48,26 +48,6 @@ func RenameHypha(meta viewutil.Meta, hyphaName string) { }) } -type emptyHyphaData struct { - Meta viewutil.Meta - HyphaName string - AllowRegistration bool - UseAuth bool -} - -func EmptyHypha(meta viewutil.Meta, hyphaName string) string { - var buf strings.Builder - if err := chainEmptyHypha.Get(meta).ExecuteTemplate(&buf, "empty hypha card", emptyHyphaData{ - Meta: meta, - HyphaName: hyphaName, - AllowRegistration: cfg.AllowRegistration, - UseAuth: cfg.UseAuth, - }); err != nil { - log.Println(err) - } - return buf.String() -} - type naviTitleData struct { HyphaNameParts []string HyphaNamePartsWithParents []string @@ -87,7 +67,7 @@ func NaviTitle(meta viewutil.Meta, hyphaName string) template.HTML { if err != nil { log.Println(err) } - return buf.String() + return template.HTML(buf.String()) } func naviTitleify(hyphaName string) ([]string, []string) { diff --git a/hypview/readers.qtpl b/hypview/readers.qtpl index 136e42d..c37eb1c 100644 --- a/hypview/readers.qtpl +++ b/hypview/readers.qtpl @@ -5,12 +5,9 @@ {% import "github.com/bouncepaw/mycorrhiza/internal/cfg" %} {% import "github.com/bouncepaw/mycorrhiza/internal/hyphae" %} -{% import "github.com/bouncepaw/mycorrhiza/categories" %} {% import "github.com/bouncepaw/mycorrhiza/l18n" %} {% import "github.com/bouncepaw/mycorrhiza/internal/mimetype" %} -{% import "github.com/bouncepaw/mycorrhiza/internal/tree" %} {% import "github.com/bouncepaw/mycorrhiza/internal/user" %} -{% import "github.com/bouncepaw/mycorrhiza/util" %} {% import "github.com/bouncepaw/mycorrhiza/web/viewutil" %} {% func MediaMenu(rq *http.Request, h hyphae.Hypha, u *user.User) %} diff --git a/hypview/readers.qtpl.go b/hypview/readers.qtpl.go index b55336e..b87d96a 100644 --- a/hypview/readers.qtpl.go +++ b/hypview/readers.qtpl.go @@ -23,629 +23,360 @@ import "github.com/bouncepaw/mycorrhiza/internal/cfg" import "github.com/bouncepaw/mycorrhiza/internal/hyphae" //line hypview/readers.qtpl:8 -import "github.com/bouncepaw/mycorrhiza/categories" - -//line hypview/readers.qtpl:9 import "github.com/bouncepaw/mycorrhiza/l18n" -//line hypview/readers.qtpl:10 +//line hypview/readers.qtpl:9 import "github.com/bouncepaw/mycorrhiza/internal/mimetype" -//line hypview/readers.qtpl:11 -import "github.com/bouncepaw/mycorrhiza/tree" - -//line hypview/readers.qtpl:12 +//line hypview/readers.qtpl:10 import "github.com/bouncepaw/mycorrhiza/internal/user" -//line hypview/readers.qtpl:13 -import "github.com/bouncepaw/mycorrhiza/util" - -//line hypview/readers.qtpl:14 +//line hypview/readers.qtpl:11 import "github.com/bouncepaw/mycorrhiza/web/viewutil" -//line hypview/readers.qtpl:16 +//line hypview/readers.qtpl:13 import ( qtio422016 "io" qt422016 "github.com/valyala/quicktemplate" ) -//line hypview/readers.qtpl:16 +//line hypview/readers.qtpl:13 var ( _ = qtio422016.Copy _ = qt422016.AcquireByteBuffer ) -//line hypview/readers.qtpl:16 +//line hypview/readers.qtpl:13 func StreamMediaMenu(qw422016 *qt422016.Writer, rq *http.Request, h hyphae.Hypha, u *user.User) { -//line hypview/readers.qtpl:16 +//line hypview/readers.qtpl:13 qw422016.N().S(` `) -//line hypview/readers.qtpl:18 +//line hypview/readers.qtpl:15 lc := l18n.FromRequest(rq) -//line hypview/readers.qtpl:19 +//line hypview/readers.qtpl:16 qw422016.N().S(`

`) -//line hypview/readers.qtpl:21 +//line hypview/readers.qtpl:18 qw422016.N().S(lc.Get("ui.media_title", &l18n.Replacements{"name": beautifulLink(h.CanonicalName())})) -//line hypview/readers.qtpl:21 +//line hypview/readers.qtpl:18 qw422016.N().S(`

`) -//line hypview/readers.qtpl:22 +//line hypview/readers.qtpl:19 switch h.(type) { -//line hypview/readers.qtpl:23 +//line hypview/readers.qtpl:20 case *hyphae.MediaHypha: -//line hypview/readers.qtpl:23 +//line hypview/readers.qtpl:20 qw422016.N().S(`

`) -//line hypview/readers.qtpl:24 +//line hypview/readers.qtpl:21 qw422016.E().S(lc.Get("ui.media_tip")) -//line hypview/readers.qtpl:24 +//line hypview/readers.qtpl:21 qw422016.N().S(` `) -//line hypview/readers.qtpl:24 +//line hypview/readers.qtpl:21 qw422016.E().S(lc.Get("ui.media_what_is")) -//line hypview/readers.qtpl:24 +//line hypview/readers.qtpl:21 qw422016.N().S(`

`) -//line hypview/readers.qtpl:25 +//line hypview/readers.qtpl:22 default: -//line hypview/readers.qtpl:25 +//line hypview/readers.qtpl:22 qw422016.N().S(`

`) -//line hypview/readers.qtpl:26 +//line hypview/readers.qtpl:23 qw422016.E().S(lc.Get("ui.media_empty")) -//line hypview/readers.qtpl:26 +//line hypview/readers.qtpl:23 qw422016.N().S(` `) -//line hypview/readers.qtpl:26 +//line hypview/readers.qtpl:23 qw422016.E().S(lc.Get("ui.media_what_is")) -//line hypview/readers.qtpl:26 +//line hypview/readers.qtpl:23 qw422016.N().S(`

`) -//line hypview/readers.qtpl:27 +//line hypview/readers.qtpl:24 } -//line hypview/readers.qtpl:27 +//line hypview/readers.qtpl:24 qw422016.N().S(`
`) -//line hypview/readers.qtpl:30 +//line hypview/readers.qtpl:27 switch h := h.(type) { -//line hypview/readers.qtpl:31 +//line hypview/readers.qtpl:28 case *hyphae.MediaHypha: -//line hypview/readers.qtpl:31 +//line hypview/readers.qtpl:28 qw422016.N().S(` `) -//line hypview/readers.qtpl:33 +//line hypview/readers.qtpl:30 mime := mimetype.FromExtension(path.Ext(h.MediaFilePath())) fileinfo, err := os.Stat(h.MediaFilePath()) -//line hypview/readers.qtpl:34 +//line hypview/readers.qtpl:31 qw422016.N().S(` `) -//line hypview/readers.qtpl:35 +//line hypview/readers.qtpl:32 if err == nil { -//line hypview/readers.qtpl:35 +//line hypview/readers.qtpl:32 qw422016.N().S(`
`) -//line hypview/readers.qtpl:37 +//line hypview/readers.qtpl:34 qw422016.E().S(lc.Get("ui.media_stat")) -//line hypview/readers.qtpl:37 +//line hypview/readers.qtpl:34 qw422016.N().S(`

`) -//line hypview/readers.qtpl:39 +//line hypview/readers.qtpl:36 qw422016.E().S(lc.Get("ui.media_stat_mime")) -//line hypview/readers.qtpl:39 +//line hypview/readers.qtpl:36 qw422016.N().S(` `) -//line hypview/readers.qtpl:39 +//line hypview/readers.qtpl:36 qw422016.E().S(mime) -//line hypview/readers.qtpl:39 +//line hypview/readers.qtpl:36 qw422016.N().S(`

`) -//line hypview/readers.qtpl:41 +//line hypview/readers.qtpl:38 } -//line hypview/readers.qtpl:41 +//line hypview/readers.qtpl:38 qw422016.N().S(` `) -//line hypview/readers.qtpl:43 +//line hypview/readers.qtpl:40 if strings.HasPrefix(mime, "image/") { -//line hypview/readers.qtpl:43 +//line hypview/readers.qtpl:40 qw422016.N().S(`
`) -//line hypview/readers.qtpl:45 +//line hypview/readers.qtpl:42 qw422016.E().S(lc.Get("ui.media_include")) -//line hypview/readers.qtpl:45 +//line hypview/readers.qtpl:42 qw422016.N().S(`
img { `)
-//line hypview/readers.qtpl:47
+//line hypview/readers.qtpl:44
 			qw422016.E().S(h.CanonicalName())
-//line hypview/readers.qtpl:47
+//line hypview/readers.qtpl:44
 			qw422016.N().S(` }
`) -//line hypview/readers.qtpl:49 +//line hypview/readers.qtpl:46 } -//line hypview/readers.qtpl:49 +//line hypview/readers.qtpl:46 qw422016.N().S(` `) -//line hypview/readers.qtpl:50 +//line hypview/readers.qtpl:47 } -//line hypview/readers.qtpl:50 +//line hypview/readers.qtpl:47 qw422016.N().S(` `) -//line hypview/readers.qtpl:52 +//line hypview/readers.qtpl:49 if u.CanProceed("upload-binary") { -//line hypview/readers.qtpl:52 +//line hypview/readers.qtpl:49 qw422016.N().S(` `) -//line hypview/readers.qtpl:65 +//line hypview/readers.qtpl:62 } -//line hypview/readers.qtpl:65 +//line hypview/readers.qtpl:62 qw422016.N().S(` `) -//line hypview/readers.qtpl:68 +//line hypview/readers.qtpl:65 switch h := h.(type) { -//line hypview/readers.qtpl:69 +//line hypview/readers.qtpl:66 case *hyphae.MediaHypha: -//line hypview/readers.qtpl:69 +//line hypview/readers.qtpl:66 qw422016.N().S(` `) -//line hypview/readers.qtpl:70 +//line hypview/readers.qtpl:67 if u.CanProceed("remove-media") { -//line hypview/readers.qtpl:70 +//line hypview/readers.qtpl:67 qw422016.N().S(` `) -//line hypview/readers.qtpl:78 +//line hypview/readers.qtpl:75 } -//line hypview/readers.qtpl:78 +//line hypview/readers.qtpl:75 qw422016.N().S(` `) -//line hypview/readers.qtpl:79 +//line hypview/readers.qtpl:76 } -//line hypview/readers.qtpl:79 +//line hypview/readers.qtpl:76 qw422016.N().S(`
`) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 } -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 func WriteMediaMenu(qq422016 qtio422016.Writer, rq *http.Request, h hyphae.Hypha, u *user.User) { -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 qw422016 := qt422016.AcquireWriter(qq422016) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 StreamMediaMenu(qw422016, rq, h, u) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 qt422016.ReleaseWriter(qw422016) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 } -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 func MediaMenu(rq *http.Request, h hyphae.Hypha, u *user.User) string { -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 qb422016 := qt422016.AcquireByteBuffer() -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 WriteMediaMenu(qb422016, rq, h, u) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 qs422016 := string(qb422016.B) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 qt422016.ReleaseByteBuffer(qb422016) -//line hypview/readers.qtpl:83 +//line hypview/readers.qtpl:80 return qs422016 +//line hypview/readers.qtpl:80 +} + //line hypview/readers.qtpl:83 -} - -// If `contents` == "", a helpful message is shown instead. -// -// If you rename .prevnext, change the docs too. - -//line hypview/readers.qtpl:88 -func StreamHypha(qw422016 *qt422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents string) { -//line hypview/readers.qtpl:88 - qw422016.N().S(` -`) -//line hypview/readers.qtpl:90 - subhyphae, prevHyphaName, nextHyphaName := tree.Tree(h.CanonicalName()) - lc := meta.Lc - -//line hypview/readers.qtpl:92 - qw422016.N().S(` -
-
- `) -//line hypview/readers.qtpl:95 - if meta.U.CanProceed("edit") { -//line hypview/readers.qtpl:95 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:99 - } -//line hypview/readers.qtpl:99 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:101 - if cfg.UseAuth && util.IsProfileName(h.CanonicalName()) && meta.U.Name == strings.TrimPrefix(h.CanonicalName(), cfg.UserHypha+"/") { -//line hypview/readers.qtpl:101 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:105 - if meta.U.Group == "admin" { -//line hypview/readers.qtpl:105 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:109 - } -//line hypview/readers.qtpl:109 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:110 - } -//line hypview/readers.qtpl:110 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:112 - qw422016.N().S(NaviTitle(meta, h.CanonicalName())) -//line hypview/readers.qtpl:112 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:113 - switch h.(type) { -//line hypview/readers.qtpl:114 - case *hyphae.EmptyHypha: -//line hypview/readers.qtpl:114 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:115 - qw422016.N().S(EmptyHypha(meta, h.CanonicalName())) -//line hypview/readers.qtpl:115 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:116 - default: -//line hypview/readers.qtpl:116 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:117 - qw422016.N().S(contents) -//line hypview/readers.qtpl:117 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:118 - } -//line hypview/readers.qtpl:118 - qw422016.N().S(` -
-
- `) -//line hypview/readers.qtpl:121 - if prevHyphaName != "" { -//line hypview/readers.qtpl:121 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:123 - } -//line hypview/readers.qtpl:123 - qw422016.N().S(` - `) -//line hypview/readers.qtpl:124 - if nextHyphaName != "" { -//line hypview/readers.qtpl:124 - qw422016.N().S(` - - `) -//line hypview/readers.qtpl:126 - } -//line hypview/readers.qtpl:126 - qw422016.N().S(` -
-`) -//line hypview/readers.qtpl:128 - if strings.TrimSpace(subhyphae) != "" { -//line hypview/readers.qtpl:128 - qw422016.N().S(` -
-

`) -//line hypview/readers.qtpl:130 - qw422016.E().S(lc.Get("ui.subhyphae")) -//line hypview/readers.qtpl:130 - qw422016.N().S(`

- -
-`) -//line hypview/readers.qtpl:137 - } -//line hypview/readers.qtpl:137 - qw422016.N().S(` -
- `) -//line hypview/readers.qtpl:139 - streamhyphaInfo(qw422016, meta, h) -//line hypview/readers.qtpl:139 - qw422016.N().S(` -
-
-`) -//line hypview/readers.qtpl:142 - qw422016.N().S(categories.CategoryCard(meta, h.CanonicalName())) -//line hypview/readers.qtpl:142 - qw422016.N().S(` -`) -//line hypview/readers.qtpl:143 - streamviewScripts(qw422016) -//line hypview/readers.qtpl:143 - qw422016.N().S(` -`) -//line hypview/readers.qtpl:144 -} - -//line hypview/readers.qtpl:144 -func WriteHypha(qq422016 qtio422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents string) { -//line hypview/readers.qtpl:144 - qw422016 := qt422016.AcquireWriter(qq422016) -//line hypview/readers.qtpl:144 - StreamHypha(qw422016, meta, h, contents) -//line hypview/readers.qtpl:144 - qt422016.ReleaseWriter(qw422016) -//line hypview/readers.qtpl:144 -} - -//line hypview/readers.qtpl:144 -func Hypha(meta viewutil.Meta, h hyphae.Hypha, contents string) string { -//line hypview/readers.qtpl:144 - qb422016 := qt422016.AcquireByteBuffer() -//line hypview/readers.qtpl:144 - WriteHypha(qb422016, meta, h, contents) -//line hypview/readers.qtpl:144 - qs422016 := string(qb422016.B) -//line hypview/readers.qtpl:144 - qt422016.ReleaseByteBuffer(qb422016) -//line hypview/readers.qtpl:144 - return qs422016 -//line hypview/readers.qtpl:144 -} - -//line hypview/readers.qtpl:146 func StreamRevision(qw422016 *qt422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) { -//line hypview/readers.qtpl:146 +//line hypview/readers.qtpl:83 qw422016.N().S(`

`) -//line hypview/readers.qtpl:149 +//line hypview/readers.qtpl:86 qw422016.E().S(meta.Lc.Get("ui.revision_warning")) -//line hypview/readers.qtpl:149 +//line hypview/readers.qtpl:86 qw422016.N().S(` `) -//line hypview/readers.qtpl:149 +//line hypview/readers.qtpl:86 qw422016.E().S(meta.Lc.Get("ui.revision_link")) -//line hypview/readers.qtpl:149 +//line hypview/readers.qtpl:86 qw422016.N().S(`

`) -//line hypview/readers.qtpl:150 +//line hypview/readers.qtpl:87 qw422016.N().S(NaviTitle(meta, h.CanonicalName())) -//line hypview/readers.qtpl:150 +//line hypview/readers.qtpl:87 qw422016.N().S(` `) -//line hypview/readers.qtpl:151 +//line hypview/readers.qtpl:88 qw422016.N().S(contents) -//line hypview/readers.qtpl:151 +//line hypview/readers.qtpl:88 qw422016.N().S(`
`) -//line hypview/readers.qtpl:154 - streamviewScripts(qw422016) -//line hypview/readers.qtpl:154 - qw422016.N().S(` -`) -//line hypview/readers.qtpl:155 -} - -//line hypview/readers.qtpl:155 -func WriteRevision(qq422016 qtio422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) { -//line hypview/readers.qtpl:155 - qw422016 := qt422016.AcquireWriter(qq422016) -//line hypview/readers.qtpl:155 - StreamRevision(qw422016, meta, h, contents, revHash) -//line hypview/readers.qtpl:155 - qt422016.ReleaseWriter(qw422016) -//line hypview/readers.qtpl:155 -} - -//line hypview/readers.qtpl:155 -func Revision(meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) string { -//line hypview/readers.qtpl:155 - qb422016 := qt422016.AcquireByteBuffer() -//line hypview/readers.qtpl:155 - WriteRevision(qb422016, meta, h, contents, revHash) -//line hypview/readers.qtpl:155 - qs422016 := string(qb422016.B) -//line hypview/readers.qtpl:155 - qt422016.ReleaseByteBuffer(qb422016) -//line hypview/readers.qtpl:155 - return qs422016 -//line hypview/readers.qtpl:155 -} - -//line hypview/readers.qtpl:157 -func streamviewScripts(qw422016 *qt422016.Writer) { -//line hypview/readers.qtpl:157 - qw422016.N().S(` -`) -//line hypview/readers.qtpl:158 +//line hypview/readers.qtpl:91 for _, scriptPath := range cfg.ViewScripts { -//line hypview/readers.qtpl:158 +//line hypview/readers.qtpl:91 qw422016.N().S(` `) -//line hypview/readers.qtpl:160 +//line hypview/readers.qtpl:93 } -//line hypview/readers.qtpl:160 +//line hypview/readers.qtpl:93 qw422016.N().S(` `) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 } -//line hypview/readers.qtpl:161 -func writeviewScripts(qq422016 qtio422016.Writer) { -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 +func WriteRevision(qq422016 qtio422016.Writer, meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) { +//line hypview/readers.qtpl:94 qw422016 := qt422016.AcquireWriter(qq422016) -//line hypview/readers.qtpl:161 - streamviewScripts(qw422016) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 + StreamRevision(qw422016, meta, h, contents, revHash) +//line hypview/readers.qtpl:94 qt422016.ReleaseWriter(qw422016) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 } -//line hypview/readers.qtpl:161 -func viewScripts() string { -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 +func Revision(meta viewutil.Meta, h hyphae.Hypha, contents, revHash string) string { +//line hypview/readers.qtpl:94 qb422016 := qt422016.AcquireByteBuffer() -//line hypview/readers.qtpl:161 - writeviewScripts(qb422016) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 + WriteRevision(qb422016, meta, h, contents, revHash) +//line hypview/readers.qtpl:94 qs422016 := string(qb422016.B) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 qt422016.ReleaseByteBuffer(qb422016) -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 return qs422016 -//line hypview/readers.qtpl:161 +//line hypview/readers.qtpl:94 } diff --git a/internal/shroom/upload.go b/internal/shroom/upload.go index 8750ca9..a63c1ec 100644 --- a/internal/shroom/upload.go +++ b/internal/shroom/upload.go @@ -4,18 +4,19 @@ import ( "bytes" "errors" "fmt" - "github.com/bouncepaw/mycorrhiza/backlinks" - "github.com/bouncepaw/mycorrhiza/files" - "github.com/bouncepaw/mycorrhiza/history" - "github.com/bouncepaw/mycorrhiza/hyphae" - "github.com/bouncepaw/mycorrhiza/mimetype" - "github.com/bouncepaw/mycorrhiza/user" "io" "log" "mime/multipart" "os" "path/filepath" "strings" + + "github.com/bouncepaw/mycorrhiza/history" + "github.com/bouncepaw/mycorrhiza/internal/backlinks" + "github.com/bouncepaw/mycorrhiza/internal/files" + "github.com/bouncepaw/mycorrhiza/internal/hyphae" + "github.com/bouncepaw/mycorrhiza/internal/mimetype" + "github.com/bouncepaw/mycorrhiza/internal/user" ) func historyMessageForTextUpload(h hyphae.Hypha, userMessage string) string { diff --git a/internal/tree/tree.go b/internal/tree/tree.go index 05d9ad8..6dc171e 100644 --- a/internal/tree/tree.go +++ b/internal/tree/tree.go @@ -117,7 +117,7 @@ func findOrCreateSubchild(name string, baseChild *child) *child { return &baseChild.children[len(baseChild.children)-1] } -func subhyphaeMatrix(children []child) (html string) { +func subhyphaeMatrix(children []child) template.HTML { sort.Slice(children, func(i, j int) bool { return children[i].name < children[j].name }) @@ -125,5 +125,5 @@ func subhyphaeMatrix(children []child) (html string) { for _, child := range children { childHTML(&child, &buf) } - return buf.String() + return template.HTML(buf.String()) } diff --git a/web/newtmpl/newtmpl.go b/web/newtmpl/newtmpl.go index aeff8e3..ec309c2 100644 --- a/web/newtmpl/newtmpl.go +++ b/web/newtmpl/newtmpl.go @@ -20,7 +20,7 @@ type Page struct { TemplateRussian *template.Template } -func NewPage(fs embed.FS, tmpl string, russianTranslation map[string]string) *Page { +func NewPage(fs embed.FS, russianTranslation map[string]string, tmpls ...string) *Page { must := template.Must en := must(must(must( base.Clone()). @@ -32,7 +32,7 @@ func NewPage(fs embed.FS, tmpl string, russianTranslation map[string]string) *Pa {{define "wiki name"}}%s{{end}} {{define "user hypha"}}%s{{end}} `, cfg.WikiName, cfg.UserHypha))). - ParseFS(fs, tmpl)) + ParseFS(fs, tmpls...)) if cfg.UseAuth { en = must(en.Parse(` diff --git a/web/pages.go b/web/pages.go index 57b1879..ffef453 100644 --- a/web/pages.go +++ b/web/pages.go @@ -21,23 +21,43 @@ func initPages() { editUserChain = viewutil.CopyEnRuWith(fs, "views/admin-edit-user.html", adminTranslationRu) deleteUserChain = viewutil.CopyEnRuWith(fs, "views/admin-delete-user.html", adminTranslationRu) - pageOrphans = newtmpl.NewPage(fs, "views/orphans.html", map[string]string{ + pageOrphans = newtmpl.NewPage(fs, map[string]string{ + "orphaned hyphae": "Гифы-сироты", + "orphan description": "Ниже перечислены гифы без ссылок на них.", + }, "views/orphans.html", map[string]string{ "orphaned hyphae": "Гифы-сироты", "orphan description": "Ниже перечислены гифы без ссылок на них.", }) - pageBacklinks = newtmpl.NewPage(fs, "views/backlinks.html", map[string]string{ + pageBacklinks = newtmpl.NewPage(fs, map[string]string{ + "backlinks to text": `Обратные ссылки на {{.}}`, + "backlinks to link": `Обратные ссылки на {{beautifulName .}}`, + "description": `Ниже перечислены гифы, на которых есть ссылка на эту гифу, трансклюзия этой гифы или эта гифа вставлена как изображение.`, + }, "views/backlinks.html", map[string]string{ "backlinks to text": `Обратные ссылки на {{.}}`, "backlinks to link": `Обратные ссылки на {{beautifulName .}}`, "description": `Ниже перечислены гифы, на которых есть ссылка на эту гифу, трансклюзия этой гифы или эта гифа вставлена как изображение.`, }) - pageUserList = newtmpl.NewPage(fs, "views/user-list.html", map[string]string{ + pageUserList = newtmpl.NewPage(fs, map[string]string{ + "title": "Список пользователей", + "administrators": "Администраторы", + "moderators": "Модераторы", + "editors": "Редакторы", + "readers": "Читатели", + }, "views/user-list.html", map[string]string{ "title": "Список пользователей", "administrators": "Администраторы", "moderators": "Модераторы", "editors": "Редакторы", "readers": "Читатели", }) - pageChangePassword = newtmpl.NewPage(fs, "views/change-password.html", map[string]string{ + pageChangePassword = newtmpl.NewPage(fs, map[string]string{ + "change password": "Сменить пароль", + "confirm password": "Повторите пароль", + "current password": "Текущий пароль", + "non local password change": "Пароль можно поменять только местным аккаунтам. Telegram-аккаунтам нельзя.", + "password": "Пароль", + "submit": "Поменять", + }, "views/change-password.html", map[string]string{ "change password": "Сменить пароль", "confirm password": "Повторите пароль", "current password": "Текущий пароль", @@ -45,13 +65,52 @@ func initPages() { "password": "Пароль", "submit": "Поменять", }) - pageHyphaDelete = newtmpl.NewPage(fs, "views/hypha-delete.html", map[string]string{ + pageHyphaDelete = newtmpl.NewPage(fs, map[string]string{ + "delete hypha?": "Удалить {{beautifulName .}}?", + "delete [[hypha]]?": "Удалить {{beautifulName .}}?", + "want to delete?": "Вы действительно хотите удалить эту гифу?", + "delete tip": "Нельзя отменить удаление гифы, но её история останется доступной.", + }, "views/hypha-delete.html", map[string]string{ "delete hypha?": "Удалить {{beautifulName .}}?", "delete [[hypha]]?": "Удалить {{beautifulName .}}?", "want to delete?": "Вы действительно хотите удалить эту гифу?", "delete tip": "Нельзя отменить удаление гифы, но её история останется доступной.", }) - pageHyphaEdit = newtmpl.NewPage(fs, "views/hypha-edit.html", map[string]string{ + pageHyphaEdit = newtmpl.NewPage(fs, map[string]string{ + "editing hypha": `Редактирование {{beautifulName .}}`, + "editing [[hypha]]": `Редактирование {{beautifulName .}}`, + "creating [[hypha]]": `Создание {{beautifulName .}}`, + "you're creating a new hypha": `Вы создаёте новую гифу.`, + "describe your changes": `Опишите ваши правки`, + "save": `Сохранить`, + "preview": `Предпросмотр`, + "previewing hypha": `Предпросмотр «{{beautifulName .}}»`, + "preview tip": `Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:`, + + "markup": `Разметка`, + "link": `Ссылка`, + "link title": `Текст`, + "heading": `Заголовок`, + "bold": `Жирный`, + "italic": `Курсив`, + "highlight": `Выделение`, + "underline": `Подчеркивание`, + "mono": `Моноширинный`, + "super": `Надстрочный`, + "sub": `Подстрочный`, + "strike": `Зачёркнутый`, + "rocket": `Ссылка-ракета`, + "transclude": `Трансклюзия`, + "hr": `Гориз. черта`, + "code": `Код-блок`, + "bullets": `Маркир. список`, + "numbers": `Нумер. список`, + "mycomarkup help": `Подробнее о Микоразметке`, + "actions": `Действия`, + "current date": `Текущая дата`, + "current time": `Текущее время`, + "selflink": `Ссылка на вас`, + }, "views/hypha-edit.html", map[string]string{ "editing hypha": `Редактирование {{beautifulName .}}`, "editing [[hypha]]": `Редактирование {{beautifulName .}}`, "creating [[hypha]]": `Создание {{beautifulName .}}`, @@ -86,7 +145,19 @@ func initPages() { "current time": `Текущее время`, "selflink": `Ссылка на вас`, }) - pageHyphaEmpty = newtmpl.NewPage(fs, "views/hypha-empty.html", map[string]string{ + pageHyphaEmpty = newtmpl.NewPage(fs, map[string]string{ + "empty heading": `Эта гифа не существует`, + "empty no rights": `У вас нет прав для создания новых гиф. Вы можете:`, + "empty log in": `Войти в свою учётную запись, если она у вас есть`, + "empty register": `Создать новую учётную запись`, + "write a text": `Написать текст`, + "write a text tip": `Напишите заметку, дневник, статью, рассказ или иной текст с помощью Микоразметки. Сохраняется полная история правок документа.`, + "write a text writing conventions": `Не забывайте следовать правилам оформления этой вики, если они имеются.`, + "write a text btn": `Создать`, + "upload a media": `Загрузить медиа`, + "upload a media tip": `Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные можно только скачать и просмотреть локально. Позже вы можете дописать пояснение к этому медиа.`, + "upload a media btn": `Загрузить`, + }, "views/hypha-empty.html", map[string]string{ "empty heading": `Эта гифа не существует`, "empty no rights": `У вас нет прав для создания новых гиф. Вы можете:`, "empty log in": `Войти в свою учётную запись, если она у вас есть`, @@ -99,5 +170,5 @@ func initPages() { "upload a media tip": `Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные можно только скачать и просмотреть локально. Позже вы можете дописать пояснение к этому медиа.`, "upload a media btn": `Загрузить`, }) - pageHypha = newtmpl.NewPage(fs, "views/hypha.html", map[string]string{}) + pageHypha = newtmpl.NewPage(fs, map[string]string{}, "views/hypha.html", map[string]string{}) }