1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-12 05:20:26 +00:00
mycorrhiza/web/stuff.go

167 lines
5.1 KiB
Go
Raw Normal View History

package web
2021-05-09 09:18:21 +00:00
2021-05-11 08:33:00 +00:00
// stuff.go is used for meta stuff about the wiki or all hyphae at once.
2021-05-09 09:18:21 +00:00
import (
"github.com/bouncepaw/mycorrhiza/hyphae/backlinks"
2021-05-09 09:18:21 +00:00
"io"
"log"
"math/rand"
"net/http"
"strings"
2021-05-09 09:18:21 +00:00
"github.com/gorilla/mux"
2021-06-19 04:51:10 +00:00
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/files"
"github.com/bouncepaw/mycorrhiza/help"
2021-05-09 09:18:21 +00:00
"github.com/bouncepaw/mycorrhiza/hyphae"
2021-09-06 17:46:34 +00:00
"github.com/bouncepaw/mycorrhiza/l18n"
2021-05-09 09:18:21 +00:00
"github.com/bouncepaw/mycorrhiza/shroom"
"github.com/bouncepaw/mycorrhiza/user"
"github.com/bouncepaw/mycorrhiza/util"
"github.com/bouncepaw/mycorrhiza/views"
"github.com/bouncepaw/mycomarkup/v3"
"github.com/bouncepaw/mycomarkup/v3/mycocontext"
2021-05-09 09:18:21 +00:00
)
func initStuff(r *mux.Router) {
r.PathPrefix("/help").HandlerFunc(handlerHelp)
r.HandleFunc("/list", handlerList)
r.HandleFunc("/reindex", handlerReindex)
r.HandleFunc("/update-header-links", handlerUpdateHeaderLinks)
r.HandleFunc("/random", handlerRandom)
r.HandleFunc("/about", handlerAbout)
r.HandleFunc("/favicon.ico", func(w http.ResponseWriter, rq *http.Request) {
http.Redirect(w, rq, "/static/favicon.ico", http.StatusSeeOther)
})
2021-05-09 09:18:21 +00:00
}
// handlerHelp gets the appropriate documentation or tells you where you (personally) have failed.
func handlerHelp(w http.ResponseWriter, rq *http.Request) {
2021-09-06 17:46:34 +00:00
lc := l18n.FromRequest(rq)
articlePath := strings.TrimPrefix(strings.TrimPrefix(rq.URL.Path, "/help/"), "/help")
lang := "en" // replace with lc.Locale once Russian docs are back
if articlePath == "" {
articlePath = "en" // replace with lc.Locale once Russian docs are back
2021-09-06 17:46:34 +00:00
} else {
var slashIndex = strings.Index(articlePath, "/")
if slashIndex == -1 {
lang = articlePath
} else {
lang = articlePath[:slashIndex]
}
}
content, err := help.Get(articlePath)
if err != nil && strings.HasPrefix(err.Error(), "open") {
w.WriteHeader(http.StatusNotFound)
_, _ = io.WriteString(
w,
2021-09-06 17:46:34 +00:00
views.BaseHTML(lc.Get("help.entry_not_found"),
views.HelpHTML(views.HelpEmptyErrorHTML(lc), lang, lc),
lc,
user.FromRequest(rq)),
)
return
}
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
_, _ = io.WriteString(
w,
views.BaseHTML(err.Error(),
2021-09-06 17:46:34 +00:00
views.HelpHTML(err.Error(), lang, lc),
lc,
user.FromRequest(rq)),
)
return
}
// TODO: change for the function that uses byte array when there is such function in mycomarkup.
ctx, _ := mycocontext.ContextFromStringInput(articlePath, string(content))
ast := mycomarkup.BlockTree(ctx)
result := mycomarkup.BlocksToHTML(ctx, ast)
w.WriteHeader(http.StatusOK)
_, _ = io.WriteString(
w,
2021-09-06 17:46:34 +00:00
views.BaseHTML(lc.Get("help.title"),
views.HelpHTML(result, lang, lc),
lc,
user.FromRequest(rq)),
)
}
2021-05-09 09:18:21 +00:00
// handlerList shows a list of all hyphae in the wiki in random order.
func handlerList(w http.ResponseWriter, rq *http.Request) {
u := user.FromRequest(rq)
2021-09-06 17:46:34 +00:00
var lc = l18n.FromRequest(rq)
util.PrepareRq(rq)
2021-09-06 17:46:34 +00:00
util.HTTP200Page(w, views.BaseHTML(lc.Get("ui.list_title"), views.HyphaListHTML(lc), lc, u))
2021-05-09 09:18:21 +00:00
}
// handlerReindex reindexes all hyphae by checking the wiki storage directory anew.
func handlerReindex(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
2021-05-09 09:18:21 +00:00
if ok := user.CanProceed(rq, "reindex"); !ok {
2021-09-06 17:46:34 +00:00
var lc = l18n.FromRequest(rq)
httpErr(w, lc, http.StatusForbidden, cfg.HomeHypha, lc.Get("ui.no_rights"), lc.Get("ui.reindex_no_rights"))
2021-05-09 09:18:21 +00:00
log.Println("Rejected", rq.URL)
return
}
hyphae.ResetCount()
2021-06-19 04:51:10 +00:00
log.Println("Reindexing hyphae in", files.HyphaeDir())
hyphae.Index(files.HyphaeDir())
backlinks.IndexBacklinks()
2021-05-09 09:18:21 +00:00
http.Redirect(w, rq, "/", http.StatusSeeOther)
}
// handlerUpdateHeaderLinks updates header links by reading the configured hypha, if there is any, or resorting to default values.
//
// See https://mycorrhiza.wiki/hypha/configuration/header
2021-05-09 09:18:21 +00:00
func handlerUpdateHeaderLinks(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
2021-05-09 09:18:21 +00:00
if ok := user.CanProceed(rq, "update-header-links"); !ok {
2021-09-06 17:46:34 +00:00
var lc = l18n.FromRequest(rq)
httpErr(w, lc, http.StatusForbidden, cfg.HomeHypha, lc.Get("ui.no_rights"), lc.Get("ui.header_no_rights"))
2021-05-09 09:18:21 +00:00
log.Println("Rejected", rq.URL)
return
}
shroom.SetHeaderLinks()
http.Redirect(w, rq, "/", http.StatusSeeOther)
}
// handlerRandom redirects to a random hypha.
func handlerRandom(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
2021-05-09 09:18:21 +00:00
var (
randomHyphaName string
amountOfHyphae = hyphae.Count()
)
if amountOfHyphae == 0 {
2021-09-06 17:46:34 +00:00
var lc = l18n.FromRequest(rq)
httpErr(w, lc, http.StatusNotFound, cfg.HomeHypha, lc.Get("ui.random_no_hyphae"), lc.Get("ui.random_no_hyphae_tip"))
2021-05-09 09:18:21 +00:00
return
}
i := rand.Intn(amountOfHyphae)
for h := range hyphae.YieldExistingHyphae() {
if i == 0 {
randomHyphaName = h.Name
}
i--
}
http.Redirect(w, rq, "/hypha/"+randomHyphaName, http.StatusSeeOther)
}
// handlerAbout shows a summary of wiki's software.
func handlerAbout(w http.ResponseWriter, rq *http.Request) {
w.Header().Set("Content-Type", "text/html;charset=utf-8")
w.WriteHeader(http.StatusOK)
2021-09-06 17:46:34 +00:00
var (
2021-09-29 14:56:17 +00:00
lc = l18n.FromRequest(rq)
2021-09-06 17:46:34 +00:00
title = lc.Get("ui.about_title", &l18n.Replacements{"name": cfg.WikiName})
)
_, err := io.WriteString(w, views.BaseHTML(title, views.AboutHTML(lc), lc, user.FromRequest(rq)))
2021-05-09 09:18:21 +00:00
if err != nil {
log.Println(err)
}
}