gosora/router_gen/main.go
Azareal e099dfd40e Added the query generator. It's a work in progress and in constant flux.
Added forum descriptions.
Began work on the Advanced Forum Editor. Not to be confused with the Quick Forum Editor. You can access it by going to /panel/forums/edit/{forumid} We'll fix it so the Forum Manager links to it in the next commit.
Fixed the Linux shell scripts.
Fixed an issue with relative timess being off by an hour due to timezones.
Added reply count and author names to the topic list and forum pages.
Improved the look of the forum list, forum page, and topic list.
Added an overlay effect for when the alert list is open on mobile.
You can now close the alert list by clicking on the bell.
Removed the "Report:" prefix from report posts.
Fixed a bug in the template system where "and" and "or" wouldn't work on non-boolean values.
Improved the debug logging in the template system.
Fixed a bug in the forum creator where the "Hidden?" value was inverted.
Fixed a visual bug in the profile where the Ban button rendered in a glitchy way.
Added support for hidden fields to the JS Framework for inline editing rows.
Fixed a bug with the like counter rendering on-top of the alert list.
Atom's stripping trailing tabs for some reason, so don't be confused if there are a bunch of weird changes.
2017-06-05 12:57:27 +01:00

174 lines
4.0 KiB
Go

/* WIP Under Construction */
package main
import "log"
import "fmt"
//import "strings"
import "os"
var route_list []Route
var route_groups []RouteGroup
func main() {
fmt.Println("Generating the router...")
// Load all the routes...
routes()
var out string
var fdata string = "// Code generated by. DO NOT EDIT.\n/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */\n"
for _, route := range route_list {
var end int
if route.Path[len(route.Path)-1] == '/' {
end = len(route.Path) - 1
} else {
end = len(route.Path) - 1
}
out += "\n\t\tcase \"" + route.Path[0:end] + "\":"
if route.Before != "" {
out += "\n\t\t\t" + route.Before
}
out += "\n\t\t\t" + route.Name + "(w,req"
for _, item := range route.Vars {
out += "," + item
}
out += ")\n\t\t\treturn"
}
for _, group := range route_groups {
var end int
if group.Path[len(group.Path)-1] == '/' {
end = len(group.Path) - 1
} else {
end = len(group.Path) - 1
}
out += `
case "` + group.Path[0:end] + `":
switch(req.URL.Path) {`
var default_route Route
for _, route := range group.Routes {
if group.Path == route.Path {
default_route = route
continue
}
out += "\n\t\t\t\tcase \"" + route.Path + "\":"
if route.Before != "" {
out += "\n\t\t\t\t\t" + route.Before
}
out += "\n\t\t\t\t\t" + route.Name + "(w,req"
for _, item := range route.Vars {
out += "," + item
}
out += ")\n\t\t\t\t\treturn"
}
if default_route.Name != "" {
out += "\n\t\t\t\tdefault:"
if default_route.Before != "" {
out += "\n\t\t\t\t\t" + default_route.Before
}
out += "\n\t\t\t\t\t" + default_route.Name + "(w,req"
for _, item := range default_route.Vars {
out += ", " + item
}
out += ")\n\t\t\t\t\treturn"
}
out += "\n\t\t\t}"
}
fdata += `package main
//import "fmt"
import "sync"
import "strings"
import "net/http"
type GenRouter struct {
UploadHandler func(http.ResponseWriter, *http.Request)
sync.RWMutex // Temporary Fallback
old_routes map[string]func(http.ResponseWriter, *http.Request) // Temporary Fallback
}
func NewGenRouter(uploads http.Handler) *GenRouter {
return &GenRouter{
UploadHandler: http.StripPrefix("/uploads/",uploads).ServeHTTP,
old_routes: make(map[string]func(http.ResponseWriter, *http.Request)),
}
}
func (router *GenRouter) Handle(_ string, _ http.Handler) {
}
func (router *GenRouter) HandleFunc(pattern string, handle func(http.ResponseWriter, *http.Request)) {
router.Lock()
router.old_routes[pattern] = handle
router.Unlock()
}
func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
//if req.URL.Path == "/" {
// default_route(w,req)
// return
//}
if req.URL.Path[0] != '/' {
w.WriteHeader(405)
w.Write([]byte(""))
return
}
var prefix, extra_data string
prefix = req.URL.Path[0:strings.IndexByte(req.URL.Path[1:],'/') + 1]
if req.URL.Path[len(req.URL.Path) - 1] != '/' {
extra_data = req.URL.Path[strings.LastIndexByte(req.URL.Path,'/') + 1:]
req.URL.Path = req.URL.Path[:strings.LastIndexByte(req.URL.Path,'/') + 1]
}
//fmt.Println("prefix:",prefix)
//fmt.Println("req.URL.Path:",req.URL.Path)
//fmt.Println("extra_data:",extra_data)
switch(prefix) {` + out + `
case "/uploads":
if extra_data == "" {
NotFound(w,req)
return
}
req.URL.Path += extra_data
router.UploadHandler(w,req)
return
case "":
default_route(w,req)
return
//default: NotFound(w,req)
}
// A fallback for the routes which haven't been converted to the new router yet
router.RLock()
handle, ok := router.old_routes[req.URL.Path]
router.RUnlock()
if ok {
req.URL.Path += extra_data
handle(w,req)
return
}
NotFound(w,req)
}
`
write_file("./gen_router.go",fdata)
fmt.Println("Successfully generated the router")
}
func write_file(name string, content string) {
f, err := os.Create(name)
if err != nil {
log.Fatal(err)
}
_, err = f.WriteString(content)
if err != nil {
log.Fatal(err)
}
f.Sync()
f.Close()
}