package main import ( "fmt" "log" "net/http" "os" "path/filepath" "regexp" "strings" ) // WikiDir is a rooted path to the wiki storage directory. var WikiDir string // HyphaPattern is a pattern which all hyphae must match. Not used currently. var HyphaPattern = regexp.MustCompile(`[^?!:#@><*|"\'&%]+`) // HyphaStorage is a mapping between canonical hypha names and their meta information. var HyphaStorage = make(map[string]*HyphaData) // HttpErr is used by many handlers to signal errors in a compact way. func HttpErr(w http.ResponseWriter, status int, name, title, errMsg string) { log.Println(errMsg, "for", name) w.Header().Set("Content-Type", "text/html;charset=utf-8") w.WriteHeader(status) fmt.Fprint(w, base(title, fmt.Sprintf( `

%s. Go back to the hypha.

`, errMsg, name))) } // shorterPath is used by handlerList to display shorter path to the files. It simply strips WikiDir. func shorterPath(fullPath string) string { tmp := strings.TrimPrefix(fullPath, WikiDir) if tmp == "" { return "" } return tmp[1:] } // Show all hyphae func handlerList(w http.ResponseWriter, rq *http.Request) { log.Println(rq.URL) w.Header().Set("Content-Type", "text/html;charset=utf-8") w.WriteHeader(http.StatusOK) buf := `

List of pages

` for name, data := range HyphaStorage { buf += fmt.Sprintf(` `, name, name, shorterPath(data.textPath), data.textType, shorterPath(data.binaryPath), data.binaryType, ) } buf += `
Name Text path Text type Binary path Binary type
%s %s %d %s %d
` w.Write([]byte(base("List of pages", buf))) } // This part is present in all html documents. func base(title, body string) string { return fmt.Sprintf(` %s %s `, title, body) } // Reindex all hyphae by checking the wiki storage directory anew. func handlerReindex(w http.ResponseWriter, rq *http.Request) { log.Println(rq.URL) HyphaStorage = make(map[string]*HyphaData) log.Println("Wiki storage directory is", WikiDir) log.Println("Start indexing hyphae...") Index(WikiDir) log.Println("Indexed", len(HyphaStorage), "hyphae") } func main() { log.Println("Running MycorrhizaWiki β") var err error WikiDir, err = filepath.Abs(os.Args[1]) if err != nil { log.Fatal(err) } log.Println("Wiki storage directory is", WikiDir) log.Println("Start indexing hyphae...") Index(WikiDir) log.Println("Indexed", len(HyphaStorage), "hyphae") http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(WikiDir+"/static")))) // See http_readers.go for /page/, /text/, /binary/. // See http_mutators.go for /upload-binary/, /upload-text/, /edit/. http.HandleFunc("/list", handlerList) http.HandleFunc("/reindex", handlerReindex) http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, rq *http.Request) { http.ServeFile(w, rq, WikiDir+"/static/favicon.ico") }) http.HandleFunc("/", func(w http.ResponseWriter, rq *http.Request) { http.Redirect(w, rq, "/page/home", http.StatusSeeOther) }) log.Fatal(http.ListenAndServe("0.0.0.0:1737", nil)) }