mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2024-12-12 05:20:26 +00:00
c2619a6b82
Implements #198
93 lines
2.9 KiB
Go
93 lines
2.9 KiB
Go
package interwiki
|
||
|
||
import (
|
||
"embed"
|
||
"github.com/bouncepaw/mycorrhiza/viewutil"
|
||
"github.com/gorilla/mux"
|
||
"net/http"
|
||
"strings"
|
||
)
|
||
|
||
var (
|
||
//go:embed *html
|
||
fs embed.FS
|
||
ruTranslation = `
|
||
{{define "interwiki map"}}Интеркарта{{end}}
|
||
{{define "name"}}Название:{{end}}
|
||
{{define "aliases"}}Псевдонимы:{{end}}
|
||
{{define "aliases (,)"}}Псевдонимы (разделённые запятыми):{{end}}
|
||
{{define "engine"}}Движок:{{end}}
|
||
{{define "engine/mycorrhiza"}}Микориза{{end}}
|
||
{{define "engine/betula"}}Бетула{{end}}
|
||
{{define "engine/agora"}}Агора{{end}}
|
||
{{define "engine/generic"}}Любой сайт{{end}}
|
||
{{define "link href format"}}Строка форматирования атрибута href ссылки:{{end}}
|
||
{{define "img src format"}}Строка форматирования атрибута src изображения:{{end}}
|
||
{{define "unset map"}}Интеркарта не задана.{{end}}
|
||
{{define "documentation."}}Документация.{{end}}
|
||
{{define "edit separately."}}Изменяйте записи по отдельности.{{end}}
|
||
{{define "add interwiki entry"}}Добавить запись в интеркарту{{end}}
|
||
`
|
||
chainInterwiki viewutil.Chain
|
||
chainNameTaken viewutil.Chain
|
||
)
|
||
|
||
func InitHandlers(rtr *mux.Router) {
|
||
chainInterwiki = viewutil.CopyEnRuWith(fs, "view_interwiki.html", ruTranslation)
|
||
chainNameTaken = viewutil.CopyEnRuWith(fs, "view_name_taken.html", ruTranslation)
|
||
rtr.HandleFunc("/interwiki", handlerInterwiki)
|
||
rtr.HandleFunc("/interwiki/add-entry", handlerAddEntry).Methods(http.MethodPost)
|
||
}
|
||
|
||
func handlerAddEntry(w http.ResponseWriter, rq *http.Request) {
|
||
wiki := Wiki{
|
||
Name: rq.PostFormValue("name"),
|
||
Aliases: strings.Split(rq.PostFormValue("aliases"), ","),
|
||
URL: rq.PostFormValue("url"),
|
||
LinkHrefFormat: rq.PostFormValue("link-href-format"),
|
||
ImgSrcFormat: rq.PostFormValue("img-src-format"),
|
||
Engine: WikiEngine(rq.PostFormValue("engine")),
|
||
}
|
||
wiki.canonize()
|
||
if err := addEntry(&wiki); err != nil {
|
||
viewNameTaken(viewutil.MetaFrom(w, rq), &wiki, err.Error())
|
||
return
|
||
}
|
||
saveInterwikiJson()
|
||
http.Redirect(w, rq, "/interwiki", http.StatusSeeOther)
|
||
}
|
||
|
||
type nameTakenData struct {
|
||
*viewutil.BaseData
|
||
*Wiki
|
||
TakenName string
|
||
}
|
||
|
||
func viewNameTaken(meta viewutil.Meta, wiki *Wiki, takenName string) {
|
||
viewutil.ExecutePage(meta, chainNameTaken, nameTakenData{
|
||
BaseData: &viewutil.BaseData{},
|
||
Wiki: wiki,
|
||
TakenName: takenName,
|
||
})
|
||
}
|
||
|
||
func handlerInterwiki(w http.ResponseWriter, rq *http.Request) {
|
||
viewInterwiki(viewutil.MetaFrom(w, rq))
|
||
}
|
||
|
||
type interwikiData struct {
|
||
*viewutil.BaseData
|
||
Entries []*Wiki
|
||
CanEdit bool
|
||
Error string
|
||
}
|
||
|
||
func viewInterwiki(meta viewutil.Meta) {
|
||
viewutil.ExecutePage(meta, chainInterwiki, interwikiData{
|
||
BaseData: &viewutil.BaseData{},
|
||
Entries: listOfEntries,
|
||
CanEdit: meta.U.Group == "admin",
|
||
Error: "",
|
||
})
|
||
}
|