aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--handler.go69
-rw-r--r--http.go86
-rw-r--r--main.go41
-rw-r--r--page.go23
-rw-r--r--static/css/font-awesome.css (renamed from assets/css/font-awesome.css)0
-rw-r--r--static/css/font-awesome.min.css (renamed from assets/css/font-awesome.min.css)0
-rw-r--r--static/css/fonts.css (renamed from assets/css/fonts.css)12
-rw-r--r--static/css/style.css (renamed from assets/css/style.css)0
-rw-r--r--static/fonts/FontAwesome.otf (renamed from assets/fonts/FontAwesome.otf)bin109688 -> 109688 bytes
-rw-r--r--static/fonts/eurof35.ttf (renamed from assets/fonts/eurof35.ttf)bin155088 -> 155088 bytes
-rw-r--r--static/fonts/eurof36.ttf (renamed from assets/fonts/eurof36.ttf)bin170876 -> 170876 bytes
-rw-r--r--static/fonts/eurof55.ttf (renamed from assets/fonts/eurof55.ttf)bin159112 -> 159112 bytes
-rw-r--r--static/fonts/eurof56.ttf (renamed from assets/fonts/eurof56.ttf)bin172044 -> 172044 bytes
-rw-r--r--static/fonts/eurof75.ttf (renamed from assets/fonts/eurof75.ttf)bin162460 -> 162460 bytes
-rw-r--r--static/fonts/eurof76.ttf (renamed from assets/fonts/eurof76.ttf)bin174772 -> 174772 bytes
-rw-r--r--static/fonts/fontawesome-webfont.eot (renamed from assets/fonts/fontawesome-webfont.eot)bin70807 -> 70807 bytes
-rw-r--r--static/fonts/fontawesome-webfont.svg (renamed from assets/fonts/fontawesome-webfont.svg)0
-rw-r--r--static/fonts/fontawesome-webfont.ttf (renamed from assets/fonts/fontawesome-webfont.ttf)bin142072 -> 142072 bytes
-rw-r--r--static/fonts/fontawesome-webfont.woff (renamed from assets/fonts/fontawesome-webfont.woff)bin83588 -> 83588 bytes
-rw-r--r--static/fonts/fontawesome-webfont.woff2 (renamed from assets/fonts/fontawesome-webfont.woff2)bin66624 -> 66624 bytes
-rw-r--r--static/fonts/monof55.ttf (renamed from assets/fonts/monof55.ttf)bin169452 -> 169452 bytes
-rw-r--r--static/fonts/monof56.ttf (renamed from assets/fonts/monof56.ttf)bin181628 -> 181628 bytes
-rw-r--r--tmpl/root6
-rw-r--r--wiki.go52
24 files changed, 173 insertions, 116 deletions
diff --git a/handler.go b/handler.go
deleted file mode 100644
index 8894b62..0000000
--- a/handler.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package main
-
-import (
- "html/template"
- "io/ioutil"
- "net/http"
-)
-
-var (
- indextmpl = template.Must(template.ParseFiles("tmpl/root", "tmpl/index"))
- viewtmpl = template.Must(template.ParseFiles("tmpl/root", "tmpl/view"))
- edittmpl = template.Must(template.ParseFiles("tmpl/root", "tmpl/edit"))
-)
-
-func indexHandler(w http.ResponseWriter, r *http.Request) {
- files, err := ioutil.ReadDir("data")
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- p := new(Page)
- for _, entry := range files {
- file := entry.Name()
- if !entry.IsDir() && file[0] != '.' {
- p.Pages = append(p.Pages, entry)
- }
- }
- p.render(w, indextmpl)
-}
-
-func viewHandler(w http.ResponseWriter, r *http.Request) {
- title := r.URL.Path[len("/view/"):]
- p, err := loadPage(title)
- if err != nil {
- http.Redirect(w, r, "/edit/"+title, http.StatusFound)
- return
- }
- p.render(w, viewtmpl)
-}
-
-func editHandler(w http.ResponseWriter, r *http.Request) {
- title := r.URL.Path[len("/edit/"):]
- p, _ := loadPage(title)
- p.render(w, edittmpl)
-}
-
-func delHandler(w http.ResponseWriter, r *http.Request) {
- title := r.URL.Path[len("/del/"):]
- p := &Page{Title: title}
- if err := p.del(); err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- http.Redirect(w, r, "/", http.StatusFound)
-}
-
-func saveHandler(w http.ResponseWriter, r *http.Request) {
- title := r.URL.Path[len("/save/"):]
- p := &Page{Title: title, Body: []byte(r.FormValue("body"))}
- if err := p.save(); err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- http.Redirect(w, r, "/view/"+title, http.StatusFound)
-}
-
-func homeHandler(w http.ResponseWriter, r *http.Request) {
- http.Redirect(w, r, "/view/Home", http.StatusFound)
-}
diff --git a/http.go b/http.go
new file mode 100644
index 0000000..c6aec32
--- /dev/null
+++ b/http.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "html/template"
+ "net/http"
+)
+
+type Index struct {
+ Wiki
+ *template.Template
+}
+
+func (i Index) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ pages, err := i.Wiki.List()
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ p := Page{Pages: pages}
+ if err := p.Render(w, i.Template); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+}
+
+type View struct {
+ Wiki
+ *template.Template
+}
+
+func (v View) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ title := r.PathValue("title")
+ p, err := v.Wiki.Load(title)
+ if err != nil {
+ http.Redirect(w, r, "/edit/"+title, http.StatusFound)
+ return
+ }
+ if err := p.Render(w, v.Template); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+}
+
+type Edit struct {
+ Wiki
+ *template.Template
+}
+
+func (e Edit) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ title := r.PathValue("title")
+ p, _ := e.Wiki.Load(title)
+ if err := p.Render(w, e.Template); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+}
+
+type Delete struct {
+ Wiki
+}
+
+func (d Delete) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ title := r.PathValue("title")
+ if err := d.Delete(title); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ http.Redirect(w, r, "/", http.StatusFound)
+}
+
+type Save struct {
+ Wiki
+}
+
+func (s Save) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ title := r.PathValue("title")
+ p := Page{
+ Title: title,
+ Body: []byte(r.FormValue("body")),
+ }
+ if err := s.Save(p); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ http.Redirect(w, r, "/view/"+title, http.StatusFound)
+}
diff --git a/main.go b/main.go
index 2c50720..d6841f0 100644
--- a/main.go
+++ b/main.go
@@ -1,24 +1,41 @@
package main
import (
+ "embed"
"flag"
+ "html/template"
"net/http"
)
-var (
- listen = flag.String("listen", ":8080", "Listen at")
- data = flag.String("data", "data", "Data dir")
-)
+//go:embed static tmpl
+var static embed.FS
func main() {
+ var (
+ listen = flag.String("listen", "localhost:8080", "Listen at")
+ data = flag.String("data", "data", "Data dir")
+ )
flag.Parse()
- http.Handle("/css/", http.FileServer(http.Dir("assets")))
- http.Handle("/fonts/", http.FileServer(http.Dir("assets")))
- http.HandleFunc("/index", indexHandler)
- http.HandleFunc("/view/", viewHandler)
- http.HandleFunc("/edit/", editHandler)
- http.HandleFunc("/del/", delHandler)
- http.HandleFunc("/save/", saveHandler)
- http.HandleFunc("/", homeHandler)
+ wiki := Wiki{Root: *data}
+ http.Handle("GET /static/", http.FileServerFS(static))
+ http.Handle("GET /index", Index{
+ Wiki: wiki,
+ Template: template.Must(template.ParseFS(static, "tmpl/root", "tmpl/index")),
+ })
+ http.Handle("GET /view/{title}", View{
+ Wiki: wiki,
+ Template: template.Must(template.ParseFS(static, "tmpl/root", "tmpl/view")),
+ })
+ http.Handle("GET /edit/{title}", Edit{
+ Wiki: wiki,
+ Template: template.Must(template.ParseFS(static, "tmpl/root", "tmpl/edit")),
+ })
+ http.Handle("POST /save/{title}", Save{
+ Wiki: wiki,
+ })
+ http.Handle("GET /del/{title}", Delete{
+ Wiki: wiki,
+ })
+ http.Handle("GET /", http.RedirectHandler("/view/Home", http.StatusFound))
http.ListenAndServe(*listen, nil)
}
diff --git a/page.go b/page.go
new file mode 100644
index 0000000..4fb8b58
--- /dev/null
+++ b/page.go
@@ -0,0 +1,23 @@
+package main
+
+import (
+ "html/template"
+ "io"
+ "os"
+
+ "github.com/russross/blackfriday"
+)
+
+type Page struct {
+ Title string
+ Body []byte
+ Pages []os.FileInfo
+}
+
+func (p Page) Render(w io.Writer, t *template.Template) error {
+ return t.ExecuteTemplate(w, "root", p)
+}
+
+func (p Page) HTML() template.HTML {
+ return template.HTML(blackfriday.MarkdownCommon(p.Body))
+}
diff --git a/assets/css/font-awesome.css b/static/css/font-awesome.css
index b2a5fe2..b2a5fe2 100644
--- a/assets/css/font-awesome.css
+++ b/static/css/font-awesome.css
diff --git a/assets/css/font-awesome.min.css b/static/css/font-awesome.min.css
index d0603cb..d0603cb 100644
--- a/assets/css/font-awesome.min.css
+++ b/static/css/font-awesome.min.css
diff --git a/assets/css/fonts.css b/static/css/fonts.css
index 6e95548..8006f36 100644
--- a/assets/css/fonts.css
+++ b/static/css/fonts.css
@@ -1,41 +1,41 @@
@font-face {
font-family: 'Eurofur';
- src: url('/fonts/eurof55.ttf') format('truetype');
+ src: url('/static/fonts/eurof55.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Eurofur';
- src: url('/fonts/eurof56.ttf') format('truetype');
+ src: url('/static/fonts/eurof56.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Eurofur';
- src: url('/fonts/eurof75.ttf') format('truetype');
+ src: url('/static/fonts/eurof75.ttf') format('truetype');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Eurofur';
- src: url('/fonts/eurof76.ttf') format('truetype');
+ src: url('/static/fonts/eurof76.ttf') format('truetype');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'Monofur';
- src: url('/fonts/monof55.ttf') format('truetype');
+ src: url('/static/fonts/monof55.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Monofur';
- src: url('/fonts/monof55.ttf') format('truetype');
+ src: url('/static/fonts/monof55.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
diff --git a/assets/css/style.css b/static/css/style.css
index 3ef4259..3ef4259 100644
--- a/assets/css/style.css
+++ b/static/css/style.css
diff --git a/assets/fonts/FontAwesome.otf b/static/fonts/FontAwesome.otf
index 3ed7f8b..3ed7f8b 100644
--- a/assets/fonts/FontAwesome.otf
+++ b/static/fonts/FontAwesome.otf
Binary files differ
diff --git a/assets/fonts/eurof35.ttf b/static/fonts/eurof35.ttf
index ad174c3..ad174c3 100644
--- a/assets/fonts/eurof35.ttf
+++ b/static/fonts/eurof35.ttf
Binary files differ
diff --git a/assets/fonts/eurof36.ttf b/static/fonts/eurof36.ttf
index 9c56f48..9c56f48 100644
--- a/assets/fonts/eurof36.ttf
+++ b/static/fonts/eurof36.ttf
Binary files differ
diff --git a/assets/fonts/eurof55.ttf b/static/fonts/eurof55.ttf
index 94a9d79..94a9d79 100644
--- a/assets/fonts/eurof55.ttf
+++ b/static/fonts/eurof55.ttf
Binary files differ
diff --git a/assets/fonts/eurof56.ttf b/static/fonts/eurof56.ttf
index 7760acf..7760acf 100644
--- a/assets/fonts/eurof56.ttf
+++ b/static/fonts/eurof56.ttf
Binary files differ
diff --git a/assets/fonts/eurof75.ttf b/static/fonts/eurof75.ttf
index ded8b46..ded8b46 100644
--- a/assets/fonts/eurof75.ttf
+++ b/static/fonts/eurof75.ttf
Binary files differ
diff --git a/assets/fonts/eurof76.ttf b/static/fonts/eurof76.ttf
index 99b9730..99b9730 100644
--- a/assets/fonts/eurof76.ttf
+++ b/static/fonts/eurof76.ttf
Binary files differ
diff --git a/assets/fonts/fontawesome-webfont.eot b/static/fonts/fontawesome-webfont.eot
index 9b6afae..9b6afae 100644
--- a/assets/fonts/fontawesome-webfont.eot
+++ b/static/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/assets/fonts/fontawesome-webfont.svg b/static/fonts/fontawesome-webfont.svg
index d05688e..d05688e 100644
--- a/assets/fonts/fontawesome-webfont.svg
+++ b/static/fonts/fontawesome-webfont.svg
diff --git a/assets/fonts/fontawesome-webfont.ttf b/static/fonts/fontawesome-webfont.ttf
index 26dea79..26dea79 100644
--- a/assets/fonts/fontawesome-webfont.ttf
+++ b/static/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/assets/fonts/fontawesome-webfont.woff b/static/fonts/fontawesome-webfont.woff
index dc35ce3..dc35ce3 100644
--- a/assets/fonts/fontawesome-webfont.woff
+++ b/static/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/assets/fonts/fontawesome-webfont.woff2 b/static/fonts/fontawesome-webfont.woff2
index 500e517..500e517 100644
--- a/assets/fonts/fontawesome-webfont.woff2
+++ b/static/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/assets/fonts/monof55.ttf b/static/fonts/monof55.ttf
index 9aebf80..9aebf80 100644
--- a/assets/fonts/monof55.ttf
+++ b/static/fonts/monof55.ttf
Binary files differ
diff --git a/assets/fonts/monof56.ttf b/static/fonts/monof56.ttf
index a6f3b67..a6f3b67 100644
--- a/assets/fonts/monof56.ttf
+++ b/static/fonts/monof56.ttf
Binary files differ
diff --git a/tmpl/root b/tmpl/root
index c357ad1..4bd21ee 100644
--- a/tmpl/root
+++ b/tmpl/root
@@ -3,9 +3,9 @@
<html>
<head>
<title>{{template "title" .}}</title>
- <link rel='stylesheet' type='text/css' href='/css/fonts.css'>
- <link rel='stylesheet' type='text/css' href='/css/style.css'>
- <link rel='stylesheet' type='text/css' href='/css/font-awesome.min.css'>
+ <link rel='stylesheet' type='text/css' href='/static/css/fonts.css'>
+ <link rel='stylesheet' type='text/css' href='/static/css/style.css'>
+ <link rel='stylesheet' type='text/css' href='/static/css/font-awesome.min.css'>
</head>
<body>
<nav>
diff --git a/wiki.go b/wiki.go
index 6a7bbf9..64e1e82 100644
--- a/wiki.go
+++ b/wiki.go
@@ -1,46 +1,46 @@
package main
import (
- "html/template"
- "io/ioutil"
- "net/http"
"os"
"path"
-
- "github.com/russross/blackfriday"
)
-type Page struct {
- Title string
- Body []byte
- Pages []os.FileInfo
+type Wiki struct {
+ Root string
}
-func (p *Page) fileName() string {
- return path.Join(*data, p.Title)
+func (w Wiki) fileName(title string) string {
+ return path.Join(w.Root, title)
}
-func (p *Page) save() error {
- return ioutil.WriteFile(p.fileName(), p.Body, 0600)
+func (w Wiki) Save(p Page) error {
+ return os.WriteFile(w.fileName(p.Title), p.Body, 0600)
}
-func loadPage(title string) (p *Page, err error) {
- p = &Page{Title: title}
- p.Body, err = ioutil.ReadFile(p.fileName())
- return
+func (w Wiki) Load(title string) (Page, error) {
+ body, err := os.ReadFile(w.fileName(title))
+ return Page{Title: title, Body: body}, err
}
-func (p *Page) del() error {
- return os.Remove(p.fileName())
+func (w Wiki) Delete(title string) error {
+ return os.Remove(w.fileName(title))
}
-func (p *Page) render(w http.ResponseWriter, tmpl *template.Template) {
- err := tmpl.ExecuteTemplate(w, "root", p)
+func (w Wiki) List() ([]os.FileInfo, error) {
+ files, err := os.ReadDir(w.Root)
if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
+ return nil, err
}
-}
-
-func (p *Page) HTML() template.HTML {
- return template.HTML(blackfriday.MarkdownCommon(p.Body))
+ var pages []os.FileInfo
+ for _, entry := range files {
+ file := entry.Name()
+ if !entry.IsDir() && file[0] != '.' {
+ info, err := entry.Info()
+ if err != nil {
+ return nil, err
+ }
+ pages = append(pages, info)
+ }
+ }
+ return pages, nil
}