Embedded Resources

This commit is contained in:
Tim Schuster committed 2017-03-15 14:33:27 +01:00
1 parent 477d3477df
commit 37ba7255fe
9 files changed
+257 -43

No files matched your search

+3
View File
@@ -2,6 +2,7 @@ package config
import (
"flag"
"github.com/GeertJohan/go.rice"
"gopkg.in/yaml.v2"
"io/ioutil"
"os"
@@ -25,6 +26,8 @@ type Config struct {
const (
CaptchaRecaptcha = "recaptcha"
CaptchaInternal = "internal"
CaptchaHybrid = "hybrid"
CaptchaDisabled = "disabled"
)
+5 -11
View File
@@ -11,24 +11,18 @@ import (
"time"
)
var riceConf = rice.Config{
LocateOrder: []rice.LocateMethod{
rice.LocateWorkingDirectory,
rice.LocateEmbedded,
rice.LocateAppended,
},
}
var box = riceConf.MustFindBox("http/admin/res/")
var (
panelTmpl = template.New("admin/panel")
loginTmpl = template.New("admin/login")
statusTmpl = template.New("admin/status")
)
func init() {
func LoadTemplates() error {
var err error
box, err := rice.FindBox("res/")
if err != nil {
panic(err)
}
panelTmpl, err = panelTmpl.Parse(box.MustString("panel.html"))
if err != nil {
panic(err)
+55
View File
@@ -0,0 +1,55 @@
package admin
import (
"github.com/GeertJohan/go.rice/embedded"
"time"
)
func init() {
// define files
file2 := &embedded.EmbeddedFile{
Filename: `index.html`,
FileModTime: time.Unix(1489315188, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} Admin Login</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n <link rel=\"stylesheet\" href=\"/@/admin.css\">\n</head>\n<body>\n <div class=\"admin login\">\n <form action=\"/admin/login.sh\" method=\"POST\">\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n <div class=\"admin form row\">\n <input\n class=\"admin form input\"\n type=\"text\"\n name=\"id\"\n placeholder=\"admin id\"\n minlength=\"3\"/>\n </div>\n <div class=\"admin form row\">\n <input\n class=\"admin form input\"\n type=\"password\"\n name=\"pass\"\n placeholder=\"password\"\n minlength=\"3\"/>\n </div>\n <div class=\"admin form row\">\n <input class=\"admin form input halfsize\" type=\"submit\" value=\"Login\"/>\n <input class=\"admin form input halfsize\" type=\"reset\" value=\"Reset\"/>\n </div>\n </form>\n </div>\n</body>\n</html>"),
}
file3 := &embedded.EmbeddedFile{
Filename: `panel.html`,
FileModTime: time.Unix(1489566364, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} Admin Panel</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n <link rel=\"stylesheet\" href=\"/@/admin.css\">\n</head>\n<body>\n<div class=\"welcome\">\n Welcome {{.Admin.Id}}<br>\n <form class=\"form logout\" method=\"POST\" action=\"/admin/logout.sh\">\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n <input type=\"submit\" value=\"Logout\" />\n </form>\n</div>\n<br clear=\"left\" /><hr />\n<div class=\"postarea\">\n <form action=\"/admin/new_board.sh\" method=\"POST\">\n <table>\n <tbody>\n <tr>\n <td class=\"postblock\">\n Action\n </td>\n <td>\n New Board\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n Short Name\n </td>\n <td>\n <input type=\"text\" placeholder=\"shortname\" name=\"shortname\"/>\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n Long Name\n </td>\n <td>\n <input type=\"text\" placeholder=\"longname\" name=\"longname\"/>\n </td>\n </tr>\n <tr>\n <td class=\"postblock\"></td>\n <td>\n <input type=\"submit\" value=\"Create Board\" />\n <input type=\"reset\" value=\"Reset\" />\n </td>\n </tr>\n </tbody>\n </table>\n </form>\n</div>\n<br clear=\"left\" /><hr />\n<div class=\"postarea\">\n <form action=\"/admin/new_admin.sh\" method=\"POST\">\n <table>\n <tbody>\n <tr>\n <td class=\"postblock\">\n Action\n </td>\n <td>\n New Administrator\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n ID\n </td>\n <td>\n <input type=\"text\"\n minlength=\"4\"\n maxlength=\"255\"\n name=\"adminid\"\n required />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n Password\n </td>\n <td>\n <input type=\"password\"\n minlength=\"12\"\n maxlength=\"255\"\n name=\"adminpass\"\n required />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\"></td>\n <td>\n <input type=\"submit\" value=\"Create Admin ID\" />\n <input type=\"reset\" value=\"Reset\" />\n </td>\n </tr>\n </tbody>\n </table>\n </form>\n</div>\n<br clear=\"left\" /><hr />\n<div class=\"postarea\">\n <form action=\"/admin/del_admin.sh\" method=\"POST\">\n <table>\n <tbody>\n <tr>\n <td class=\"postblock\">\n Action\n </td>\n <td>\n Delete Administrator\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n ID\n </td>\n <td>\n <input type=\"text\"\n minlength=\"4\"\n maxlength=\"255\"\n name=\"adminid\"\n required />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\"></td>\n <td>\n <input type=\"submit\" value=\"Delete Admin ID\" />\n <input type=\"reset\" value=\"Reset\" />\n </td>\n Line truncated
}
file4 := &embedded.EmbeddedFile{
Filename: `status.html`,
FileModTime: time.Unix(1489525499, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} Status</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n <link rel=\"stylesheet\" href=\"/@/admin.css\">\n</head>\n<body>\n<div class=\"banner logo\">\n<h2>Runtime Statistics</h2>\n</div>\n<br/>\n<br/>\n<div class=\"postarea\">\n <form id=\"postform1\" action=\"/admin/new_board.sh\" method=\"POST\">\n <table>\n <tbody>\n <tr><td class=\"postblock\">\n Start Time\n </td><td>\n {{.Uptime.human}}\n </td></tr>\n <tr><td class=\"postblock\">\n Uptime (Precise)\n </td><td>\n {{ .Uptime.hours | printf \"%.4f\"}} hours<br/>\n {{ .Uptime.seconds | printf \"%.4f\"}} seconds\n </td></tr>\n <tr><td class=\"postblock\">\n Num. CPU\n </td><td>\n {{.GC.numcpu}}\n </td></tr>\n <tr><td class=\"postblock\">\n Num. GoRoutines\n </td><td>\n {{.GC.numgor}}\n </td></tr>\n <tr><td class=\"postblock\">\n Go Version<br/>\n Arch/OS/Compiler\n </td><td>\n {{.GC.version}}<br/>\n {{.GC.arch}} / {{.GC.os}} / {{.GC.compiler}}\n </td></tr>\n <tr><td class=\"postblock\">\n Current Allocs\n </td><td>\n {{.GC.memory.alloc}}\n </td></tr>\n <tr><td class=\"postblock\">\n Cumulative Allocs\n </td><td>\n {{.GC.memory.calloc}}\n </td></tr>\n <tr><td class=\"postblock\">\n Used Sys Memory\n </td><td>\n {{.GC.memory.sysmem}}\n </td></tr>\n <tr><td class=\"postblock\">\n Pointer Lookups\n </td><td>\n {{.GC.memory.lookups}}\n </td></tr>\n <tr><td class=\"postblock\">\n MAllocs\n </td><td>\n {{.GC.memory.mallocs}}\n </td></tr>\n <tr><td class=\"postblock\">\n MFrees\n </td><td>\n {{.GC.memory.frees}}\n </td></tr>\n <tr><td class=\"postblock\">\n Live Objects\n </td><td>\n {{.GC.memory.liveobj}}\n </td></tr>\n <tr><td class=\"postblock\">\n Heap Allocated\n </td><td>\n {{.GC.memory.heapalloc}}\n </td></tr>\n <tr><td class=\"postblock\">\n Heap Released\n </td><td>\n {{.GC.memory.heaprelease}}\n </td></tr>\n <tr><td class=\"postblock\">\n GC Metadata\n </td><td>\n {{.GC.memory.gcmeta}}\n </td></tr>\n <tr><td class=\"postblock\">\n GC Pause\n </td><td>\n {{.GC.memory.pause}}\n </td></tr>\n <tr><td class=\"postblock\">\n GC Invokations\n </td><td>\n {{.GC.memory.gctimes}}\n </td></tr>\n <tr><td class=\"postblock\">\n GC Forced\n </td><td>\n {{.GC.memory.fgctimes}}\n </td></tr>\n <tr><td class=\"postblock\">\n GC CPU Usage\n </td><td>\n {{.GC.memory.cpufrac}}\n </td></tr>\n </tbody>\n </table>\n </form>\n</div>\n<br clear=\"left\" /><hr />\n</body>\n</html>"),
}
// define dirs
dir1 := &embedded.EmbeddedDir{
Filename: ``,
DirModTime: time.Unix(1489566364, 0),
ChildFiles: []*embedded.EmbeddedFile{
file2, // index.html
file3, // panel.html
file4, // status.html
},
}
// link ChildDirs
dir1.ChildDirs = []*embedded.EmbeddedDir{}
// register embeddedBox
embedded.RegisterEmbeddedBox(`res/`, &embedded.EmbeddedBox{
Name: `res/`,
Time: time.Unix(1489566364, 0),
Dirs: map[string]*embedded.EmbeddedDir{
"": dir1,
},
Files: map[string]*embedded.EmbeddedFile{
"index.html": file2,
"panel.html": file3,
"status.html": file4,
},
})
}
+9 -16
View File
@@ -15,16 +15,6 @@ import (
"time"
)
var riceConf = rice.Config{
LocateOrder: []rice.LocateMethod{
rice.LocateWorkingDirectory,
rice.LocateEmbedded,
rice.LocateAppended,
},
}
var box = riceConf.MustFindBox("http/board/res/")
var (
tmpls = template.New("base")
@@ -57,24 +47,27 @@ var (
}
)
func init() {
var err error
func LoadTemplates() error {
box, err := rice.FindBox("res/")
if err != nil {
return err
}
tmpls = tmpls.Funcs(hdlFMap)
tmpls, err = tmpls.New("thread/postlists").Parse(box.MustString("thread.tmpl.html"))
if err != nil {
panic(err)
return err
}
_, err = tmpls.New("board/dir").Parse(box.MustString("dir.html"))
if err != nil {
panic(err)
return err
}
_, err = tmpls.New("board/board").Parse(box.MustString("board.html"))
if err != nil {
panic(err)
return err
}
_, err = tmpls.New("board/thread").Parse(box.MustString("thread.html"))
if err != nil {
panic(err)
return err
}
}
+62
View File
@@ -0,0 +1,62 @@
package board
import (
"github.com/GeertJohan/go.rice/embedded"
"time"
)
func init() {
// define files
file2 := &embedded.EmbeddedFile{
Filename: `board.html`,
FileModTime: time.Unix(1489412682, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} - /{{.Board.ShortName}}/</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n</head>\n<body>\n<div class=\"banner logo\">\n <div class=\"site title\"><h1><span class=\"reflink\"><a href=\"/{{.Board.ShortName}}/board.html\">/{{.Board.ShortName}}/</a></span></h1></div>\n <div class=\"site description\"><h2>{{.Board.LongName}}</h2></div>\n</div>\n{{ $boardlink := .Board.ShortName }}\n{{ if .Session }}\n{{ if eq (.Session.CAttr \"mode\") \"admin\" }}\nLogged in as Admin\n{{ end }}\n{{ if eq (.Session.CAttr \"mode\") \"mod\" }}\nLogged in as Mod for {{ .Session.CAttr \"board\" }}\n{{ end }}\n{{ end }}\n<hr />\n{{ template \"thread/post\" . }}\n<div class=\"postlists\">\n {{ $board := .Board }}\n {{ $csrf := .CSRFToken }}\n {{ $session := .Session }}\n {{range .Threads}}\n {{ template \"thread/postlists\" dict \"Thread\" . \"Board\" $board \"CSRFToken\" $csrf \"Session\" $session }}\n {{end}}\n</div>\n</body>\n</html>"),
}
file3 := &embedded.EmbeddedFile{
Filename: `dir.html`,
FileModTime: time.Unix(1489315156, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} Boards</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n</head>\n<body>\n <div class=\"banner logo\">\n <div class=\"site title\"><h1>{{.Config.Site.Title}}</h1></div>\n <div class=\"site description\"><h2>{{.Config.Site.Description}}</h2></div>\n </div>\n <div class=\"boardlist\">\n <div class=\"boardtitle\">\n <h3>Boards</h3>\n </div>\n <div class=\"boardlist\">\n <ul>\n {{range .Boards}}\n <li>\n <a class=\"boardlink\" href=\"/{{ .ShortName}}/board.html\">{{.ShortName}}: {{.LongName}}</a>\n </li>\n {{end}}\n </ul>\n </div>\n </div>\n</body>\n</html>"),
}
file4 := &embedded.EmbeddedFile{
Filename: `thread.html`,
FileModTime: time.Unix(1489412660, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} - /{{.Board.ShortName}}/</title>\n <link rel=\"stylesheet\" href=\"/@/style.css\">\n <link rel=\"stylesheet\" href=\"/@/custom.css\">\n</head>\n<body>\n<div class=\"banner logo\">\n <div class=\"site title\"><h1><span class=\"reflink\"><a href=\"/{{.Board.ShortName}}/board.html\">/{{.Board.ShortName}}/</a></span></h1></div>\n <div class=\"site description\"><h2>{{.Board.LongName}}</h2></div>\n <div class=\"site thread\"><h3>{{.Thread.ID}}</h3></div>\n</div>\n{{ $boardlink := .Board.ShortName }}\n<hr />\n{{ template \"thread/post\" . }}\n{{ template \"thread/postlists\" . }}\n</body>\n</html>"),
}
file5 := &embedded.EmbeddedFile{
Filename: `thread.tmpl.html`,
FileModTime: time.Unix(1489566591, 0),
Content: string("{{ define \"thread/post\" }}\n<div class=\"postarea\">\n {{ if .Thread }}\n <form id=\"postform\"\n action=\"/{{.Board.ShortName}}/{{.Thread.ID}}/reply.sh\"\n method=\"POST\"\n enctype=\"multipart/form-data\">\n {{ else }}\n <form id=\"postform\"\n action=\"/{{.Board.ShortName}}/new_thread.sh\"\n method=\"POST\"\n enctype=\"multipart/form-data\">\n {{ end }}\n <table>\n <tbody>\n {{ if .PreviousError }}\n <tr>\n <td class=\"postblock\">\n Error\n </td>\n <td>\n {{.PreviousError}}\n </td>\n </tr>\n {{ end }}\n <tr>\n <td class=\"postblock\">\n TripCode\n </td>\n <td>\n <input type=\"text\" name=\"tripcode\" size=48 placeholder=\"Anonymous\"/>\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRFToken }}\" />\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n Comment\n </td>\n <td>\n <textarea\n name=\"text\"\n placeholder=\"your comment\"\n rows=\"4\"\n cols=\"48\"\n minlength=\"5\"\n required\n ></textarea>\n </td>\n </tr>\n <tr>\n <td class=\"postblock\">\n Image File\n </td>\n <td>\n <input type=\"file\" name=\"image\" />\n </td>\n </tr>\n {{ if ne .Config.Captcha.Mode \"disabled\" }}\n <tr>\n <td class=\"postblock\">\n Captcha\n </td>\n <td>\n {{ $captchaId := makeCaptcha }}\n <img id=\"image\" src=\"/captcha/{{$captchaId}}.png\" alt=\"Captcha Image\"/>\n <audio id=audio controls style=\"display:none\" src=\"/captcha/{{$captchaId}}.wav\" preload=none>\n You browser doesn't support audio.\n <a href=\"/captcha/download/{{$captchaId}}.wav\">Download file</a> to play it in the external player.\n </audio>\n <br>\n <input type=\"text\" name=\"captchaSolution\" size=48 />\n <input type=\"hidden\"\n name=\"captchaId\"\n value=\"{{$captchaId}}\"/>\n </td>\n </tr>\n {{ end }}\n {{ if (isModSession .Session) }}\n <tr>\n <td class=\"postblock\">\n Mod Post\n </td>\n <td>\n <label>\n <input type=\"checkbox\" name=\"modpost\"/>Mark as Mod Post\n </label>\n {{ if (isAdminSession .Session) }}\n <label>\n <input type=\"checkbox\" name=\"adminpost\"/>Mark as Admin Post\n </label>\n {{ end }}\n </td>\n </tr>\n {{ end }}\n <tr>\n <td class=\"postblock\">\n\n </td>\n <td>\n <input type=\"submit\" value=\"Post\" />\n </td>\n </tr>\n {{ if .Board.Metadata.rules }}\n <tr>\n <td class=\"postblock\">\n Rules\n </td>\n <td class=\"rules\">\n {{ renderText .Board.Metadata.rules }}\n </td>\n </tr>\n {{ end }}\n </tbody>\n </table>\n </form>\n</div>\n<hr />\n{{ end }}\n\n{{ define \"thread/reply\" }}\n <label><span class=\"postertrip\">\n {{ if .Reply.Metadata.trip }}\n {{ .Reply.Metadata.trip}}\n {{ else }}\n Anonymous\n {{ end }}\n {{ if .Reply.Metadata.modpost }}\n (Mod)\n {{ end }}\n {{ if .Reply.Metadata.adminpost }}\n [Admin]\n {{ end }}\n </span></label>\n <span class=\"date\">{{dateFromID .Reply.ID | formatDate}}</span>\n {{ if .Session }}\n {{ if eq (.Session.CAttr \"mode\") \"admin\" }}\n <form class=\"delform\" action=\"/mod/del_reply.sh\" method=\"POST\">\n <input\n type=\"hidden\"\n name=\"csrf_token\"\n value=\"{{ .CSRF }}\" />\n <input\n Line truncated
}
// define dirs
dir1 := &embedded.EmbeddedDir{
Filename: ``,
DirModTime: time.Unix(1489566591, 0),
ChildFiles: []*embedded.EmbeddedFile{
file2, // board.html
file3, // dir.html
file4, // thread.html
file5, // thread.tmpl.html
},
}
// link ChildDirs
dir1.ChildDirs = []*embedded.EmbeddedDir{}
// register embeddedBox
embedded.RegisterEmbeddedBox(`res/`, &embedded.EmbeddedBox{
Name: `res/`,
Time: time.Unix(1489566591, 0),
Dirs: map[string]*embedded.EmbeddedDir{
"": dir1,
},
Files: map[string]*embedded.EmbeddedFile{
"board.html": file2,
"dir.html": file3,
"thread.html": file4,
"thread.tmpl.html": file5,
},
})
}
+7 -13
View File
@@ -9,26 +9,20 @@ import (
"net/http"
)
var riceConf = rice.Config{
LocateOrder: []rice.LocateMethod{
rice.LocateWorkingDirectory,
rice.LocateEmbedded,
rice.LocateAppended,
},
}
var box = riceConf.MustFindBox("http/errw/res/")
var (
errorTmpl = template.New("errw/error")
)
func init() {
var err error
func LoadTemplates() error {
box, err := rice.FindBox("res/")
if err != nil {
return err
}
errorTmpl, err = errorTmpl.Parse(box.MustString("error.html"))
if err != nil {
panic(err)
return err
}
return nil
}
type ErrorWithTitle interface {
+41
View File
@@ -0,0 +1,41 @@
package errw
import (
"github.com/GeertJohan/go.rice/embedded"
"time"
)
func init() {
// define files
file2 := &embedded.EmbeddedFile{
Filename: `error.html`,
FileModTime: time.Unix(1489238440, 0),
Content: string("<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{.Config.Site.Title}} Admin Login</title>\n <style>\n div.error {\n border: 1px solid black;\n width: 500px;\n margin: auto;\n margin-top: 100px;\n }\n div.error h1 {\n margin-bottom: 0px;\n text-align: center;\n }\n div.error h2 {\n text-align: center;\n }\n div.error h3 {\n margin-top: 0px;\n text-align: center;\n color: #888;\n }\n </style>\n</head>\n<body>\n<div class=\"error\">\n <h1>{{.Error.Title}}</h1><br/>\n <h3>{{.Error.Code}}</h3><br/>\n <h2>{{.Error.Description}}</h2>\n</div>\n</body>\n</html>"),
}
// define dirs
dir1 := &embedded.EmbeddedDir{
Filename: ``,
DirModTime: time.Unix(1489240168, 0),
ChildFiles: []*embedded.EmbeddedFile{
file2, // error.html
},
}
// link ChildDirs
dir1.ChildDirs = []*embedded.EmbeddedDir{}
// register embeddedBox
embedded.RegisterEmbeddedBox(`res/`, &embedded.EmbeddedBox{
Name: `res/`,
Time: time.Unix(1489240168, 0),
Dirs: map[string]*embedded.EmbeddedDir{
"": dir1,
},
Files: map[string]*embedded.EmbeddedFile{
"error.html": file2,
},
})
}
+55
View File
@@ -0,0 +1,55 @@
package http
import (
"github.com/GeertJohan/go.rice/embedded"
"time"
)
func init() {
// define files
file2 := &embedded.EmbeddedFile{
Filename: `admin.css`,
FileModTime: time.Unix(1489250860, 0),
Content: string("/* CUSTOM CSS */\ndiv.admin.login {\n border: 1px solid black;\n width: 500px;\n margin: auto;\n margin-top: 100px;\n}\n.admin.form.row {\n margin: auto;\n padding: 5px;\n width: 90%;\n height: 22px;\n left: 0;\n right: 0;\n display: flex;\n}\n.admin.form.input {\n font-family: \"monospace\";\n width: 100%;\n height: 100%;\n padding: 2px;\n display: inline;\n}\n.admin.form.input.halfsize {\n width: 50%;\n}"),
}
file3 := &embedded.EmbeddedFile{
Filename: `custom.css`,
FileModTime: time.Unix(1489426703, 0),
Content: string("h1 {\n font-size: 32px;\n}\n\nh2 {\n font-size: 24px;\n}\n\nh3 {\n font-size: 16px;\n}\n\ndiv {\n display: block;\n margin: 0;\n padding: 0;\n}\n\nblockquote blockquote {\n word-wrap: break-word;\n word-break: break-all;\n white-space: normal;\n padding: 2px;\n margin-bottom: 1em;\n margin-top: 1em;\n margin-left: 40px;\n margin-right: 40px;\n}\n\n\n.delform {\n display: inline;\n margin: 0;\n padding: 0;\n}\n.delform input {\n display: inline;\n}\n\n.deleted {\n color: #707070;\n}\n\n.reply-table {\n display: block;\n}\n\n.reply {\n display: table;\n}"),
}
file4 := &embedded.EmbeddedFile{
Filename: `style.css`,
FileModTime: time.Unix(1489426859, 0),
Content: string("/* The following CSS is mostly taken from Wakaba, big thanks for the devs there! <3 */\n\nhtml, body {\n background:#FFFFEE;\n color:#800000;\n}\na {\n color:#0000EE;\n}\na:hover {\n color:#DD0000;\n}\n.adminbar {\n text-align:right;\n clear:both;\n float:right;\n}\n.logo {\n clear:both;\n text-align:center;\n font-size:2em;\n color:#800000;\n width:100%;\n}\n.theader {\n background:#E04000;\n text-align:center;\n padding:2px;\n color:#FFFFFF;\n width:100%;\n}\n.postarea {\n}\n.rules {\n font-size:0.7em;\n}\n.postblock {\n background:#EEAA88;\n color:#800000;\n font-weight:800;\n}\n.footer {\n text-align:center;\n font-size:12px;\n font-family:serif;\n}\n.passvalid {\n background:#EEAA88;\n text-align:center;\n width:100%;\n color:#ffffff;\n}\n.dellist {\n font-weight: bold;\n text-align:center;\n}\n.delbuttons {\n text-align:center;\n padding-bottom:4px;\n\n}\n.managehead {\n background:#AAAA66;\n color:#400000;\n padding:0px;\n}\n.postlists {\n background:#FFFFFF;\n width:100%;\n padding:0px;\n color:#800000;\n}\n.row1 {\n background:#EEEECC;\n color:#800000;\n}\n.row2 {\n background:#DDDDAA;\n color:#800000;\n}\n.unkfunc {\n background:inert;\n color:#789922;\n}\n.filesize {\n text-decoration:none;\n}\n.filetitle {\n background:inherit;\n font-size:1.2em;\n color:#CC1105;\n font-weight:800;\n}\n.postername {\n color:#117743;\n font-weight:bold;\n}\n.postertrip {\n color:#228854;\n}\n.oldpost {\n color:#CC1105;\n font-weight:800;\n}\n.omittedposts {\n color:#707070;\n}\n.reply {\n background:#F0E0D6;\n color:#800000;\n}\n.doubledash {\n vertical-align:top;\n clear:both;\n float:left;\n}\n.replytitle {\n font-size: 1.2em;\n color:#CC1105;\n font-weight:800;\n}\n.commentpostername {\n color:#117743;\n font-weight:800;\n}\n.thumbnailmsg {\n font-size: small;\n color:#800000;\n}\n\n\n\n.abbrev {\n color:#707070;\n}\n.highlight {\n background:#F0E0D6;\n color:#800000;\n border: 2px dashed #EEAA88;\n}\n\n/* From pl files */\n\n/* futaba_style.pl */\n\nform { margin-bottom: 0px }\nform .trap { display:none }\n.postarea { text-align: center }\n.postarea table { margin: 0px auto; text-align: left }\n.thumb { border: none; float: left; margin: 2px 20px }\n.nothumb { float: left; background: #eee; border: 2px dashed #aaa; text-align: center; margin: 2px 20px; padding: 1em 0.5em 1em 0.5em; }\n\n.reflink a { color: inherit; text-decoration: none }\n.reply .filesize { margin-left: 20px }\n.userdelete { float: right; text-align: center; white-space: nowrap }\n.replypage .replylink { display: none }"),
}
// define dirs
dir1 := &embedded.EmbeddedDir{
Filename: ``,
DirModTime: time.Unix(1489426859, 0),
ChildFiles: []*embedded.EmbeddedFile{
file2, // admin.css
file3, // custom.css
file4, // style.css
},
}
// link ChildDirs
dir1.ChildDirs = []*embedded.EmbeddedDir{}
// register embeddedBox
embedded.RegisterEmbeddedBox(`res/`, &embedded.EmbeddedBox{
Name: `res/`,
Time: time.Unix(1489426859, 0),
Dirs: map[string]*embedded.EmbeddedDir{
"": dir1,
},
Files: map[string]*embedded.EmbeddedFile{
"admin.css": file2,
"custom.css": file3,
"style.css": file4,
},
})
}
+20 -3
View File
@@ -8,6 +8,7 @@ import (
"go.rls.moe/nyx/config"
"go.rls.moe/nyx/http/admin"
"go.rls.moe/nyx/http/board"
"go.rls.moe/nyx/http/errw"
"go.rls.moe/nyx/http/middle"
"net/http"
"time"
@@ -21,7 +22,20 @@ var riceConf = rice.Config{
},
}
func Start(config *config.Config) {
func Start(config *config.Config) error {
err := admin.LoadTemplates()
if err != nil {
return err
}
err = board.LoadTemplates()
if err != nil {
return err
}
err = errw.LoadTemplates()
if err != nil {
return err
}
r := chi.NewRouter()
fmt.Println("Setting up Router")
@@ -37,7 +51,7 @@ func Start(config *config.Config) {
{
mw, err := middle.Database(config)
if err != nil {
panic(err)
return err
}
r.Use(mw)
}
@@ -45,7 +59,10 @@ func Start(config *config.Config) {
r.Route("/admin/", admin.AdminRouter)
r.Route("/mod/", admin.ModRouter)
{
box := riceConf.MustFindBox("http/res")
box, err := rice.FindBox("res/")
if err != nil {
return err
}
atFileServer := http.StripPrefix("/@/", http.FileServer(box.HTTPBox()))
r.Mount("/@/", atFileServer)
}