84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"html/template"
|
|
"net/http"
|
|
"path/filepath"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
type HeaderData struct {
|
|
MarqueeItems []MarqueeItem `toml:"marquee_items"`
|
|
Links Links `toml:"links"`
|
|
}
|
|
type MarqueeItem struct {
|
|
Text string `toml:"text"`
|
|
URL template.URL `toml:"url"`
|
|
}
|
|
type Links struct {
|
|
TopLevel []Link `toml:"top_level"`
|
|
Categories []LinkCategory `toml:"categories"`
|
|
}
|
|
type Link struct {
|
|
Name string `toml:"name"`
|
|
URL template.URL `toml:"url"`
|
|
}
|
|
type LinkCategory struct {
|
|
Name string `toml:"name"`
|
|
MainLink string `toml:"main_link"`
|
|
Links []Link `toml:"links"`
|
|
}
|
|
|
|
type Config struct {
|
|
HeaderData HeaderData `toml:"header_data"`
|
|
}
|
|
|
|
type PageData struct {
|
|
Header HeaderData
|
|
Body template.HTML
|
|
Posts []Post
|
|
Post Post
|
|
StatusCode int
|
|
StatusMessage string
|
|
}
|
|
|
|
var debug *bool
|
|
var configDir string
|
|
var contentDir string
|
|
|
|
var config Config
|
|
|
|
func main() {
|
|
debug = flag.Bool("debug", false, "Run in debug mode")
|
|
var httpAddress string
|
|
flag.StringVar(&httpAddress, "address", ":8080", "HTTP address to listen on")
|
|
flag.StringVar(&configDir, "config", "", "The directory containing the server config")
|
|
flag.StringVar(&contentDir, "content", "", "The directory containing content")
|
|
flag.Parse()
|
|
|
|
_, err := toml.DecodeFile(filepath.Join(configDir, "config.toml"), &config)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
mux := &http.ServeMux{}
|
|
|
|
mux.HandleFunc("/", notFoundHandler)
|
|
mux.HandleFunc("/{$}", homeHandler)
|
|
mux.HandleFunc("/page/{page}", staticPageHandler)
|
|
mux.HandleFunc("/page/{category}/{page}", staticCategoryHandler)
|
|
mux.HandleFunc("/blog/{post}", postHandler)
|
|
mux.HandleFunc("/blog", blogHandler)
|
|
fs := http.FileServer(http.Dir(filepath.Join(contentDir, "static")))
|
|
mux.Handle("/static/", http.StripPrefix("/static/", fs))
|
|
mux.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
|
|
http.ServeFile(w, r, filepath.Join(contentDir, "/static/favicon.ico"))
|
|
})
|
|
err = http.ListenAndServe(httpAddress, mux)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|