1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-04 18:19:54 +00:00

Categories: Refactor a little

* Introduce views.Meta for passing common stuff around.
* Store both category-related templates in one HTML file, which is go:embed:ded.
* Fix a bug.
This commit is contained in:
Timur Ismagilov 2022-03-20 12:04:08 +03:00
parent d2a4285e7f
commit ea0c2f35d1
6 changed files with 102 additions and 78 deletions

View File

@ -20,7 +20,11 @@ import "sync"
func WithHypha(hyphaName string) (categoryList []string) {
mutex.RLock()
defer mutex.RUnlock()
return hyphaToCategories[hyphaName].categoryList
if node, ok := hyphaToCategories[hyphaName]; ok {
return node.categoryList
} else {
return nil
}
}
// Contents returns what hyphae are in the category. If the returned slice is empty, the category does not exist, and vice versa. The category name must be canonical.

View File

@ -42,12 +42,6 @@ func InitCategories() {
}
log.Println("Found", len(categoryToHyphae), "categories")
for cat, catNode := range categoryToHyphae { // TODO: remove when not needed
log.Println(cat, "->", catNode.hyphaList)
}
for hyp, hypNode := range hyphaToCategories {
log.Println(hyp, "<-", hypNode.categoryList)
}
}
type categoryNode struct {

25
views/base.go Normal file
View File

@ -0,0 +1,25 @@
package views
import (
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user"
"io"
"net/http"
)
// Meta is a bundle of common stuffs used by views, templates.
type Meta struct {
Lc *l18n.Localizer
U *user.User
W io.Writer
PageTitle string
}
// MetaFrom makes a Meta from the given data. You are meant to further modify it.
func MetaFrom(w http.ResponseWriter, rq *http.Request) Meta {
return Meta{
Lc: l18n.FromRequest(rq),
U: user.FromRequest(rq),
W: w,
}
}

View File

@ -1,88 +1,35 @@
package views
import (
"embed"
"github.com/bouncepaw/mycorrhiza/hyphae/categories"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user"
"github.com/bouncepaw/mycorrhiza/util"
"html/template"
"io"
"log"
"net/http"
"strings"
)
const categoriesCardTmpl = `{{$hyphaName := .HyphaName
}}<aside class="layout-card categories-card">
<h2 class="layout-card__title">Categories</h2>
<ul class="categories-card__entries">
{{range .Categories}}
<li class="categories-card__entry">
<a class="categories-card__link" href="/category/{{.}}">{{beautifulName .}}</a>
<form method="POST" action="/remove-from-category" class="categories-card__remove-form">
<input type="hidden" name="cat" value="{{.}}">
<input type="hidden" name="hypha" value="{{$hyphaName}}">
<input type="submit" value="X">
</form>
</li>
{{end}}
<li class="categories-card__entry categories-card__add-to-cat">
<form method="POST" action="/add-to-category" class="categories-card__add-form">
<input type="text" name="cat" id="_cat-name">
<input type="hidden" name="hypha" value="{{$hyphaName}}">
<input type="submit" value="Add to category">
</form>
</li>
</ul>
</aside>`
const categoryPageTmpl = `{{$catName := .CatName
}}<main class="main-width category">
<h1>Category <i>{{$catName}}</i></h1>
{{if len .Hyphae}}
<p>This page lists all hyphae in the category.</p>
{{else}}
<p>This category has no hyphae.</p>
{{end}}
<ul class="category__entries">
{{range .Hyphae}}
<li class="category__entry">
<a class="wikilink" href="/hypha/{{.}}">{{beautifulName .}}</a>
</li>
{{end}}
<li class="category__entry category__add-to-cat">
<form method="POST" action="/add-to-category" class="category__add-form">
<input type="text" name="hypha" id="_hypha-name" placeholder="Hypha name">
<input type="hidden" name="cat" value="{{$catName}}">
<input type="submit" value="Add hypha to category">
</form>
</li>
</ul>
</main>`
//go:embed categories.html
var fs embed.FS
var (
categoriesCardT *template.Template
categoryPageT *template.Template
categoryT *template.Template
)
func init() {
categoriesCardT = template.Must(template.
New("category card").
Funcs(template.FuncMap{
"beautifulName": util.BeautifulName,
}).
Parse(categoriesCardTmpl))
categoryPageT = template.Must(template.
New("category page").
Funcs(template.FuncMap{
"beautifulName": util.BeautifulName,
}).
Parse(categoryPageTmpl))
categoryT = template.Must(template.
New("category").
Funcs(
template.FuncMap{
"beautifulName": util.BeautifulName,
}).
ParseFS(fs, "*"))
}
func categoryCardHTML(hyphaName string) string {
var buf strings.Builder
err := categoriesCardT.Execute(&buf, struct {
err := categoryT.ExecuteTemplate(&buf, "category card", struct {
HyphaName string
Categories []string
}{
@ -95,9 +42,9 @@ func categoryCardHTML(hyphaName string) string {
return buf.String()
}
func CategoryPageHTML(w io.Writer, rq *http.Request, catName string) {
func CategoryPageHTML(meta Meta, catName string) {
var buf strings.Builder
err := categoryPageT.Execute(&buf, struct {
err := categoryT.ExecuteTemplate(&buf, "category page", struct {
CatName string
Hyphae []string
}{
@ -107,10 +54,13 @@ func CategoryPageHTML(w io.Writer, rq *http.Request, catName string) {
if err != nil {
log.Println(err)
}
io.WriteString(w, BaseHTML(
_, err = io.WriteString(meta.W, BaseHTML(
"Category "+util.BeautifulName(catName),
buf.String(),
l18n.FromRequest(rq),
user.FromRequest(rq),
meta.Lc,
meta.U,
))
if err != nil {
log.Println(err)
}
}

51
views/categories.html Normal file
View File

@ -0,0 +1,51 @@
{{define "category card"}}
{{$hyphaName := .HyphaName}}
<aside class="layout-card categories-card">
<h2 class="layout-card__title">Categories</h2>
<ul class="categories-card__entries">
{{range .Categories}}
<li class="categories-card__entry">
<a class="categories-card__link" href="/category/{{.}}">{{beautifulName .}}</a>
<form method="POST" action="/remove-from-category" class="categories-card__remove-form">
<input type="hidden" name="cat" value="{{.}}">
<input type="hidden" name="hypha" value="{{$hyphaName}}">
<input type="submit" value="X">
</form>
</li>
{{end}}
<li class="categories-card__entry categories-card__add-to-cat">
<form method="POST" action="/add-to-category" class="categories-card__add-form">
<input type="text" name="cat" id="_cat-name">
<input type="hidden" name="hypha" value="{{$hyphaName}}">
<input type="submit" value="Add to category">
</form>
</li>
</ul>
</aside>
{{end}}
{{define "category page"}}
{{$catName := .CatName}}
<main class="main-width category">
<h1>Category <i>{{$catName}}</i></h1>
{{if len .Hyphae}}
<p>This page lists all hyphae in the category.</p>
{{else}}
<p>This category has no hyphae.</p>
{{end}}
<ul class="category__entries">
{{range .Hyphae}}
<li class="category__entry">
<a class="wikilink" href="/hypha/{{.}}">{{beautifulName .}}</a>
</li>
{{end}}
<li class="category__entry category__add-to-cat">
<form method="POST" action="/add-to-category" class="category__add-form">
<input type="text" name="hypha" id="_hypha-name" placeholder="Hypha name">
<input type="hidden" name="cat" value="{{$catName}}">
<input type="submit" value="Add hypha to category">
</form>
</li>
</ul>
</main>
{{end}}

View File

@ -18,7 +18,7 @@ func handlerCategory(w http.ResponseWriter, rq *http.Request) {
var (
catName = util.HyphaNameFromRq(rq, "category")
)
views.CategoryPageHTML(w, rq, catName)
views.CategoryPageHTML(views.MetaFrom(w, rq), catName)
}
func handlerRemoveFromCategory(w http.ResponseWriter, rq *http.Request) {