1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-13 05:50:27 +00:00
mycorrhiza/help/web.go
2022-04-09 14:55:55 +03:00

112 lines
3.7 KiB
Go

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"
"github.com/gorilla/mux"
"github.com/bouncepaw/mycomarkup/v4/mycocontext"
)
var (
chain viewutil.Chain
ruTranslation = `
{{define "title"}}Справка{{end}}
{{define "entry not found"}}Статья не найдена{{end}}
{{define "entry not found invitation"}}Если вы хотите написать эту статью сами, то будем рады вашим правкам <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">в репозитории Миокризы</a>.{{end}}
{{define "topics"}}Темы справки{{end}}
{{define "main"}}Введение{{end}}
{{define "hypha"}}Гифа{{end}}
{{define "media"}}Медиа{{end}}
{{define "mycomarkup"}}Микоразметка{{end}}
{{define "category"}}Категории{{end}}
{{define "interface"}}Интерфейс{{end}}
{{define "prevnext"}}Пред/след{{end}}
{{define "top_bar"}}Верхняя панель{{end}}
{{define "sibling_hyphae"}}Гифы-сиблинги{{end}}
{{define "special pages"}}Специальные страницы{{end}}
{{define "recent_changes"}}Недавние изменения{{end}}
{{define "feeds"}}Ленты{{end}}
{{define "configuration"}}Конфигурация (для администраторов){{end}}
{{define "config_file"}}Файл конфигурации{{end}}
{{define "lock"}}Замок{{end}}
{{define "whitelist"}}Белый список{{end}}
{{define "telegram"}}Вход через Телеграм{{end}}
`
)
func InitHandlers(r *mux.Router) {
r.PathPrefix("/help").HandlerFunc(handlerHelp)
chain = viewutil.
En(viewutil.CopyEnWith(fs, "view_help.html")).
Ru(template.Must(viewutil.CopyRuWith(fs, "view_help.html").Parse(ruTranslation)))
}
// handlerHelp gets the appropriate documentation or tells you where you (personally) have failed.
func handlerHelp(w http.ResponseWriter, rq *http.Request) {
// See the history of this file to resurrect the old algorithm that supported multiple languages
var (
meta = viewutil.MetaFrom(w, rq)
articlePath = strings.TrimPrefix(strings.TrimPrefix(rq.URL.Path, "/help/"), "/help")
lang = "en"
)
if articlePath == "" {
articlePath = "en"
}
if !strings.HasPrefix(articlePath, "en") {
w.WriteHeader(http.StatusNotFound)
_, _ = io.WriteString(w, "404 Not found")
return
}
content, err := Get(articlePath)
if err != nil && strings.HasPrefix(err.Error(), "open") {
w.WriteHeader(http.StatusNotFound)
viewHelp(meta, lang, "")
return
}
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
viewHelp(meta, lang, err.Error())
return
}
// TODO: change for the function that uses byte array when there is such function in mycomarkup.
ctx, _ := mycocontext.ContextFromStringInput(string(content), shroom.MarkupOptions(articlePath))
ast := mycomarkup.BlockTree(ctx)
result := mycomarkup.BlocksToHTML(ctx, ast)
w.WriteHeader(http.StatusOK)
viewHelp(meta, lang, result)
}
type helpData struct {
viewutil.BaseData
ContentsHTML string
Lang string
}
func viewHelp(meta viewutil.Meta, lang, contentsHTML string) {
if err := chain.Get(meta).ExecuteTemplate(meta.W, "page", helpData{
BaseData: viewutil.BaseData{
Meta: meta,
HeaderLinks: cfg.HeaderLinks,
CommonScripts: cfg.CommonScripts,
},
ContentsHTML: contentsHTML,
Lang: lang,
}); err != nil {
log.Println(err)
}
}