2020-06-12 16:22:02 +00:00
package main
import (
2020-08-05 15:08:59 +00:00
"fmt"
2020-06-13 11:18:11 +00:00
"log"
"net/http"
2020-06-12 16:22:02 +00:00
"os"
"path/filepath"
2020-08-05 15:08:59 +00:00
"regexp"
2020-08-08 20:10:28 +00:00
"github.com/bouncepaw/mycorrhiza/history"
2020-08-09 19:33:47 +00:00
"github.com/bouncepaw/mycorrhiza/util"
2020-06-12 16:22:02 +00:00
)
2020-08-05 15:08:59 +00:00
// WikiDir is a rooted path to the wiki storage directory.
var WikiDir string
2020-06-14 08:12:22 +00:00
2020-08-05 15:08:59 +00:00
// HyphaPattern is a pattern which all hyphae must match. Not used currently.
var HyphaPattern = regexp . MustCompile ( ` [^?!:#@><*|"\'&%]+ ` )
2020-07-02 19:03:30 +00:00
2020-08-05 15:08:59 +00:00
// HyphaStorage is a mapping between canonical hypha names and their meta information.
var HyphaStorage = make ( map [ string ] * HyphaData )
2020-06-14 08:12:22 +00:00
2020-08-05 20:19:14 +00:00
// IterateHyphaNamesWith is a closure to be passed to subpackages to let them iterate all hypha names read-only.
func IterateHyphaNamesWith ( f func ( string ) ) {
for hyphaName , _ := range HyphaStorage {
f ( hyphaName )
}
}
2020-08-05 15:08:59 +00:00
// 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 (
` <p>%s. <a href="/page/%s">Go back to the hypha.<a></p> ` ,
errMsg , name ) ) )
}
2020-06-14 08:12:22 +00:00
2020-08-09 19:33:47 +00:00
// shorterPath is used by handlerList to display shorter path to the files. It simply strips WikiDir. It was moved to util package, this is an alias. TODO: demolish.
var shorterPath = util . ShorterPath
2020-06-14 08:12:22 +00:00
2020-08-05 15:08:59 +00:00
// 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 := `
< h1 > List of pages < / h1 >
< table >
< thead >
< tr >
< th > Name < / th >
< th > Text path < / th >
< th > Text type < / th >
< th > Binary path < / th >
< th > Binary type < / th >
< / tr >
< / thead >
< tbody > `
for name , data := range HyphaStorage {
buf += fmt . Sprintf ( `
< tr >
< td > < a href = "/page/%s" > % s < / a > < / td >
< td > % s < / td >
< td > % d < / td >
< td > % s < / td >
< td > % d < / td >
< / tr > ` ,
name , name ,
shorterPath ( data . textPath ) , data . textType ,
shorterPath ( data . binaryPath ) , data . binaryType ,
)
}
buf += `
< / tbody >
< / table >
`
w . Write ( [ ] byte ( base ( "List of pages" , buf ) ) )
}
2020-06-14 08:12:22 +00:00
2020-08-05 15:08:59 +00:00
// This part is present in all html documents.
func base ( title , body string ) string {
return fmt . Sprintf ( `
< ! doctype html >
< html >
< head >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< link rel = "stylesheet" type = "text/css" href = "/static/common.css" >
< title > % s < / title >
< / head >
< body >
% s
< / body >
< / html >
` , title , body )
}
2020-06-13 16:42:43 +00:00
2020-08-05 15:08:59 +00:00
// 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" )
}
2020-06-14 08:12:22 +00:00
2020-08-05 15:08:59 +00:00
func main ( ) {
log . Println ( "Running MycorrhizaWiki β" )
2020-06-13 11:18:11 +00:00
2020-08-05 15:08:59 +00:00
var err error
WikiDir , err = filepath . Abs ( os . Args [ 1 ] )
2020-08-09 19:33:47 +00:00
util . WikiDir = WikiDir
2020-08-05 15:08:59 +00:00
if err != nil {
log . Fatal ( err )
2020-06-13 11:18:11 +00:00
}
2020-08-19 18:54:23 +00:00
if err := os . Chdir ( WikiDir ) ; err != nil {
log . Fatal ( err )
}
2020-08-05 15:08:59 +00:00
log . Println ( "Wiki storage directory is" , WikiDir )
log . Println ( "Start indexing hyphae..." )
Index ( WikiDir )
log . Println ( "Indexed" , len ( HyphaStorage ) , "hyphae" )
2020-08-08 20:10:28 +00:00
history . Start ( WikiDir )
2020-08-05 15:08:59 +00:00
http . Handle ( "/static/" , http . StripPrefix ( "/static/" , http . FileServer ( http . Dir ( WikiDir + "/static" ) ) ) )
2020-08-19 18:54:23 +00:00
// See http_readers.go for /page/, /text/, /binary/, /history/.
2020-08-05 15:08:59 +00:00
// 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 ) )
2020-06-12 16:22:02 +00:00
}