109 lines
1.9 KiB
Go
109 lines
1.9 KiB
Go
package action
|
|
|
|
import (
|
|
"net/http"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"golang.org/x/text/unicode/norm"
|
|
|
|
"tea.kareha.org/pot/himewiki/internal/config"
|
|
)
|
|
|
|
type Params struct {
|
|
Name string
|
|
DbName string
|
|
Ext string
|
|
Action string
|
|
ID *int
|
|
}
|
|
|
|
func parse(cfg *config.Config, r *http.Request) Params {
|
|
rawName := strings.TrimPrefix(r.URL.Path, "/")
|
|
name := norm.NFC.String(rawName)
|
|
if name == "" {
|
|
name = cfg.Wiki.Front
|
|
}
|
|
ext := filepath.Ext(name)
|
|
if ext == "" {
|
|
if name[0] == '.' {
|
|
ext = name
|
|
}
|
|
}
|
|
dbName := name
|
|
if ext == ".wiki" {
|
|
dbName = name[:len(name)-len(ext)]
|
|
}
|
|
if ext == "" {
|
|
ext = ".wiki"
|
|
}
|
|
ext = ext[1:]
|
|
|
|
action := r.URL.Query().Get("a")
|
|
|
|
idStr := r.URL.Query().Get("i")
|
|
id, err := strconv.Atoi(idStr)
|
|
var idRef = &id
|
|
if err != nil || id <= 0 {
|
|
idRef = nil
|
|
}
|
|
|
|
return Params{
|
|
Name: name,
|
|
DbName: dbName,
|
|
Ext: ext,
|
|
Action: action,
|
|
ID: idRef,
|
|
}
|
|
}
|
|
|
|
func handle(cfg *config.Config, w http.ResponseWriter, r *http.Request) {
|
|
params := parse(cfg, r)
|
|
|
|
if params.Ext == "wiki" {
|
|
switch params.Action {
|
|
case "info":
|
|
Info(cfg, w, r, ¶ms)
|
|
case "", "view":
|
|
View(cfg, w, r, ¶ms)
|
|
case "edit":
|
|
Edit(cfg, w, r, ¶ms)
|
|
case "all":
|
|
All(cfg, w, r, ¶ms)
|
|
case "recent":
|
|
Recent(cfg, w, r, ¶ms)
|
|
case "revs":
|
|
Revisions(cfg, w, r, ¶ms)
|
|
case "revert":
|
|
Revert(cfg, w, r, ¶ms)
|
|
case "rev":
|
|
ViewRevision(cfg, w, r, ¶ms)
|
|
case "search":
|
|
Search(cfg, w, r, ¶ms)
|
|
case "upload":
|
|
Upload(cfg, w, r, ¶ms)
|
|
case "allimgs":
|
|
AllImages(cfg, w, r, ¶ms)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
} else {
|
|
switch params.Action {
|
|
case "", "view":
|
|
ViewImage(cfg, w, r, ¶ms)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func Handler(cfg *config.Config) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
if handleStatic(cfg, w, r) {
|
|
return
|
|
}
|
|
handle(cfg, w, r)
|
|
}
|
|
}
|