diff --git a/backlinks/web.go b/backlinks/web.go index f998e00..6534e4c 100644 --- a/backlinks/web.go +++ b/backlinks/web.go @@ -2,12 +2,10 @@ package backlinks import ( "embed" - "github.com/bouncepaw/mycorrhiza/cfg" "github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/util" "github.com/bouncepaw/mycorrhiza/viewutil" "github.com/gorilla/mux" - "log" "net/http" "sort" "text/template" @@ -62,41 +60,31 @@ var ( ) type backlinksData struct { - viewutil.BaseData + *viewutil.BaseData HyphaName string Backlinks []string } func viewBacklinks(meta viewutil.Meta, hyphaName string, backlinks []string) { - if err := chainBacklinks.Get(meta).ExecuteTemplate(meta.W, "page", backlinksData{ - BaseData: viewutil.BaseData{ - Meta: meta, - Addr: "/backlinks/" + hyphaName, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, + viewutil.ExecutePage(meta, chainBacklinks, backlinksData{ + BaseData: &viewutil.BaseData{ + Addr: "/backlinks/" + hyphaName, }, HyphaName: hyphaName, Backlinks: backlinks, - }); err != nil { - log.Println(err) - } + }) } type orphansData struct { - viewutil.BaseData + *viewutil.BaseData Orphans []string } func viewOrphans(meta viewutil.Meta, orphans []string) { - if err := chainOrphans.Get(meta).ExecuteTemplate(meta.W, "page", orphansData{ - BaseData: viewutil.BaseData{ - Meta: meta, - Addr: "/orphans", - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, + viewutil.ExecutePage(meta, chainOrphans, orphansData{ + BaseData: &viewutil.BaseData{ + Addr: "/orphans", }, Orphans: orphans, - }); err != nil { - log.Println(err) - } + }) } diff --git a/categories/views.go b/categories/views.go index 53c7e16..b5b0031 100644 --- a/categories/views.go +++ b/categories/views.go @@ -2,7 +2,6 @@ package categories import ( "embed" - "github.com/bouncepaw/mycorrhiza/cfg" "github.com/bouncepaw/mycorrhiza/viewutil" "log" "strings" @@ -64,42 +63,33 @@ func CategoryCard(meta viewutil.Meta, hyphaName string) string { } type pageData struct { - viewutil.BaseData + *viewutil.BaseData CatName string Hyphae []string GivenPermissionToModify bool } func categoryPage(meta viewutil.Meta, catName string) { - if err := viewPageChain.Get(meta).ExecuteTemplate(meta.W, "page", pageData{ - BaseData: viewutil.BaseData{ - Meta: meta, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - Addr: "/category/" + catName, + viewutil.ExecutePage(meta, viewPageChain, pageData{ + BaseData: &viewutil.BaseData{ + Addr: "/category/" + catName, }, CatName: catName, Hyphae: hyphaeInCategory(catName), GivenPermissionToModify: meta.U.CanProceed("add-to-category"), - }); err != nil { - log.Println(err) - } + }) } type listData struct { - viewutil.BaseData + *viewutil.BaseData Categories []string } func categoryList(meta viewutil.Meta) { - if err := viewListChain.Get(meta).ExecuteTemplate(meta.W, "page", listData{ - BaseData: viewutil.BaseData{ - Meta: meta, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, + viewutil.ExecutePage(meta, viewListChain, listData{ + BaseData: &viewutil.BaseData{ + Addr: "/category", }, Categories: listOfCategories(), - }); err != nil { - log.Println(err) - } + }) } diff --git a/help/web.go b/help/web.go index af697cd..5c9fc07 100644 --- a/help/web.go +++ b/help/web.go @@ -3,11 +3,9 @@ package help // stuff.go is used for meta stuff about the wiki or all hyphae at once. import ( "github.com/bouncepaw/mycomarkup/v4" - "github.com/bouncepaw/mycorrhiza/cfg" "github.com/bouncepaw/mycorrhiza/shroom" "github.com/bouncepaw/mycorrhiza/viewutil" "io" - "log" "net/http" "strings" "text/template" @@ -92,22 +90,17 @@ func handlerHelp(w http.ResponseWriter, rq *http.Request) { } type helpData struct { - viewutil.BaseData + *viewutil.BaseData ContentsHTML string Lang string } func viewHelp(meta viewutil.Meta, lang, contentsHTML, articlePath string) { - if err := chain.Get(meta).ExecuteTemplate(meta.W, "page", helpData{ - BaseData: viewutil.BaseData{ - Meta: meta, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - Addr: "/help/" + articlePath, + viewutil.ExecutePage(meta, chain, helpData{ + BaseData: &viewutil.BaseData{ + Addr: "/help/" + articlePath, }, ContentsHTML: contentsHTML, Lang: lang, - }); err != nil { - log.Println(err) - } + }) } diff --git a/history/histview/histview.go b/history/histview/histview.go index 44df89b..445022f 100644 --- a/history/histview/histview.go +++ b/history/histview/histview.go @@ -10,7 +10,6 @@ import ( "github.com/bouncepaw/mycorrhiza/util" "github.com/bouncepaw/mycorrhiza/viewutil" "github.com/gorilla/mux" - "log" "net/http" "strconv" "strings" @@ -79,12 +78,13 @@ var ( {{define "diff for at heading"}}Разница для {{beautifulName .HyphaName}} для {{.Hash}}{{end}} ` + // TODO: translate recent changes chainPrimitiveDiff viewutil.Chain chainRecentChanges viewutil.Chain ) type recentChangesData struct { - viewutil.BaseData + *viewutil.BaseData EditCount int Changes []history.Revision UserHypha string @@ -92,41 +92,27 @@ type recentChangesData struct { } func recentChanges(meta viewutil.Meta, editCount int, changes []history.Revision) { - if err := chainRecentChanges.Get(meta).ExecuteTemplate(meta.W, "page", recentChangesData{ - BaseData: viewutil.BaseData{ - Meta: meta, - Addr: "/recent-changes/" + strconv.Itoa(editCount), - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - }, + viewutil.ExecutePage(meta, chainRecentChanges, recentChangesData{ + BaseData: &viewutil.BaseData{}, EditCount: editCount, Changes: changes, UserHypha: cfg.UserHypha, Stops: []int{20, 50, 100}, - }); err != nil { - log.Println(err) - } + }) } type primitiveDiffData struct { - viewutil.BaseData + *viewutil.BaseData HyphaName string Hash string Text string } func primitiveDiff(meta viewutil.Meta, h hyphae.ExistingHypha, hash, text string) { - if err := chainPrimitiveDiff.Get(meta).ExecuteTemplate(meta.W, "page", primitiveDiffData{ - BaseData: viewutil.BaseData{ - Meta: meta, - Addr: "/primitive-diff/" + hash + "/" + h.CanonicalName(), - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - }, + viewutil.ExecutePage(meta, chainPrimitiveDiff, primitiveDiffData{ + BaseData: &viewutil.BaseData{}, HyphaName: h.CanonicalName(), Hash: hash, Text: text, - }); err != nil { - log.Println(err) - } + }) } diff --git a/misc/handlers.go b/misc/handlers.go index f15a129..045770d 100644 --- a/misc/handlers.go +++ b/misc/handlers.go @@ -19,6 +19,7 @@ import ( "math/rand" "mime" "net/http" + "path/filepath" ) func InitHandlers(rtr *mux.Router) { @@ -41,7 +42,25 @@ func InitHandlers(rtr *mux.Router) { // handlerList shows a list of all hyphae in the wiki in random order. func handlerList(w http.ResponseWriter, rq *http.Request) { util.PrepareRq(rq) - viewList(viewutil.MetaFrom(w, rq)) + // TODO: make this more effective, there are too many loops and vars + var ( + hyphaNames = make(chan string) + sortedHypha = hyphae.PathographicSort(hyphaNames) + entries []listDatum + ) + for hypha := range hyphae.YieldExistingHyphae() { + hyphaNames <- hypha.CanonicalName() + } + close(hyphaNames) + for hyphaName := range sortedHypha { + switch h := hyphae.ByName(hyphaName).(type) { + case *hyphae.TextualHypha: + entries = append(entries, listDatum{h.CanonicalName(), ""}) + case *hyphae.MediaHypha: + entries = append(entries, listDatum{h.CanonicalName(), filepath.Ext(h.MediaFilePath())[1:]}) + } + } + viewList(viewutil.MetaFrom(w, rq), entries) } // handlerReindex reindexes all hyphae by checking the wiki storage directory anew. diff --git a/misc/views.go b/misc/views.go index d14b380..dfad56b 100644 --- a/misc/views.go +++ b/misc/views.go @@ -2,11 +2,7 @@ package misc import ( "embed" - "github.com/bouncepaw/mycorrhiza/cfg" - "github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/viewutil" - "log" - "path/filepath" "text/template" ) @@ -39,58 +35,27 @@ type listDatum struct { } type listData struct { - viewutil.BaseData + *viewutil.BaseData Entries []listDatum } -func viewList(meta viewutil.Meta) { - // TODO: make this more effective, there are too many loops and vars - var ( - hyphaNames = make(chan string) - sortedHypha = hyphae.PathographicSort(hyphaNames) - data []listDatum - ) - for hypha := range hyphae.YieldExistingHyphae() { - hyphaNames <- hypha.CanonicalName() - } - close(hyphaNames) - for hyphaName := range sortedHypha { - switch h := hyphae.ByName(hyphaName).(type) { - case *hyphae.TextualHypha: - data = append(data, listDatum{h.CanonicalName(), ""}) - case *hyphae.MediaHypha: - data = append(data, listDatum{h.CanonicalName(), filepath.Ext(h.MediaFilePath())[1:]}) - } - } - - if err := chainList.Get(meta).ExecuteTemplate(meta.W, "page", listData{ - BaseData: viewutil.BaseData{ - Meta: meta, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - }, - Entries: data, - }); err != nil { - log.Println(err) - } +func viewList(meta viewutil.Meta, entries []listDatum) { + viewutil.ExecutePage(meta, chainList, listData{ + BaseData: &viewutil.BaseData{}, + Entries: entries, + }) } type titleSearchData struct { - viewutil.BaseData + *viewutil.BaseData Query string Results []string } func viewTitleSearch(meta viewutil.Meta, query string, results []string) { - if err := chainTitleSearch.Get(meta).ExecuteTemplate(meta.W, "page", titleSearchData{ - BaseData: viewutil.BaseData{ - Meta: meta, - HeaderLinks: cfg.HeaderLinks, - CommonScripts: cfg.CommonScripts, - }, - Query: query, - Results: results, - }); err != nil { - log.Println(err) - } + viewutil.ExecutePage(meta, chainTitleSearch, titleSearchData{ + BaseData: &viewutil.BaseData{}, + Query: query, + Results: results, + }) } diff --git a/viewutil/viewutil.go b/viewutil/viewutil.go index f0b2aac..c8b8e32 100644 --- a/viewutil/viewutil.go +++ b/viewutil/viewutil.go @@ -96,6 +96,12 @@ type BaseData struct { Body string // TODO: remove } +func (bd *BaseData) withBaseValues(meta Meta, headerLinks []cfg.HeaderLink, commonScripts []string) { + bd.Meta = meta + bd.HeaderLinks = headerLinks + bd.CommonScripts = commonScripts +} + // Base is a temporary wrapper around BaseEn and BaseRu, meant to facilitate the migration from qtpl. func Base(meta Meta, title, body string, headElements ...string) string { var w strings.Builder @@ -122,3 +128,13 @@ func CopyEnWith(fsys fs.FS, f string) *template.Template { func CopyRuWith(fsys fs.FS, f string) *template.Template { return m(m(BaseRu.Clone()).ParseFS(fsys, f)) } + +// ExecutePage executes template page in the given chain with the given data that has BaseData nested. It also sets some common BaseData fields +func ExecutePage(meta Meta, chain Chain, data interface { + withBaseValues(meta Meta, headerLinks []cfg.HeaderLink, commonScripts []string) +}) { + data.withBaseValues(meta, cfg.HeaderLinks, cfg.CommonScripts) + if err := chain.Get(meta).ExecuteTemplate(meta.W, "page", data); err != nil { + log.Println(err) + } +}