Fixed the Go Version in the Travis file.

Added the Go and Database versions to the Control Panel Debug Page.
Renamed common.TopicsPage to common.TopicListPage.
Renamed *HeaderVars to *Header.
Added the Paginator struct and refactored the code to use it.
io.Writers are now used instead of http.ResponseWriters in transpiled templates for greater flexibility.
Added the alert, menu_alerts, and menu_item templates.
Added support for more integer types in the arithmetic functions for the transpiled templates.
Exported AccSelectBuilder.
Added an Each method to AccSelectBuilder.
Added column quoting to the order by portions of queries for the MySQL Adapter.

Began work on the client side rendering of alerts.
Began work on the Menu Manager and associated functionality.
This commit is contained in:
Azareal 2018-04-22 13:33:56 +01:00
parent 55a0c31bc3
commit 10f4c59cb5
72 changed files with 1869 additions and 1373 deletions

View File

@ -1,6 +1,6 @@
language: go
go:
- 1.10
- "1.10"
- master
before_install:
- cd $HOME

View File

@ -49,11 +49,6 @@ It's entirely possible that your host might already have MySQL, so you might be
At some point, we'll have releases which you can download, but right now, you'll have to use the `git clone` command as mentioned down in the advanced setup section to download a copy of Gosora.
# Updating
The update system is currently under development, however if you have Git installed, then you can run `dev-update.bat` or `dev-update-linux` to update your instance to the latest commit and to update the associated database schema, etc.
# Installation Instructions
*Linux*
@ -96,9 +91,9 @@ Several important features for saving memory in the templates system may have to
# Advanced Installation
An example of running the commands directly on Windows. We're looking into reducing the number of commands you need to type, for instance, you could invoke the update-deps batch or shell files to install / update all of the dependencies instead of typing each `get get -u`
This section explains how to set things up without running the batch or shell files. For Windows, you will likely have to open up cmd.exe (the app called Command Prompt in Win10) to run these commands inside or something similar, while with Linux you would likely use the Terminal or console.
Linux is similar, however you might need to use cd and mv a bit more like in the shell files due to the differences in go build across platforms. Additionally, Linux doesn't require `StackExchange/wmi` or ``/x/sys/windows`
Linux is similar, however you might need to use cd and mv a bit more like in the shell files due to the differences in go build across platforms. Additionally, Linux doesn't require `StackExchange/wmi` or `/x/sys/windows`
You also need to substitute the `gosora.exe` bits for `./Gosora` on Linux. For more info, you might want to take a gander inside the `./run-linux` and `./install-linux` shell files to see how they're implemented.
@ -154,6 +149,13 @@ gosora.exe
I'm looking into minimising the number of go gets for the advanced build and to maybe remove the platform and database engine specific dependencies if possible for those who don't need them.
# Updating
The update system is currently under development, however if you have Git installed, then you can run `dev-update.bat` or `dev-update-linux` to update your instance to the latest commit and to update the associated database schema, etc.
In addition to this, you can update the dependencies without updating Gosora by running `update-deps.bat` or `./update-deps-linux` (.bat is for Windows, the other for Linux as the names would suggest).
# How do I install plugins?
For the default plugins like Markdown and Helloworld, you can find them in the Plugin Manager of your Control Panel. For ones which aren't included by default, you will need to drag them from your /extend/ directory and into the / directory (the root directory of your Gosora installation, where the executable and most of the main Go files are).

View File

@ -1,7 +1,10 @@
package main
import (
"bytes"
"../common"
"../tmpl_gen/client"
"github.com/gopherjs/gopherjs/js"
)
@ -13,4 +16,14 @@ func main() {
}
return ""
})
js.Global.Set("renderAlert", func(asid int, path string, msg string, avatar string) string {
var buf bytes.Buffer
alertItem := common.AlertItem{asid, path, msg, avatar}
err := tmpl.Template_alert(alertItem, &buf)
if err != nil {
println(err.Error())
}
return string(buf.Bytes())
})
}

View File

@ -8,7 +8,7 @@ import (
)
// TODO: Use the error_buffer variable to construct the system log in the Control Panel. Should we log errors caused by users too? Or just collect statistics on those or do nothing? Intercept recover()? Could we intercept the logger instead here? We might get too much information, if we intercept the logger, maybe make it part of the Debug page?
// ? - Should we pass HeaderVars / HeaderLite rather than forcing the errors to pull the global HeaderVars instance?
// ? - Should we pass Header / HeaderLite rather than forcing the errors to pull the global Header instance?
var errorBufferMutex sync.RWMutex
var errorBuffer []error
@ -77,7 +77,7 @@ func LogWarning(err error) {
// InternalError is the main function for handling internal errors, while simultaneously printing out a page for the end-user to let them know that *something* has gone wrong
// ? - Add a user parameter?
func InternalError(err error, w http.ResponseWriter, r *http.Request) RouteError {
pi := Page{"Internal Server Error", GuestUser, DefaultHeaderVar(), tList, "A problem has occurred in the system."}
pi := Page{"Internal Server Error", GuestUser, DefaultHeader(w), tList, "A problem has occurred in the system."}
handleErrorTemplate(w, r, pi)
LogError(err)
return HandledRouteError()
@ -122,9 +122,8 @@ func SilentInternalErrorXML(err error, w http.ResponseWriter, r *http.Request) R
}
func PreError(errmsg string, w http.ResponseWriter, r *http.Request) RouteError {
//LogError(errors.New(errmsg))
w.WriteHeader(500)
pi := Page{"Error", GuestUser, DefaultHeaderVar(), tList, errmsg}
pi := Page{"Error", GuestUser, DefaultHeader(w), tList, errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -144,9 +143,8 @@ func PreErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, isJs boo
// LocalError is an error shown to the end-user when something goes wrong and it's not the software's fault
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
//LogError(errors.New(errmsg))
w.WriteHeader(500)
pi := Page{"Local Error", user, DefaultHeaderVar(), tList, errmsg}
pi := Page{"Local Error", user, DefaultHeader(w), tList, errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -168,7 +166,7 @@ func LocalErrorJS(errmsg string, w http.ResponseWriter, r *http.Request) RouteEr
// NoPermissions is an error shown to the end-user when they try to access an area which they aren't authorised to access
func NoPermissions(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := Page{"Local Error", user, DefaultHeaderVar(), tList, "You don't have permission to do that."}
pi := Page{"Local Error", user, DefaultHeader(w), tList, "You don't have permission to do that."}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -189,7 +187,7 @@ func NoPermissionsJS(w http.ResponseWriter, r *http.Request, user User) RouteErr
// ? - Is this actually used? Should it be used? A ban in Gosora should be more of a permission revocation to stop them posting rather than something which spits up an error page, right?
func Banned(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := Page{"Banned", user, DefaultHeaderVar(), tList, "You have been banned from this site."}
pi := Page{"Banned", user, DefaultHeader(w), tList, "You have been banned from this site."}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -221,7 +219,7 @@ func LoginRequiredJSQ(w http.ResponseWriter, r *http.Request, user User, isJs bo
// LoginRequired is an error shown to the end-user when they try to access an area which requires them to login
func LoginRequired(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(401)
pi := Page{"Local Error", user, DefaultHeaderVar(), tList, "You need to login to do that."}
pi := Page{"Local Error", user, DefaultHeader(w), tList, "You need to login to do that."}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -237,7 +235,7 @@ func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user User) RouteErr
// ? - Should we add JS and JSQ versions of this?
func SecurityError(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := Page{"Security Error", user, DefaultHeaderVar(), tList, "There was a security issue with your request."}
pi := Page{"Security Error", user, DefaultHeader(w), tList, "There was a security issue with your request."}
if RunPreRenderHook("pre_render_security_error", w, r, &user, &pi) {
return nil
}
@ -251,28 +249,28 @@ func SecurityError(w http.ResponseWriter, r *http.Request, user User) RouteError
// NotFound is used when the requested page doesn't exist
// ? - Add a JSQ and JS version of this?
// ? - Add a user parameter?
func NotFound(w http.ResponseWriter, r *http.Request, headerVars *HeaderVars) RouteError {
return CustomError("The requested page doesn't exist.", 404, "Not Found", w, r, headerVars, GuestUser)
func NotFound(w http.ResponseWriter, r *http.Request, header *Header) RouteError {
return CustomError("The requested page doesn't exist.", 404, "Not Found", w, r, header, GuestUser)
}
// CustomError lets us make custom error types which aren't covered by the generic functions above
func CustomError(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, headerVars *HeaderVars, user User) RouteError {
if headerVars == nil {
headerVars = DefaultHeaderVar()
func CustomError(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, header *Header, user User) RouteError {
if header == nil {
header = DefaultHeader(w)
}
w.WriteHeader(errcode)
pi := Page{errtitle, user, headerVars, tList, errmsg}
pi := Page{errtitle, user, header, tList, errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
// CustomErrorJSQ is a version of CustomError which lets us handle both JSON and regular pages depending on how it's being accessed
func CustomErrorJSQ(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, headerVars *HeaderVars, user User, isJs bool) RouteError {
func CustomErrorJSQ(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, header *Header, user User, isJs bool) RouteError {
if !isJs {
if headerVars == nil {
headerVars = DefaultHeaderVar()
if header == nil {
header = DefaultHeader(w)
}
return CustomError(errmsg, errcode, errtitle, w, r, headerVars, user)
return CustomError(errmsg, errcode, errtitle, w, r, header, user)
}
return CustomErrorJS(errmsg, errcode, w, r, user)
}
@ -285,9 +283,8 @@ func CustomErrorJS(errmsg string, errcode int, w http.ResponseWriter, r *http.Re
}
func handleErrorTemplate(w http.ResponseWriter, r *http.Request, pi Page) {
//LogError(errors.New("error happened"))
// TODO: What to do about this hook?
if RunPreRenderHook("pre_render_error", w, r, &pi.CurrentUser, &pi) {
if RunPreRenderHook("pre_render_error", w, r, &pi.Header.CurrentUser, &pi) {
return
}
err := RunThemeTemplate(pi.Header.Theme.Name, "error", pi, w)

View File

@ -62,7 +62,7 @@ type Message interface {
// While the idea is nice, this might result in too much code duplication, as we have seventy billion page structs, what else could we do to get static typing with these in plugins?
type PageInt interface {
Title() string
HeaderVars() *HeaderVars
Header() *Header
CurrentUser() *User
GetExtData(name string) interface{}
SetExtData(name string, contents interface{})

408
common/menus.go Normal file
View File

@ -0,0 +1,408 @@
package common
import (
"bytes"
"database/sql"
"fmt"
"io"
"io/ioutil"
"strconv"
"sync/atomic"
"../query_gen/lib"
)
var Menus *DefaultMenuStore
type MenuItemList []MenuItem
type DefaultMenuStore struct {
menus map[int]*atomic.Value
}
func NewDefaultMenuStore() *DefaultMenuStore {
return &DefaultMenuStore{make(map[int]*atomic.Value)}
}
func (store *DefaultMenuStore) Get(mid int) *MenuListHolder {
aStore, ok := store.menus[mid]
if ok {
return aStore.Load().(*MenuListHolder)
}
return nil
}
type MenuListHolder struct {
List MenuItemList
Variations map[int]menuTmpl // 0 = Guest Menu, 1 = Member Menu, 2 = Super Mod Menu, 3 = Admin Menu
}
type menuTmpl struct {
RenderBuffer [][]byte
VariableIndices []int
}
type MenuItem struct {
ID int
HTMLID string
CSSClass string
Position string
Path string
Aria string
Tooltip string
Order int
TmplName string
GuestOnly bool
MemberOnly bool
SuperModOnly bool
AdminOnly bool
}
func (store *DefaultMenuStore) Load(mid int) error {
var mlist MenuItemList
acc := qgen.Builder.Accumulator()
err := acc.Select("menu_items").Columns("htmlID, cssClass, position, path, aria, tooltip, order, tmplName, guestOnly, memberOnly, staffOnly, adminOnly").Where("mid = " + strconv.Itoa(mid)).Orderby("order ASC").Each(func(rows *sql.Rows) error {
var mitem = MenuItem{ID: 1}
err := rows.Scan(&mitem.HTMLID, &mitem.CSSClass, &mitem.Position, &mitem.Path, &mitem.Aria, &mitem.Tooltip, &mitem.Order, &mitem.TmplName, &mitem.GuestOnly, &mitem.MemberOnly, &mitem.SuperModOnly, &mitem.AdminOnly)
if err != nil {
return err
}
mlist = append(mlist, mitem)
return nil
})
if err != nil {
return err
}
hold := &MenuListHolder{mlist, make(map[int]menuTmpl)}
err = hold.Preparse()
if err != nil {
return err
}
var aStore = &atomic.Value{}
aStore.Store(hold)
store.menus[mid] = aStore
return nil
}
// TODO: Run this in main, sync ticks, when the phrase file changes (need to implement the sync for that first), and when the settings are changed
func (hold *MenuListHolder) Preparse() error {
var tmpls = make(map[string]MenuTmpl)
var loadTmpl = func(name string) error {
data, err := ioutil.ReadFile("./templates/" + name + ".html")
if err != nil {
return err
}
tmpls[name] = hold.Parse(name, data)
return nil
}
err := loadTmpl("menu_item")
if err != nil {
return err
}
err = loadTmpl("menu_alerts")
if err != nil {
return err
}
var addVariation = func(index int, callback func(mitem MenuItem) bool) {
renderBuffer, variableIndices := hold.Scan(tmpls, callback)
hold.Variations[index] = menuTmpl{renderBuffer, variableIndices}
fmt.Print("renderBuffer: ")
menuDumpSlice(renderBuffer)
fmt.Printf("\nvariableIndices: %+v\n", variableIndices)
}
// Guest Menu
addVariation(0, func(mitem MenuItem) bool {
return !mitem.MemberOnly
})
// Member Menu
addVariation(1, func(mitem MenuItem) bool {
return !mitem.SuperModOnly && !mitem.GuestOnly
})
// Super Mod Menu
addVariation(2, func(mitem MenuItem) bool {
return !mitem.AdminOnly && !mitem.GuestOnly
})
// Admin Menu
addVariation(3, func(mitem MenuItem) bool {
return !mitem.GuestOnly
})
return nil
}
func nextCharIs(tmplData []byte, i int, expects byte) bool {
if len(tmplData) <= (i + 1) {
return false
}
return tmplData[i+1] == expects
}
func skipUntilIfExists(tmplData []byte, i int, expects byte) (newI int, hasIt bool) {
j := i
for ; j < len(tmplData); j++ {
if tmplData[j] == expects {
return j, true
}
}
return j, false
}
func skipUntilCharsExist(tmplData []byte, i int, expects []byte) (newI int, hasIt bool) {
j := i
expectIndex := 0
for ; j < len(tmplData) && expectIndex < len(expects); j++ {
if tmplData[j] != expects[expectIndex] {
return j, false
}
expectIndex++
}
return j, true
}
type menuRenderItem struct {
Type int // 0: text, 1: variable
Index int
}
type MenuTmpl struct {
Name string
TextBuffer [][]byte
VariableBuffer [][]byte
RenderList []menuRenderItem
}
func menuDumpSlice(outerSlice [][]byte) {
for sliceID, slice := range outerSlice {
fmt.Print(strconv.Itoa(sliceID) + ":[")
for _, char := range slice {
fmt.Print(string(char))
}
fmt.Print("] ")
}
}
func (hold *MenuListHolder) Parse(name string, tmplData []byte) (menuTmpl MenuTmpl) {
//fmt.Println("tmplData: ", string(tmplData))
var textBuffer, variableBuffer [][]byte
var renderList []menuRenderItem
var subBuffer []byte
// ? We only support simple properties on MenuItem right now
var addVariable = func(name []byte) {
//fmt.Println("appending subBuffer: ", string(subBuffer))
textBuffer = append(textBuffer, subBuffer)
subBuffer = nil
//fmt.Println("adding variable: ", string(name))
variableBuffer = append(variableBuffer, name)
renderList = append(renderList, menuRenderItem{0, len(textBuffer) - 1})
renderList = append(renderList, menuRenderItem{1, len(variableBuffer) - 1})
}
for i := 0; i < len(tmplData); i++ {
char := tmplData[i]
if char == '{' && nextCharIs(tmplData, i, '{') {
dotIndex, hasDot := skipUntilIfExists(tmplData, i, '.')
if !hasDot {
// Template function style
langIndex, hasChars := skipUntilCharsExist(tmplData, i+2, []byte("lang"))
if hasChars {
startIndex, hasStart := skipUntilIfExists(tmplData, langIndex, '"')
endIndex, hasEnd := skipUntilIfExists(tmplData, startIndex+1, '"')
if hasStart && hasEnd {
fenceIndex, hasFence := skipUntilIfExists(tmplData, endIndex, '}')
if !hasFence || !nextCharIs(tmplData, fenceIndex, '}') {
break
}
//fmt.Println("tmplData[startIndex:endIndex]: ", tmplData[startIndex+1:endIndex])
prefix := []byte("lang.")
addVariable(append(prefix, tmplData[startIndex+1:endIndex]...))
i = fenceIndex + 1
continue
}
}
break
}
fenceIndex, hasFence := skipUntilIfExists(tmplData, dotIndex, '}')
if !hasFence || !nextCharIs(tmplData, fenceIndex, '}') {
break
}
addVariable(tmplData[dotIndex:fenceIndex])
i = fenceIndex + 1
continue
}
subBuffer = append(subBuffer, char)
}
if len(subBuffer) > 0 {
// TODO: Have a property in renderList which holds the byte slice since variableBuffers and textBuffers have the same underlying implementation?
textBuffer = append(textBuffer, subBuffer)
renderList = append(renderList, menuRenderItem{0, len(textBuffer) - 1})
}
fmt.Println("name: ", name)
fmt.Print("textBuffer: ")
menuDumpSlice(textBuffer)
fmt.Print("\nvariableBuffer: ")
menuDumpSlice(variableBuffer)
fmt.Printf("\nrenderList: %+v\n", renderList)
return MenuTmpl{name, textBuffer, variableBuffer, renderList}
}
func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mitem MenuItem) bool) (renderBuffer [][]byte, variableIndices []int) {
for _, mitem := range hold.List {
// Do we want this item in this variation of the menu?
if !showItem(mitem) {
continue
}
menuTmpl, ok := menuTmpls[mitem.TmplName]
if !ok {
menuTmpl = menuTmpls["menu_item"]
}
fmt.Println("menuTmpl: ", menuTmpl)
for _, renderItem := range menuTmpl.RenderList {
if renderItem.Type == 0 {
renderBuffer = append(renderBuffer, menuTmpl.TextBuffer[renderItem.Index])
continue
}
variable := menuTmpl.VariableBuffer[renderItem.Index]
fmt.Println("initial variable: ", string(variable))
dotAt, hasDot := skipUntilIfExists(variable, 0, '.')
if !hasDot {
fmt.Println("no dot")
continue
}
if bytes.Equal(variable[:dotAt], []byte("lang")) {
fmt.Println("lang: ", string(bytes.TrimPrefix(variable[dotAt:], []byte("."))))
renderBuffer = append(renderBuffer, []byte(GetTmplPhrase(string(bytes.TrimPrefix(variable[dotAt:], []byte("."))))))
} else {
var renderItem []byte
switch string(variable) {
case ".HTMLID":
renderItem = []byte(mitem.HTMLID)
case ".CSSClass":
renderItem = []byte(mitem.CSSClass)
case ".Position":
renderItem = []byte(mitem.Position)
case ".Path":
renderItem = []byte(mitem.Path)
case ".Aria":
renderItem = []byte(mitem.Aria)
case ".Tooltip":
renderItem = []byte(mitem.Tooltip)
}
_, hasInnerVar := skipUntilIfExists(renderItem, 0, '{')
if hasInnerVar {
fmt.Println("inner var: ", string(renderItem))
dotAt, hasDot := skipUntilIfExists(renderItem, 0, '.')
endFence, hasEndFence := skipUntilIfExists(renderItem, dotAt, '}')
if !hasDot || !hasEndFence || (endFence-dotAt) <= 1 {
renderBuffer = append(renderBuffer, renderItem)
variableIndices = append(variableIndices, len(renderBuffer)-1)
continue
}
if bytes.Equal(renderItem[1:dotAt], []byte("lang")) {
fmt.Println("lang var: ", string(renderItem[dotAt+1:endFence]))
renderBuffer = append(renderBuffer, []byte(GetTmplPhrase(string(renderItem[dotAt+1:endFence]))))
} else {
fmt.Println("other var: ", string(variable[:dotAt]))
if len(renderItem) > 0 {
renderBuffer = append(renderBuffer, renderItem)
variableIndices = append(variableIndices, len(renderBuffer)-1)
}
}
continue
}
fmt.Println("normal var: ", string(variable[:dotAt]))
if len(renderItem) > 0 {
renderBuffer = append(renderBuffer, renderItem)
}
}
}
}
// TODO: Need more coalescing in the renderBuffer
return renderBuffer, variableIndices
}
// TODO: Pre-render the lang stuff
func (hold *MenuListHolder) Build(w io.Writer, user *User) error {
var mTmpl menuTmpl
if !user.Loggedin {
mTmpl = hold.Variations[0]
} else if user.IsAdmin {
mTmpl = hold.Variations[3]
} else if user.IsSuperMod {
mTmpl = hold.Variations[2]
} else {
mTmpl = hold.Variations[1]
}
if len(mTmpl.VariableIndices) == 0 {
fmt.Println("no variable indices")
for _, renderItem := range mTmpl.RenderBuffer {
fmt.Printf("renderItem: %+v\n", renderItem)
w.Write(renderItem)
}
return nil
}
var nearIndex = 0
for index, renderItem := range mTmpl.RenderBuffer {
if index != mTmpl.VariableIndices[nearIndex] {
fmt.Println("wrote text: ", string(renderItem))
w.Write(renderItem)
continue
}
fmt.Println("variable: ", string(renderItem))
variable := renderItem
// ? - I can probably remove this check now that I've kicked it upstream, or we could keep it here for safety's sake?
if len(variable) == 0 {
continue
}
prevIndex := 0
for i := 0; i < len(renderItem); i++ {
fenceStart, hasFence := skipUntilIfExists(variable, i, '{')
if !hasFence {
continue
}
i = fenceStart
fenceEnd, hasFence := skipUntilIfExists(variable, fenceStart, '}')
if !hasFence {
continue
}
i = fenceEnd
dotAt, hasDot := skipUntilIfExists(variable, fenceStart, '.')
if !hasDot {
continue
}
if bytes.Equal(variable[fenceStart:dotAt], []byte("me")) {
fmt.Println("maybe me variable")
w.Write(variable[prevIndex:fenceStart])
switch string(variable[dotAt:fenceEnd]) {
case "Link":
w.Write([]byte(user.Link))
case "Session":
w.Write([]byte(user.Session))
}
prevIndex = fenceEnd
}
}
fmt.Println("prevIndex: ", prevIndex)
fmt.Println("len(variable)-1: ", len(variable)-1)
w.Write(variable[prevIndex : len(variable)-1])
if len(mTmpl.VariableIndices) > (nearIndex + 1) {
nearIndex++
}
}
return nil
}

View File

@ -9,7 +9,8 @@ import (
// TODO: Allow resources in spots other than /static/ and possibly even external domains (e.g. CDNs)
// TODO: Preload Trumboyg on Cosora on the forum list
type HeaderVars struct {
type Header struct {
Title string
NoticeList []string
Scripts []string
//PreloadScripts []string
@ -20,21 +21,22 @@ type HeaderVars struct {
Themes map[string]*Theme // TODO: Use a slice containing every theme instead of the main map for speed?
Theme *Theme
//TemplateName string // TODO: Use this to move template calls to the router rather than duplicating them over and over and over?
CurrentUser User // TODO: Deprecate CurrentUser on the page structs
Zone string
MetaDesc string
Writer http.ResponseWriter
ExtData ExtData
}
func (header *HeaderVars) AddScript(name string) {
func (header *Header) AddScript(name string) {
header.Scripts = append(header.Scripts, name)
}
/*func (header *HeaderVars) PreloadScript(name string) {
/*func (header *Header) PreloadScript(name string) {
header.PreloadScripts = append(header.PreloadScripts, name)
}*/
func (header *HeaderVars) AddSheet(name string) {
func (header *Header) AddSheet(name string) {
header.Stylesheets = append(header.Stylesheets, name)
}
@ -57,18 +59,31 @@ type ExtData struct {
sync.RWMutex
}
type AlertItem struct {
ASID int
Path string
Message string
Avatar string
}
type Page struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []interface{}
Something interface{}
}
type Paginator struct {
PageList []int
Page int
LastPage int
}
type TopicPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []ReplyUser
Topic TopicUser
Poll Poll
@ -76,40 +91,34 @@ type TopicPage struct {
LastPage int
}
type TopicsPage struct {
Title string
CurrentUser User
Header *HeaderVars
type TopicListPage struct {
*Header
TopicList []*TopicsRow
ForumList []Forum
DefaultForum int
PageList []int
Page int
LastPage int
Paginator
}
type ForumPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []*TopicsRow
Forum *Forum
PageList []int
Page int
LastPage int
Paginator
}
type ForumsPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []Forum
}
type ProfilePage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []ReplyUser
ProfileOwner User
}
@ -117,7 +126,7 @@ type ProfilePage struct {
type CreateTopicPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList []Forum
FID int
}
@ -125,7 +134,7 @@ type CreateTopicPage struct {
type IPSearchPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
ItemList map[int]*User
IP string
}
@ -143,7 +152,7 @@ type PanelStats struct {
type PanelPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ItemList []interface{}
@ -163,7 +172,7 @@ type GridElement struct {
type PanelDashboardPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
GridItems []GridElement
@ -182,7 +191,7 @@ type PanelAnalyticsItem struct {
type PanelAnalyticsPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
PrimaryGraph PanelTimeGraph
@ -198,7 +207,7 @@ type PanelAnalyticsRoutesItem struct {
type PanelAnalyticsRoutesPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ItemList []PanelAnalyticsRoutesItem
@ -214,7 +223,7 @@ type PanelAnalyticsAgentsItem struct {
type PanelAnalyticsAgentsPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ItemList []PanelAnalyticsAgentsItem
@ -224,7 +233,7 @@ type PanelAnalyticsAgentsPage struct {
type PanelAnalyticsRoutePage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
Route string
@ -236,7 +245,7 @@ type PanelAnalyticsRoutePage struct {
type PanelAnalyticsAgentPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
Agent string
@ -248,7 +257,7 @@ type PanelAnalyticsAgentPage struct {
type PanelThemesPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
PrimaryThemes []*Theme
@ -258,31 +267,27 @@ type PanelThemesPage struct {
type PanelUserPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ItemList []User
PageList []int
Page int
LastPage int
Paginator
}
type PanelGroupPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ItemList []GroupAdmin
PageList []int
Page int
LastPage int
Paginator
}
type PanelEditGroupPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ID int
@ -300,7 +305,7 @@ type GroupForumPermPreset struct {
type PanelEditForumPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ID int
@ -320,7 +325,7 @@ type NameLangToggle struct {
type PanelEditForumGroupPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ForumID int
@ -335,7 +340,7 @@ type PanelEditForumGroupPage struct {
type PanelEditGroupPermsPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
ID int
@ -355,7 +360,7 @@ type BackupItem struct {
type PanelBackupPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
Backups []BackupItem
@ -370,21 +375,21 @@ type LogItem struct {
type PanelLogsPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
Logs []LogItem
PageList []int
Page int
LastPage int
Paginator
}
type PanelDebugPage struct {
Title string
CurrentUser User
Header *HeaderVars
Header *Header
Stats PanelStats
Zone string
GoVersion string
DBVersion string
Uptime string
OpenConns int
DBAdapter string
@ -400,8 +405,7 @@ type AreYouSure struct {
Message string
}
// This is mostly for errors.go, please create *HeaderVars on the spot instead of relying on this or the atomic store underlying it, if possible
// TODO: Write a test for this
func DefaultHeaderVar() *HeaderVars {
return &HeaderVars{Site: Site, Theme: Themes[fallbackTheme]}
func DefaultHeader(w http.ResponseWriter) *Header {
return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: GuestUser, Writer: w}
}

View File

@ -14,13 +14,13 @@ var PreRoute func(http.ResponseWriter, *http.Request) (User, bool) = preRoute
// TODO: Come up with a better middleware solution
// nolint We need these types so people can tell what they are without scrolling to the bottom of the file
var PanelUserCheck func(http.ResponseWriter, *http.Request, *User) (*HeaderVars, PanelStats, RouteError) = panelUserCheck
var PanelUserCheck func(http.ResponseWriter, *http.Request, *User) (*Header, PanelStats, RouteError) = panelUserCheck
var SimplePanelUserCheck func(http.ResponseWriter, *http.Request, *User) (*HeaderLite, RouteError) = simplePanelUserCheck
var SimpleForumUserCheck func(w http.ResponseWriter, r *http.Request, user *User, fid int) (headerLite *HeaderLite, err RouteError) = simpleForumUserCheck
var ForumUserCheck func(w http.ResponseWriter, r *http.Request, user *User, fid int) (headerVars *HeaderVars, err RouteError) = forumUserCheck
var MemberCheck func(w http.ResponseWriter, r *http.Request, user *User) (headerVars *HeaderVars, err RouteError) = memberCheck
var ForumUserCheck func(w http.ResponseWriter, r *http.Request, user *User, fid int) (header *Header, err RouteError) = forumUserCheck
var MemberCheck func(w http.ResponseWriter, r *http.Request, user *User) (header *Header, err RouteError) = memberCheck
var SimpleUserCheck func(w http.ResponseWriter, r *http.Request, user *User) (headerLite *HeaderLite, err RouteError) = simpleUserCheck
var UserCheck func(w http.ResponseWriter, r *http.Request, user *User) (headerVars *HeaderVars, err RouteError) = userCheck
var UserCheck func(w http.ResponseWriter, r *http.Request, user *User) (header *Header, err RouteError) = userCheck
func simpleForumUserCheck(w http.ResponseWriter, r *http.Request, user *User, fid int) (headerLite *HeaderLite, rerr RouteError) {
if !Forums.Exists(fid) {
@ -46,20 +46,20 @@ func simpleForumUserCheck(w http.ResponseWriter, r *http.Request, user *User, fi
return headerLite, nil
}
func forumUserCheck(w http.ResponseWriter, r *http.Request, user *User, fid int) (headerVars *HeaderVars, rerr RouteError) {
headerVars, rerr = UserCheck(w, r, user)
func forumUserCheck(w http.ResponseWriter, r *http.Request, user *User, fid int) (header *Header, rerr RouteError) {
header, rerr = UserCheck(w, r, user)
if rerr != nil {
return headerVars, rerr
return header, rerr
}
if !Forums.Exists(fid) {
return headerVars, NotFound(w, r, headerVars)
return header, NotFound(w, r, header)
}
if VhookSkippable["forum_check_pre_perms"] != nil {
var skip bool
skip, rerr = RunVhookSkippable("forum_check_pre_perms", w, r, user, &fid, &headerVars)
skip, rerr = RunVhookSkippable("forum_check_pre_perms", w, r, user, &fid, &header)
if skip || rerr != nil {
return headerVars, rerr
return header, rerr
}
}
@ -70,7 +70,7 @@ func forumUserCheck(w http.ResponseWriter, r *http.Request, user *User, fid int)
return nil, PreError("Something weird happened", w, r)
}
cascadeForumPerms(fperms, user)
return headerVars, rerr
return header, rerr
}
// TODO: Put this on the user instance? Do we really want forum specific logic in there? Maybe, a method which spits a new pointer with the same contents as user?
@ -98,7 +98,7 @@ func cascadeForumPerms(fperms *ForumPerms, user *User) {
// Even if they have the right permissions, the control panel is only open to supermods+. There are many areas without subpermissions which assume that the current user is a supermod+ and admins are extremely unlikely to give these permissions to someone who isn't at-least a supermod to begin with
// TODO: Do a panel specific theme?
func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *HeaderVars, stats PanelStats, rerr RouteError) {
func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Header, stats PanelStats, rerr RouteError) {
var theme = &Theme{Name: ""}
cookie, err := r.Cookie("current_theme")
@ -112,17 +112,18 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerV
theme = Themes[DefaultThemeBox.Load().(string)]
}
headerVars = &HeaderVars{
header = &Header{
Site: Site,
Settings: SettingBox.Load().(SettingMap),
Themes: Themes,
Theme: theme,
CurrentUser: *user,
Zone: "panel",
Writer: w,
}
// TODO: We should probably initialise headerVars.ExtData
// TODO: We should probably initialise header.ExtData
headerVars.AddSheet(theme.Name + "/panel.css")
header.AddSheet(theme.Name + "/panel.css")
if len(theme.Resources) > 0 {
rlist := theme.Resources
for _, resource := range rlist {
@ -130,9 +131,9 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerV
extarr := strings.Split(resource.Name, ".")
ext := extarr[len(extarr)-1]
if ext == "css" {
headerVars.AddSheet(resource.Name)
header.AddSheet(resource.Name)
} else if ext == "js" {
headerVars.AddScript(resource.Name)
header.AddScript(resource.Name)
}
}
}
@ -141,7 +142,7 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerV
stats.Users = Users.GlobalCount()
stats.Groups = Groups.GlobalCount()
stats.Forums = Forums.GlobalCount() // TODO: Stop it from showing the blanked forums
stats.Settings = len(headerVars.Settings)
stats.Settings = len(header.Settings)
stats.WordFilters = len(WordFilterBox.Load().(WordFilterMap))
stats.Themes = len(Themes)
stats.Reports = 0 // TODO: Do the report count. Only show open threads?
@ -153,16 +154,16 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerV
pusher.Push("/static/global.js", nil)
pusher.Push("/static/jquery-3.1.1.min.js", nil)
// TODO: Test these
for _, sheet := range headerVars.Stylesheets {
for _, sheet := range header.Stylesheets {
pusher.Push("/static/"+sheet, nil)
}
for _, script := range headerVars.Scripts {
for _, script := range header.Scripts {
pusher.Push("/static/"+script, nil)
}
// TODO: Push avatars?
}
return headerVars, stats, nil
return header, stats, nil
}
func simplePanelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (headerLite *HeaderLite, rerr RouteError) {
@ -173,12 +174,12 @@ func simplePanelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (h
}
// TODO: Add this to the member routes
func memberCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *HeaderVars, rerr RouteError) {
headerVars, rerr = UserCheck(w, r, user)
func memberCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Header, rerr RouteError) {
header, rerr = UserCheck(w, r, user)
if !user.Loggedin {
return headerVars, NoPermissions(w, r, *user)
return header, NoPermissions(w, r, *user)
}
return headerVars, rerr
return header, rerr
}
// SimpleUserCheck is back from the grave, yay :D
@ -191,7 +192,7 @@ func simpleUserCheck(w http.ResponseWriter, r *http.Request, user *User) (header
}
// TODO: Add the ability for admins to restrict certain themes to certain groups?
func userCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *HeaderVars, rerr RouteError) {
func userCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Header, rerr RouteError) {
var theme = &Theme{Name: ""}
cookie, err := r.Cookie("current_theme")
@ -205,20 +206,21 @@ func userCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *
theme = Themes[DefaultThemeBox.Load().(string)]
}
headerVars = &HeaderVars{
header = &Header{
Site: Site,
Settings: SettingBox.Load().(SettingMap),
Themes: Themes,
Theme: theme,
CurrentUser: *user,
Zone: "frontend",
Writer: w,
}
if user.IsBanned {
headerVars.NoticeList = append(headerVars.NoticeList, GetNoticePhrase("account_banned"))
header.NoticeList = append(header.NoticeList, GetNoticePhrase("account_banned"))
}
if user.Loggedin && !user.Active {
headerVars.NoticeList = append(headerVars.NoticeList, GetNoticePhrase("account_inactive"))
header.NoticeList = append(header.NoticeList, GetNoticePhrase("account_inactive"))
}
if len(theme.Resources) > 0 {
@ -231,9 +233,9 @@ func userCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *
extarr := strings.Split(resource.Name, ".")
ext := extarr[len(extarr)-1]
if ext == "css" {
headerVars.AddSheet(resource.Name)
header.AddSheet(resource.Name)
} else if ext == "js" {
headerVars.AddScript(resource.Name)
header.AddScript(resource.Name)
}
}
}
@ -245,16 +247,16 @@ func userCheck(w http.ResponseWriter, r *http.Request, user *User) (headerVars *
pusher.Push("/static/global.js", nil)
pusher.Push("/static/jquery-3.1.1.min.js", nil)
// TODO: Test these
for _, sheet := range headerVars.Stylesheets {
for _, sheet := range header.Stylesheets {
pusher.Push("/static/"+sheet, nil)
}
for _, script := range headerVars.Scripts {
for _, script := range header.Scripts {
pusher.Push("/static/"+script, nil)
}
// TODO: Push avatars?
}
return headerVars, nil
return header, nil
}
func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) {

View File

@ -2,8 +2,8 @@ package common
import (
"html/template"
"io"
"log"
"net/http"
"path/filepath"
"strconv"
"strings"
@ -15,7 +15,7 @@ import (
var Ctemplates []string
var Templates = template.New("")
var PrebuildTmplList []func(User, *HeaderVars) CTmpl
var PrebuildTmplList []func(User, *Header) CTmpl
type CTmpl struct {
Name string
@ -28,7 +28,7 @@ type CTmpl struct {
// TODO: Stop duplicating these bits of code
// nolint
func interpreted_topic_template(pi TopicPage, w http.ResponseWriter) error {
func interpretedTopicTemplate(pi TopicPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["topic"]
if !ok {
mapping = "topic"
@ -37,11 +37,11 @@ func interpreted_topic_template(pi TopicPage, w http.ResponseWriter) error {
}
// nolint
var Template_topic_handle = interpreted_topic_template
var Template_topic_alt_handle = interpreted_topic_template
var Template_topic_handle = interpretedTopicTemplate
var Template_topic_alt_handle = interpretedTopicTemplate
// nolint
var Template_topics_handle = func(pi TopicsPage, w http.ResponseWriter) error {
var Template_topics_handle = func(pi TopicListPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["topics"]
if !ok {
mapping = "topics"
@ -50,7 +50,7 @@ var Template_topics_handle = func(pi TopicsPage, w http.ResponseWriter) error {
}
// nolint
var Template_forum_handle = func(pi ForumPage, w http.ResponseWriter) error {
var Template_forum_handle = func(pi ForumPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["forum"]
if !ok {
mapping = "forum"
@ -59,7 +59,7 @@ var Template_forum_handle = func(pi ForumPage, w http.ResponseWriter) error {
}
// nolint
var Template_forums_handle = func(pi ForumsPage, w http.ResponseWriter) error {
var Template_forums_handle = func(pi ForumsPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["forums"]
if !ok {
mapping = "forums"
@ -68,7 +68,7 @@ var Template_forums_handle = func(pi ForumsPage, w http.ResponseWriter) error {
}
// nolint
var Template_profile_handle = func(pi ProfilePage, w http.ResponseWriter) error {
var Template_profile_handle = func(pi ProfilePage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["profile"]
if !ok {
mapping = "profile"
@ -77,7 +77,7 @@ var Template_profile_handle = func(pi ProfilePage, w http.ResponseWriter) error
}
// nolint
var Template_create_topic_handle = func(pi CreateTopicPage, w http.ResponseWriter) error {
var Template_create_topic_handle = func(pi CreateTopicPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["create_topic"]
if !ok {
mapping = "create_topic"
@ -86,7 +86,7 @@ var Template_create_topic_handle = func(pi CreateTopicPage, w http.ResponseWrite
}
// nolint
var Template_login_handle = func(pi Page, w http.ResponseWriter) error {
var Template_login_handle = func(pi Page, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["login"]
if !ok {
mapping = "login"
@ -95,7 +95,7 @@ var Template_login_handle = func(pi Page, w http.ResponseWriter) error {
}
// nolint
var Template_register_handle = func(pi Page, w http.ResponseWriter) error {
var Template_register_handle = func(pi Page, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["register"]
if !ok {
mapping = "register"
@ -104,7 +104,7 @@ var Template_register_handle = func(pi Page, w http.ResponseWriter) error {
}
// nolint
var Template_error_handle = func(pi Page, w http.ResponseWriter) error {
var Template_error_handle = func(pi Page, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["error"]
if !ok {
mapping = "error"
@ -113,7 +113,7 @@ var Template_error_handle = func(pi Page, w http.ResponseWriter) error {
}
// nolint
var Template_ip_search_handle = func(pi IPSearchPage, w http.ResponseWriter) error {
var Template_ip_search_handle = func(pi IPSearchPage, w io.Writer) error {
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap["ip_search"]
if !ok {
mapping = "ip_search"
@ -127,8 +127,12 @@ func CompileTemplates() error {
config.Minify = Config.MinifyTemplates
config.SuperDebug = Dev.TemplateDebug
var c tmpl.CTemplateSet
c := tmpl.NewCTemplateSet()
c.SetConfig(config)
c.SetBaseImportMap(map[string]string{
"io": "io",
"./common": "./common",
})
// Schemas to train the template compiler on what to expect
// TODO: Add support for interface{}s
@ -136,11 +140,12 @@ func CompileTemplates() error {
// TODO: Do a more accurate level calculation for this?
user2 := User{1, BuildProfileURL("admin-alice", 1), "Admin Alice", "alice@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, BuildAvatar(1, ""), "", "", "", "", 58, 1000, 0, "127.0.0.1", 0}
user3 := User{2, BuildProfileURL("admin-fred", 62), "Admin Fred", "fred@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, BuildAvatar(2, ""), "", "", "", "", 42, 900, 0, "::1", 0}
headerVars := &HeaderVars{
header := &Header{
Site: Site,
Settings: SettingBox.Load().(SettingMap),
Themes: Themes,
Theme: Themes[DefaultThemeBox.Load().(string)],
CurrentUser: user,
NoticeList: []string{"test"},
Stylesheets: []string{"panel"},
Scripts: []string{"whatever"},
@ -161,7 +166,7 @@ func CompileTemplates() error {
replyList = append(replyList, ReplyUser{0, 0, "Yo!", "Yo!", 0, "alice", "Alice", Config.DefaultGroup, now, RelativeTime(now), 0, 0, "", "", 0, "", "", "", "", 0, "127.0.0.1", false, 1, "", ""})
var varList = make(map[string]tmpl.VarItem)
tpage := TopicPage{"Title", user, headerVars, replyList, topic, poll, 1, 1}
tpage := TopicPage{"Title", user, header, replyList, topic, poll, 1, 1}
topicIDTmpl, err := c.Compile("topic.html", "templates/", "common.TopicPage", tpage, varList)
if err != nil {
return err
@ -172,7 +177,7 @@ func CompileTemplates() error {
}
varList = make(map[string]tmpl.VarItem)
ppage := ProfilePage{"User 526", user, headerVars, replyList, user}
ppage := ProfilePage{"User 526", user, header, replyList, user}
profileTmpl, err := c.Compile("profile.html", "templates/", "common.ProfilePage", ppage, varList)
if err != nil {
return err
@ -189,7 +194,7 @@ func CompileTemplates() error {
forumList = append(forumList, *forum)
}
varList = make(map[string]tmpl.VarItem)
forumsPage := ForumsPage{"Forum List", user, headerVars, forumList}
forumsPage := ForumsPage{"Forum List", user, header, forumList}
forumsTmpl, err := c.Compile("forums.html", "templates/", "common.ForumsPage", forumsPage, varList)
if err != nil {
return err
@ -197,8 +202,9 @@ func CompileTemplates() error {
var topicsList []*TopicsRow
topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, "Date", time.Now(), "Date", user3.ID, 1, "", "127.0.0.1", 0, 1, "classname", "", &user2, "", 0, &user3, "General", "/forum/general.2"})
topicsPage := TopicsPage{"Topic List", user, headerVars, topicsList, forumList, Config.DefaultForum, []int{1}, 1, 1}
topicsTmpl, err := c.Compile("topics.html", "templates/", "common.TopicsPage", topicsPage, varList)
header.Title = "Topic List"
topicListPage := TopicListPage{header, topicsList, forumList, Config.DefaultForum, Paginator{[]int{1}, 1, 1}}
topicListTmpl, err := c.Compile("topics.html", "templates/", "common.TopicListPage", topicListPage, varList)
if err != nil {
return err
}
@ -206,25 +212,25 @@ func CompileTemplates() error {
//var topicList []TopicUser
//topicList = append(topicList,TopicUser{1,"topic-title","Topic Title","The topic content.",1,false,false,"Date","Date",1,"","127.0.0.1",0,1,"classname","","admin-fred","Admin Fred",config.DefaultGroup,"",0,"","","","",58,false})
forumItem := BlankForum(1, "general-forum.1", "General Forum", "Where the general stuff happens", true, "all", 0, "", 0)
forumPage := ForumPage{"General Forum", user, headerVars, topicsList, forumItem, []int{1}, 1, 1}
forumPage := ForumPage{"General Forum", user, header, topicsList, forumItem, Paginator{[]int{1}, 1, 1}}
forumTmpl, err := c.Compile("forum.html", "templates/", "common.ForumPage", forumPage, varList)
if err != nil {
return err
}
loginPage := Page{"Login Page", user, headerVars, tList, nil}
loginPage := Page{"Login Page", user, header, tList, nil}
loginTmpl, err := c.Compile("login.html", "templates/", "common.Page", loginPage, varList)
if err != nil {
return err
}
registerPage := Page{"Registration Page", user, headerVars, tList, nil}
registerPage := Page{"Registration Page", user, header, tList, nil}
registerTmpl, err := c.Compile("register.html", "templates/", "common.Page", registerPage, varList)
if err != nil {
return err
}
errorPage := Page{"Error", user, headerVars, tList, "A problem has occurred in the system."}
errorPage := Page{"Error", user, header, tList, "A problem has occurred in the system."}
errorTmpl, err := c.Compile("error.html", "templates/", "common.Page", errorPage, varList)
if err != nil {
return err
@ -232,7 +238,7 @@ func CompileTemplates() error {
var ipUserList = make(map[int]*User)
ipUserList[1] = &user2
ipSearchPage := IPSearchPage{"IP Search", user2, headerVars, ipUserList, "::1"}
ipSearchPage := IPSearchPage{"IP Search", user2, header, ipUserList, "::1"}
ipSearchTmpl, err := c.Compile("ip_search.html", "templates/", "common.IPSearchPage", ipSearchPage, varList)
if err != nil {
return err
@ -261,7 +267,7 @@ func CompileTemplates() error {
config.SkipHandles = true
c.SetConfig(config)
for _, tmplfunc := range PrebuildTmplList {
tmplItem := tmplfunc(user, headerVars)
tmplItem := tmplfunc(user, header)
varList = make(map[string]tmpl.VarItem)
compiledTmpl, err := c.Compile(tmplItem.Filename, tmplItem.Path, tmplItem.StructName, tmplItem.Data, varList, tmplItem.Imports...)
if err != nil {
@ -275,94 +281,132 @@ func CompileTemplates() error {
writeTemplate("topic_alt", topicIDAltTmpl)
writeTemplate("profile", profileTmpl)
writeTemplate("forums", forumsTmpl)
writeTemplate("topics", topicsTmpl)
writeTemplate("topics", topicListTmpl)
writeTemplate("forum", forumTmpl)
writeTemplate("login", loginTmpl)
writeTemplate("register", registerTmpl)
writeTemplate("ip_search", ipSearchTmpl)
writeTemplate("error", errorTmpl)
writeTemplateList(c, &wg, "./")
return nil
}
func CompileJSTemplates() error {
log.Print("Compiling the JS templates")
var config tmpl.CTemplateConfig
config.Minify = Config.MinifyTemplates
config.SuperDebug = Dev.TemplateDebug
config.SkipHandles = true
config.PackageName = "tmpl"
c := tmpl.NewCTemplateSet()
c.SetConfig(config)
c.SetBaseImportMap(map[string]string{
"io": "io",
"../../common": "../../common",
})
var varList = make(map[string]tmpl.VarItem)
// TODO: Check what sort of path is sent exactly and use it here
alertItem := AlertItem{Avatar: "", ASID: 1, Path: "/", Message: "uh oh, something happened"}
alertTmpl, err := c.Compile("alert.html", "templates/", "common.AlertItem", alertItem, varList)
if err != nil {
return err
}
var dirPrefix = "./tmpl_gen/client/"
var wg sync.WaitGroup
var writeTemplate = func(name string, content string) {
log.Print("Writing template '" + name + "'")
if content == "" {
log.Fatal("No content body")
}
wg.Add(1)
go func() {
out := "package main\n\n"
for templateName, count := range c.TemplateFragmentCount {
out += "var " + templateName + "_frags = make([][]byte," + strconv.Itoa(count) + ")\n"
}
out += "\n// nolint\nfunc init() {\n" + c.FragOut + "}\n"
err := writeFile("./template_list.go", out)
err := writeFile(dirPrefix+"template_"+name+".go", content)
if err != nil {
log.Fatal(err)
}
wg.Done()
}()
wg.Wait()
}
writeTemplate("alert", alertTmpl)
writeTemplateList(c, &wg, dirPrefix)
return nil
}
func writeTemplateList(c *tmpl.CTemplateSet, wg *sync.WaitGroup, prefix string) {
log.Print("Writing template list")
wg.Add(1)
go func() {
out := "package " + c.GetConfig().PackageName + "\n\n"
for templateName, count := range c.TemplateFragmentCount {
out += "var " + templateName + "_frags = make([][]byte," + strconv.Itoa(count) + ")\n"
}
out += "\n// nolint\nfunc init() {\n" + c.FragOut + "}\n"
err := writeFile(prefix+"template_list.go", out)
if err != nil {
log.Fatal(err)
}
wg.Done()
}()
wg.Wait()
}
func arithToInt64(in interface{}) (out int64) {
switch in := in.(type) {
case int64:
out = in
case int32:
out = int64(in)
case int:
out = int64(in)
case uint32:
out = int64(in)
case uint16:
out = int64(in)
case uint8:
out = int64(in)
case uint:
out = int64(in)
}
return out
}
func arithDuoToInt64(left interface{}, right interface{}) (leftInt int64, rightInt int64) {
return arithToInt64(left), arithToInt64(right)
}
func InitTemplates() error {
DebugLog("Initialising the template system")
// TODO: Add support for 64-bit integers
// TODO: Add support for floats
fmap := make(map[string]interface{})
fmap["add"] = func(left interface{}, right interface{}) interface{} {
var leftInt, rightInt int
switch left := left.(type) {
case uint, uint8, uint16, int, int32:
leftInt = left.(int)
}
switch right := right.(type) {
case uint, uint8, uint16, int, int32:
rightInt = right.(int)
}
leftInt, rightInt := arithDuoToInt64(left, right)
return leftInt + rightInt
}
fmap["subtract"] = func(left interface{}, right interface{}) interface{} {
var leftInt, rightInt int
switch left := left.(type) {
case uint, uint8, uint16, int, int32:
leftInt = left.(int)
}
switch right := right.(type) {
case uint, uint8, uint16, int, int32:
rightInt = right.(int)
}
leftInt, rightInt := arithDuoToInt64(left, right)
return leftInt - rightInt
}
fmap["multiply"] = func(left interface{}, right interface{}) interface{} {
var leftInt, rightInt int
switch left := left.(type) {
case uint, uint8, uint16, int, int32:
leftInt = left.(int)
}
switch right := right.(type) {
case uint, uint8, uint16, int, int32:
rightInt = right.(int)
}
leftInt, rightInt := arithDuoToInt64(left, right)
return leftInt * rightInt
}
fmap["divide"] = func(left interface{}, right interface{}) interface{} {
var leftInt, rightInt int
switch left := left.(type) {
case uint, uint8, uint16, int, int32:
leftInt = left.(int)
}
switch right := right.(type) {
case uint, uint8, uint16, int, int32:
rightInt = right.(int)
}
leftInt, rightInt := arithDuoToInt64(left, right)
if leftInt == 0 || rightInt == 0 {
return 0
}
return leftInt / rightInt
}
fmap["dock"] = func(dock interface{}, headerVarInt interface{}) interface{} {
return template.HTML(BuildWidget(dock.(string), headerVarInt.(*HeaderVars)))
fmap["dock"] = func(dock interface{}, headerInt interface{}) interface{} {
return template.HTML(BuildWidget(dock.(string), headerInt.(*Header)))
}
fmap["lang"] = func(phraseNameInt interface{}) interface{} {

View File

@ -32,6 +32,8 @@ type CTemplateConfig struct {
Debug bool
SuperDebug bool
SkipHandles bool
SkipInitBlock bool
PackageName string
}
// nolint
@ -55,26 +57,17 @@ type CTemplateSet struct {
nextNode parse.NodeType
//tempVars map[string]string
config CTemplateConfig
doImports bool
baseImportMap map[string]string
expectsInt interface{}
}
func (c *CTemplateSet) SetConfig(config CTemplateConfig) {
c.config = config
}
func (c *CTemplateSet) GetConfig() CTemplateConfig {
return c.config
}
func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expectsInt interface{}, varList map[string]VarItem, imports ...string) (out string, err error) {
if c.config.Debug {
fmt.Println("Compiling template '" + name + "'")
}
c.fileDir = fileDir
c.doImports = true
c.funcMap = map[string]interface{}{
func NewCTemplateSet() *CTemplateSet {
return &CTemplateSet{
config: CTemplateConfig{
PackageName: "main",
},
baseImportMap: map[string]string{},
funcMap: map[string]interface{}{
"and": "&&",
"not": "!",
"or": "||",
@ -91,11 +84,33 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe
"dock": true,
"lang": true,
"scope": true,
},
}
}
c.importMap = map[string]string{
"net/http": "net/http",
"./common": "./common",
func (c *CTemplateSet) SetConfig(config CTemplateConfig) {
if config.PackageName == "" {
config.PackageName = "main"
}
c.config = config
}
func (c *CTemplateSet) GetConfig() CTemplateConfig {
return c.config
}
func (c *CTemplateSet) SetBaseImportMap(importMap map[string]string) {
c.baseImportMap = importMap
}
func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expectsInt interface{}, varList map[string]VarItem, imports ...string) (out string, err error) {
if c.config.Debug {
fmt.Println("Compiling template '" + name + "'")
}
c.importMap = map[string]string{}
for index, item := range c.baseImportMap {
c.importMap[index] = item
}
if len(imports) > 0 {
for _, importItem := range imports {
@ -103,6 +118,7 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe
}
}
c.fileDir = fileDir
c.varList = varList
c.hasDispInt = false
c.localDispStructIndex = 0
@ -157,11 +173,9 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe
c.TemplateFragmentCount[fname] = c.fragmentCursor[fname] + 1
var importList string
if c.doImports {
for _, item := range c.importMap {
importList += "import \"" + item + "\"\n"
}
}
var varString string
for _, varItem := range c.varList {
@ -169,9 +183,12 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe
}
fout := "// +build !no_templategen\n\n// Code generated by Gosora. More below:\n/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */\n"
fout += "package " + c.config.PackageName + "\n" + importList + "\n"
fout += "package main\n" + importList + "\n"
if !c.config.SkipInitBlock {
if len(c.langIndexToName) > 0 {
fout += "var " + fname + "_tmpl_phrase_id int\n\n"
}
fout += "// nolint\nfunc init() {\n"
if !c.config.SkipHandles {
@ -189,8 +206,9 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe
fout += "\t})\n"
}
fout += "}\n\n"
}
fout += "// nolint\nfunc Template_" + fname + "(tmpl_" + fname + "_vars " + expects + ", w http.ResponseWriter) error {\n"
fout += "// nolint\nfunc Template_" + fname + "(tmpl_" + fname + "_vars " + expects + ", w io.Writer) error {\n"
if len(c.langIndexToName) > 0 {
fout += "var phrases = common.GetTmplPhrasesBytes(" + fname + "_tmpl_phrase_id)\n"
}

View File

@ -7,6 +7,7 @@ import (
"database/sql"
"encoding/json"
"errors"
"io"
"io/ioutil"
"log"
"mime"
@ -271,72 +272,72 @@ func (theme *Theme) MapTemplates() {
}
switch dTmplPtr := destTmplPtr.(type) {
case *func(TopicPage, http.ResponseWriter) error:
case *func(TopicPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(TopicPage, http.ResponseWriter) error:
case *func(TopicPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(TopicsPage, http.ResponseWriter) error:
case *func(TopicListPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(TopicsPage, http.ResponseWriter) error:
case *func(TopicListPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(ForumPage, http.ResponseWriter) error:
case *func(ForumPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(ForumPage, http.ResponseWriter) error:
case *func(ForumPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(ForumsPage, http.ResponseWriter) error:
case *func(ForumsPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(ForumsPage, http.ResponseWriter) error:
case *func(ForumsPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(ProfilePage, http.ResponseWriter) error:
case *func(ProfilePage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(ProfilePage, http.ResponseWriter) error:
case *func(ProfilePage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(CreateTopicPage, http.ResponseWriter) error:
case *func(CreateTopicPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(CreateTopicPage, http.ResponseWriter) error:
case *func(CreateTopicPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(IPSearchPage, http.ResponseWriter) error:
case *func(IPSearchPage, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(IPSearchPage, http.ResponseWriter) error:
case *func(IPSearchPage, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case *func(Page, http.ResponseWriter) error:
case *func(Page, io.Writer) error:
switch sTmplPtr := sourceTmplPtr.(type) {
case *func(Page, http.ResponseWriter) error:
case *func(Page, io.Writer) error:
//overridenTemplates[themeTmpl.Name] = d_tmpl_ptr
overridenTemplates[themeTmpl.Name] = true
*dTmplPtr = *sTmplPtr
@ -372,58 +373,58 @@ func ResetTemplateOverrides() {
// Not really a pointer, more of a function handle, an artifact from one of the earlier versions of themes.go
switch oPtr := originPointer.(type) {
case func(TopicPage, http.ResponseWriter) error:
case func(TopicPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(TopicPage, http.ResponseWriter) error:
case *func(TopicPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(TopicsPage, http.ResponseWriter) error:
case func(TopicListPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(TopicsPage, http.ResponseWriter) error:
case *func(TopicListPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(ForumPage, http.ResponseWriter) error:
case func(ForumPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(ForumPage, http.ResponseWriter) error:
case *func(ForumPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(ForumsPage, http.ResponseWriter) error:
case func(ForumsPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(ForumsPage, http.ResponseWriter) error:
case *func(ForumsPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(ProfilePage, http.ResponseWriter) error:
case func(ProfilePage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(ProfilePage, http.ResponseWriter) error:
case *func(ProfilePage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(CreateTopicPage, http.ResponseWriter) error:
case func(CreateTopicPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(CreateTopicPage, http.ResponseWriter) error:
case *func(CreateTopicPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(IPSearchPage, http.ResponseWriter) error:
case func(IPSearchPage, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(IPSearchPage, http.ResponseWriter) error:
case *func(IPSearchPage, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
}
case func(Page, http.ResponseWriter) error:
case func(Page, io.Writer) error:
switch dPtr := destTmplPtr.(type) {
case *func(Page, http.ResponseWriter) error:
case *func(Page, io.Writer) error:
*dPtr = oPtr
default:
LogError(errors.New("The source and destination templates are incompatible"))
@ -441,48 +442,48 @@ func ResetTemplateOverrides() {
// NEW method of doing theme templates to allow one user to have a different theme to another. Under construction.
// TODO: Generate the type switch instead of writing it by hand
// TODO: Cut the number of types in half
func RunThemeTemplate(theme string, template string, pi interface{}, w http.ResponseWriter) error {
func RunThemeTemplate(theme string, template string, pi interface{}, w io.Writer) error {
var getTmpl = GetThemeTemplate(theme, template)
switch tmplO := getTmpl.(type) {
case *func(TopicPage, http.ResponseWriter) error:
case *func(TopicPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(TopicPage), w)
case *func(TopicsPage, http.ResponseWriter) error:
case *func(TopicListPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(TopicsPage), w)
case *func(ForumPage, http.ResponseWriter) error:
return tmpl(pi.(TopicListPage), w)
case *func(ForumPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(ForumPage), w)
case *func(ForumsPage, http.ResponseWriter) error:
case *func(ForumsPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(ForumsPage), w)
case *func(ProfilePage, http.ResponseWriter) error:
case *func(ProfilePage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(ProfilePage), w)
case *func(CreateTopicPage, http.ResponseWriter) error:
case *func(CreateTopicPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(CreateTopicPage), w)
case *func(IPSearchPage, http.ResponseWriter) error:
case *func(IPSearchPage, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(IPSearchPage), w)
case *func(Page, http.ResponseWriter) error:
case *func(Page, io.Writer) error:
var tmpl = *tmplO
return tmpl(pi.(Page), w)
case func(TopicPage, http.ResponseWriter) error:
case func(TopicPage, io.Writer) error:
return tmplO(pi.(TopicPage), w)
case func(TopicsPage, http.ResponseWriter) error:
return tmplO(pi.(TopicsPage), w)
case func(ForumPage, http.ResponseWriter) error:
case func(TopicListPage, io.Writer) error:
return tmplO(pi.(TopicListPage), w)
case func(ForumPage, io.Writer) error:
return tmplO(pi.(ForumPage), w)
case func(ForumsPage, http.ResponseWriter) error:
case func(ForumsPage, io.Writer) error:
return tmplO(pi.(ForumsPage), w)
case func(ProfilePage, http.ResponseWriter) error:
case func(ProfilePage, io.Writer) error:
return tmplO(pi.(ProfilePage), w)
case func(CreateTopicPage, http.ResponseWriter) error:
case func(CreateTopicPage, io.Writer) error:
return tmplO(pi.(CreateTopicPage), w)
case func(IPSearchPage, http.ResponseWriter) error:
case func(IPSearchPage, io.Writer) error:
return tmplO(pi.(IPSearchPage), w)
case func(Page, http.ResponseWriter) error:
case func(Page, io.Writer) error:
return tmplO(pi.(Page), w)
case string:
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap[template]

View File

@ -12,14 +12,12 @@ var TopicList TopicListInt
type TopicListHolder struct {
List []*TopicsRow
ForumList []Forum
PageList []int
Page int
LastPage int
Paginator Paginator
}
type TopicListInt interface {
GetListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, pageList []int, outPage int, lastPage int, err error)
GetList(page int) (topicList []*TopicsRow, forumList []Forum, pageList []int, outPage int, lastPage int, err error)
GetListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, paginator Paginator, err error)
GetList(page int) (topicList []*TopicsRow, forumList []Forum, paginator Paginator, err error)
}
type DefaultTopicList struct {
@ -99,11 +97,11 @@ func (tList *DefaultTopicList) Tick() error {
var oddLists = make(map[int]*TopicListHolder)
var evenLists = make(map[int]*TopicListHolder)
var addList = func(gid int, topicList []*TopicsRow, forumList []Forum, pageList []int, page int, lastPage int) {
var addList = func(gid int, topicList []*TopicsRow, forumList []Forum, paginator Paginator) {
if gid%2 == 0 {
evenLists[gid] = &TopicListHolder{topicList, forumList, pageList, page, lastPage}
evenLists[gid] = &TopicListHolder{topicList, forumList, paginator}
} else {
oddLists[gid] = &TopicListHolder{topicList, forumList, pageList, page, lastPage}
oddLists[gid] = &TopicListHolder{topicList, forumList, paginator}
}
}
@ -111,11 +109,11 @@ func (tList *DefaultTopicList) Tick() error {
if err != nil {
return err
}
topicList, forumList, pageList, page, lastPage, err := tList.getListByGroup(guestGroup, 1)
topicList, forumList, paginator, err := tList.getListByGroup(guestGroup, 1)
if err != nil {
return err
}
addList(guestGroup.ID, topicList, forumList, pageList, page, lastPage)
addList(guestGroup.ID, topicList, forumList, paginator)
for _, gid := range tList.groupList {
group, err := Groups.Get(gid) // TODO: Bulk load the groups?
@ -126,11 +124,11 @@ func (tList *DefaultTopicList) Tick() error {
continue
}
topicList, forumList, pageList, page, lastPage, err := tList.getListByGroup(group, 1)
topicList, forumList, paginator, err := tList.getListByGroup(group, 1)
if err != nil {
return err
}
addList(group.ID, topicList, forumList, pageList, page, lastPage)
addList(group.ID, topicList, forumList, paginator)
}
tList.oddLock.Lock()
@ -144,7 +142,7 @@ func (tList *DefaultTopicList) Tick() error {
return nil
}
func (tList *DefaultTopicList) GetListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, pageList []int, outPage int, lastPage int, err error) {
func (tList *DefaultTopicList) GetListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, paginator Paginator, err error) {
// TODO: Cache the first three pages not just the first along with all the topics on this beaten track
if page == 1 {
var holder *TopicListHolder
@ -159,14 +157,14 @@ func (tList *DefaultTopicList) GetListByGroup(group *Group, page int) (topicList
tList.oddLock.RUnlock()
}
if ok {
return holder.List, holder.ForumList, holder.PageList, holder.Page, holder.LastPage, nil
return holder.List, holder.ForumList, holder.Paginator, nil
}
}
return tList.getListByGroup(group, page)
}
func (tList *DefaultTopicList) getListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, pageList []int, outPage int, lastPage int, err error) {
func (tList *DefaultTopicList) getListByGroup(group *Group, page int) (topicList []*TopicsRow, forumList []Forum, paginator Paginator, err error) {
// TODO: Make CanSee a method on *Group with a canSee field? Have a CanSee method on *User to cover the case of superadmins?
canSee := group.CanSee
@ -185,19 +183,19 @@ func (tList *DefaultTopicList) getListByGroup(group *Group, page int) (topicList
argList, qlist := ForumListToArgQ(forumList)
if qlist == "" {
// We don't want to kill the page, so pass an empty slice and nil error
return topicList, forumList, pageList, 1, 1, nil
return topicList, forumList, Paginator{[]int{}, 1, 1}, nil
}
topicList, pageList, page, lastPage, err = tList.getList(page, argList, qlist)
return topicList, forumList, pageList, page, lastPage, err
topicList, paginator, err = tList.getList(page, argList, qlist)
return topicList, forumList, paginator, err
}
// TODO: Reduce the number of returns
func (tList *DefaultTopicList) GetList(page int) (topicList []*TopicsRow, forumList []Forum, pageList []int, outPage int, lastPage int, err error) {
func (tList *DefaultTopicList) GetList(page int) (topicList []*TopicsRow, forumList []Forum, paginator Paginator, err error) {
// TODO: Make CanSee a method on *Group with a canSee field? Have a CanSee method on *User to cover the case of superadmins?
canSee, err := Forums.GetAllVisibleIDs()
if err != nil {
return nil, nil, nil, 1, 1, err
return nil, nil, Paginator{nil, 1, 1}, err
}
// We need a list of the visible forums for Quick Topic
@ -215,24 +213,24 @@ func (tList *DefaultTopicList) GetList(page int) (topicList []*TopicsRow, forumL
argList, qlist := ForumListToArgQ(forumList)
if qlist == "" {
// If the super admin can't see anything, then things have gone terribly wrong
return topicList, forumList, pageList, 1, 1, err
return topicList, forumList, Paginator{[]int{}, 1, 1}, err
}
topicList, pageList, outPage, lastPage, err = tList.getList(page, argList, qlist)
return topicList, forumList, pageList, outPage, lastPage, err
topicList, paginator, err = tList.getList(page, argList, qlist)
return topicList, forumList, paginator, err
}
// TODO: Rename this to TopicListStore and pass back a TopicList instance holding the pagination data and topic list rather than passing them back one argument at a time
func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist string) (topicList []*TopicsRow, pageList []int, outPage int, lastPage int, err error) {
func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist string) (topicList []*TopicsRow, paginator Paginator, err error) {
topicCount, err := ArgQToTopicCount(argList, qlist)
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
offset, page, lastPage := PageOffset(topicCount, page, Config.ItemsPerPage)
stmt, err := qgen.Builder.SimpleSelect("topics", "tid, title, content, createdBy, is_closed, sticky, createdAt, lastReplyAt, lastReplyBy, parentID, postCount, likeCount", "parentID IN("+qlist+")", "sticky DESC, lastReplyAt DESC, createdBy DESC", "?,?")
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
defer stmt.Close()
@ -241,7 +239,7 @@ func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist st
rows, err := stmt.Query(argList...)
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
defer rows.Close()
@ -250,7 +248,7 @@ func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist st
topicItem := TopicsRow{ID: 0}
err := rows.Scan(&topicItem.ID, &topicItem.Title, &topicItem.Content, &topicItem.CreatedBy, &topicItem.IsClosed, &topicItem.Sticky, &topicItem.CreatedAt, &topicItem.LastReplyAt, &topicItem.LastReplyBy, &topicItem.ParentID, &topicItem.PostCount, &topicItem.LikeCount)
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
topicItem.Link = BuildTopicURL(NameToSlug(topicItem.Title), topicItem.ID)
@ -269,7 +267,7 @@ func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist st
}
err = rows.Err()
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
// Convert the user ID map to a slice, then bulk load the users
@ -283,7 +281,7 @@ func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist st
// TODO: What if a user is deleted via the Control Panel?
userList, err := Users.BulkGetMap(idSlice)
if err != nil {
return nil, nil, 1, 1, err
return nil, Paginator{nil, 1, 1}, err
}
// Second pass to the add the user data
@ -293,8 +291,8 @@ func (tList *DefaultTopicList) getList(page int, argList []interface{}, qlist st
topicItem.LastUser = userList[topicItem.LastReplyBy]
}
pageList = Paginate(topicCount, Config.ItemsPerPage, 5)
return topicList, pageList, page, lastPage, nil
pageList := Paginate(topicCount, Config.ItemsPerPage, 5)
return topicList, Paginator{pageList, page, lastPage}, nil
}
// Internal. Don't rely on it.

View File

@ -5,6 +5,7 @@ import (
"bytes"
"database/sql"
"encoding/json"
"fmt"
"html/template"
"strings"
"sync"
@ -80,7 +81,6 @@ func preparseWidget(widget *Widget, wdata string) (err error) {
if err != nil {
return err
}
widget.Literal = true
widget.Body, err = prebuildWidget("widget_simple", tmp)
case "about":
var tmp NameTextPair
@ -88,12 +88,11 @@ func preparseWidget(widget *Widget, wdata string) (err error) {
if err != nil {
return err
}
widget.Literal = true
widget.Body, err = prebuildWidget("widget_about", tmp)
default:
widget.Literal = true
widget.Body = wdata
}
widget.Literal = true
// TODO: Test this
// TODO: Should we toss this through a proper parser rather than crudely replacing it?
@ -117,23 +116,36 @@ func preparseWidget(widget *Widget, wdata string) (err error) {
return err
}
func BuildWidget(dock string, headerVars *HeaderVars) (sbody string) {
func BuildWidget(dock string, header *Header) (sbody string) {
var widgets []*Widget
if !headerVars.Theme.HasDock(dock) {
if !header.Theme.HasDock(dock) {
return ""
}
// Let themes forcibly override this slot
sbody = headerVars.Theme.BuildDock(dock)
sbody = header.Theme.BuildDock(dock)
if sbody != "" {
return sbody
}
fmt.Println("dock: ", dock)
switch dock {
case "leftOfNav":
widgets = Docks.LeftOfNav
case "rightOfNav":
widgets = Docks.RightOfNav
case "topMenu":
fmt.Println("topMenu")
// 1 = id for the default menu
mhold := Menus.Get(1)
if mhold != nil {
fmt.Println("header.Writer: ", header.Writer)
err := mhold.Build(header.Writer, &header.CurrentUser)
if err != nil {
LogError(err)
}
}
return ""
case "rightSidebar":
widgets = Docks.RightSidebar
case "footer":
@ -144,8 +156,8 @@ func BuildWidget(dock string, headerVars *HeaderVars) (sbody string) {
if !widget.Enabled {
continue
}
if widget.Allowed(headerVars.Zone) {
item, err := widget.Build(headerVars)
if widget.Allowed(header.Zone) {
item, err := widget.Build(header)
if err != nil {
LogError(err)
}
@ -156,7 +168,7 @@ func BuildWidget(dock string, headerVars *HeaderVars) (sbody string) {
}
// TODO: Test this
// TODO: Add support for zone:id. Perhaps, carry a ZoneID property around in headerVars? It might allow some weirdness like frontend[5] which matches any zone with an ID of 5 but it would be a tad faster than verifying each zone, although it might be problematic if users end up relying on this behaviour for areas which don't pass IDs to the widgets system but *probably* should
// TODO: Add support for zone:id. Perhaps, carry a ZoneID property around in *Header? It might allow some weirdness like frontend[5] which matches any zone with an ID of 5 but it would be a tad faster than verifying each zone, although it might be problematic if users end up relying on this behaviour for areas which don't pass IDs to the widgets system but *probably* should
func (widget *Widget) Allowed(zone string) bool {
for _, loc := range strings.Split(widget.Location, "|") {
if loc == "global" || loc == zone {
@ -177,8 +189,8 @@ func (widget *Widget) Build(hvars interface{}) (string, error) {
return widget.Body, nil
}
var headerVars = hvars.(*HeaderVars)
err := RunThemeTemplate(headerVars.Theme.Name, widget.Body, hvars, headerVars.Writer)
var header = hvars.(*Header)
err := RunThemeTemplate(header.Theme.Name, widget.Body, hvars, header.Writer)
return "", err
}

View File

@ -35,6 +35,8 @@ echo "Updating GopherJS"
go get -u github.com/gopherjs/gopherjs
echo "Updating Gosora"
rm ./schema/lastSchema.json
cp ./schema/schema.json ./schema/lastSchema.json
git pull origin master
echo "Patching Gosora"

View File

@ -101,6 +101,7 @@ if %errorlevel% neq 0 (
echo Updating Gosora
copy ./schema/schema.json ./schema/lastSchema.json
git pull origin master
if %errorlevel% neq 0 (
pause

View File

@ -52,7 +52,7 @@ type Guild struct {
type Page struct {
Title string
CurrentUser common.User
Header *common.HeaderVars
Header *common.Header
ItemList []*common.TopicsRow
Forum *common.Forum
Guild *Guild
@ -64,14 +64,14 @@ type Page struct {
type ListPage struct {
Title string
CurrentUser common.User
Header *common.HeaderVars
Header *common.Header
GuildList []*Guild
}
type MemberListPage struct {
Title string
CurrentUser common.User
Header *common.HeaderVars
Header *common.Header
ItemList []Member
Guild *Guild
Page int
@ -90,7 +90,7 @@ type Member struct {
User common.User
}
func PrebuildTmplList(user common.User, headerVars *common.HeaderVars) common.CTmpl {
func PrebuildTmplList(user common.User, header *common.Header) common.CTmpl {
var guildList = []*Guild{
&Guild{
ID: 1,
@ -107,13 +107,13 @@ func PrebuildTmplList(user common.User, headerVars *common.HeaderVars) common.CT
Forums: []*common.Forum{common.Forums.DirtyGet(1)},
},
}
listPage := ListPage{"Guild List", user, headerVars, guildList}
listPage := ListPage{"Guild List", user, header, guildList}
return common.CTmpl{"guilds_guild_list", "guilds_guild_list.html", "templates/", "guilds.ListPage", listPage, []string{"./extend/guilds/lib"}}
}
// TODO: Do this properly via the widget system
// TODO: REWRITE THIS
func CommonAreaWidgets(headerVars *common.HeaderVars) {
func CommonAreaWidgets(header *common.Header) {
// TODO: Hot Groups? Featured Groups? Official Groups?
var b bytes.Buffer
var menu = common.WidgetMenu{"Guilds", []common.WidgetMenuItem{
@ -126,16 +126,16 @@ func CommonAreaWidgets(headerVars *common.HeaderVars) {
return
}
if headerVars.Theme.HasDock("leftSidebar") {
headerVars.Widgets.LeftSidebar = template.HTML(string(b.Bytes()))
} else if headerVars.Theme.HasDock("rightSidebar") {
headerVars.Widgets.RightSidebar = template.HTML(string(b.Bytes()))
if header.Theme.HasDock("leftSidebar") {
header.Widgets.LeftSidebar = template.HTML(string(b.Bytes()))
} else if header.Theme.HasDock("rightSidebar") {
header.Widgets.RightSidebar = template.HTML(string(b.Bytes()))
}
}
// TODO: Do this properly via the widget system
// TODO: Make a better more customisable group widget system
func GuildWidgets(headerVars *common.HeaderVars, guildItem *Guild) (success bool) {
func GuildWidgets(header *common.Header, guildItem *Guild) (success bool) {
return false // Disabled until the next commit
/*var b bytes.Buffer
@ -150,10 +150,10 @@ func GuildWidgets(headerVars *common.HeaderVars, guildItem *Guild) (success bool
return false
}
if themes[headerVars.Theme.Name].Sidebars == "left" {
headerVars.Widgets.LeftSidebar = template.HTML(string(b.Bytes()))
} else if themes[headerVars.Theme.Name].Sidebars == "right" || themes[headerVars.Theme.Name].Sidebars == "both" {
headerVars.Widgets.RightSidebar = template.HTML(string(b.Bytes()))
if themes[header.Theme.Name].Sidebars == "left" {
header.Widgets.LeftSidebar = template.HTML(string(b.Bytes()))
} else if themes[header.Theme.Name].Sidebars == "right" || themes[header.Theme.Name].Sidebars == "both" {
header.Widgets.RightSidebar = template.HTML(string(b.Bytes()))
} else {
return false
}
@ -165,11 +165,11 @@ func GuildWidgets(headerVars *common.HeaderVars, guildItem *Guild) (success bool
*/
func RouteGuildList(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
CommonAreaWidgets(headerVars)
CommonAreaWidgets(header)
rows, err := ListStmt.Query()
if err != nil && err != common.ErrNoRows {
@ -192,8 +192,8 @@ func RouteGuildList(w http.ResponseWriter, r *http.Request, user common.User) co
return common.InternalError(err, w, r)
}
pi := ListPage{"Guild List", user, headerVars, guildList}
err = common.RunThemeTemplate(headerVars.Theme.Name, "guilds_guild_list", pi, w)
pi := ListPage{"Guild List", user, header, guildList}
err = common.RunThemeTemplate(header.Theme.Name, "guilds_guild_list", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}
@ -215,7 +215,7 @@ func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user common.User) c
if err != nil {
return common.LocalError("Bad guild", w, r, user)
}
// TODO: Build and pass headerVars
// TODO: Build and pass header
if !guildItem.Active {
return common.NotFound(w, r, nil)
}
@ -229,7 +229,7 @@ func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user common.User) c
}
func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -237,9 +237,9 @@ func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user common.User)
if !user.Loggedin || !user.PluginPerms["CreateGuild"] {
return common.NoPermissions(w, r, user)
}
CommonAreaWidgets(headerVars)
CommonAreaWidgets(header)
pi := common.Page{"Create Guild", user, headerVars, tList, nil}
pi := common.Page{"Create Guild", user, header, tList, nil}
err := common.Templates.ExecuteTemplate(w, "guilds_create_guild.html", pi)
if err != nil {
return common.InternalError(err, w, r)
@ -298,7 +298,7 @@ func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user common.
}
func RouteMemberList(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -319,7 +319,7 @@ func RouteMemberList(w http.ResponseWriter, r *http.Request, user common.User) c
}
guildItem.Link = BuildGuildURL(common.NameToSlug(guildItem.Name), guildItem.ID)
GuildWidgets(headerVars, guildItem)
GuildWidgets(header, guildItem)
rows, err := MemberListJoinStmt.Query(guildID)
if err != nil && err != common.ErrNoRows {
@ -356,12 +356,12 @@ func RouteMemberList(w http.ResponseWriter, r *http.Request, user common.User) c
}
rows.Close()
pi := MemberListPage{"Guild Member List", user, headerVars, guildMembers, guildItem, 0, 0}
pi := MemberListPage{"Guild Member List", user, header, guildMembers, guildItem, 0, 0}
// A plugin with plugins. Pluginception!
if common.RunPreRenderHook("pre_render_guilds_member_list", w, r, &user, &pi) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "guilds_member_list", pi, w)
err = common.RunThemeTemplate(header.Theme.Name, "guilds_member_list", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}
@ -445,7 +445,7 @@ func ForumCheck(args ...interface{}) (skip bool, rerr common.RouteError) {
return true, common.InternalError(errors.New("Unable to find the parent group for a forum"), w, r)
}
if !guildItem.Active {
return true, common.NotFound(w, r, nil) // TODO: Can we pull headerVars out of args?
return true, common.NotFound(w, r, nil) // TODO: Can we pull header out of args?
}
r = r.WithContext(context.WithValue(r.Context(), "guilds_current_group", guildItem))
}
@ -496,7 +496,7 @@ func ForumCheck(args ...interface{}) (skip bool, rerr common.RouteError) {
func Widgets(args ...interface{}) interface{} {
var zone = args[0].(string)
var headerVars = args[2].(*common.HeaderVars)
var header = args[2].(*common.Header)
var request = args[3].(*http.Request)
if zone != "view_forum" {
@ -512,12 +512,12 @@ func Widgets(args ...interface{}) interface{} {
return false
}
if headerVars.ExtData.Items == nil {
headerVars.ExtData.Items = make(map[string]interface{})
if header.ExtData.Items == nil {
header.ExtData.Items = make(map[string]interface{})
}
headerVars.ExtData.Items["guilds_current_group"] = guildItem
header.ExtData.Items["guilds_current_group"] = guildItem
return GuildWidgets(headerVars, guildItem)
return GuildWidgets(header, guildItem)
}
return false
}

View File

@ -76,7 +76,7 @@ func _gen_mysql() (err error) {
}
common.DebugLog("Preparing getUsersOffset statement.")
stmts.getUsersOffset, err = db.Prepare("SELECT `uid`,`name`,`group`,`active`,`is_super_admin`,`avatar` FROM `users` ORDER BY uid ASC LIMIT ?,?")
stmts.getUsersOffset, err = db.Prepare("SELECT `uid`,`name`,`group`,`active`,`is_super_admin`,`avatar` FROM `users` ORDER BY `uid` ASC LIMIT ?,?")
if err != nil {
log.Print("Error in getUsersOffset statement.")
return err
@ -97,14 +97,14 @@ func _gen_mysql() (err error) {
}
common.DebugLog("Preparing getModlogsOffset statement.")
stmts.getModlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `moderation_logs` ORDER BY doneAt DESC LIMIT ?,?")
stmts.getModlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `moderation_logs` ORDER BY `doneAt` DESC LIMIT ?,?")
if err != nil {
log.Print("Error in getModlogsOffset statement.")
return err
}
common.DebugLog("Preparing getAdminlogsOffset statement.")
stmts.getAdminlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `administration_logs` ORDER BY doneAt DESC LIMIT ?,?")
stmts.getAdminlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `administration_logs` ORDER BY `doneAt` DESC LIMIT ?,?")
if err != nil {
log.Print("Error in getAdminlogsOffset statement.")
return err
@ -139,14 +139,14 @@ func _gen_mysql() (err error) {
}
common.DebugLog("Preparing forumEntryExists statement.")
stmts.forumEntryExists, err = db.Prepare("SELECT `fid` FROM `forums` WHERE `name` = '' ORDER BY fid ASC LIMIT 0,1")
stmts.forumEntryExists, err = db.Prepare("SELECT `fid` FROM `forums` WHERE `name` = '' ORDER BY `fid` ASC LIMIT 0,1")
if err != nil {
log.Print("Error in forumEntryExists statement.")
return err
}
common.DebugLog("Preparing groupEntryExists statement.")
stmts.groupEntryExists, err = db.Prepare("SELECT `gid` FROM `users_groups` WHERE `name` = '' ORDER BY gid ASC LIMIT 0,1")
stmts.groupEntryExists, err = db.Prepare("SELECT `gid` FROM `users_groups` WHERE `name` = '' ORDER BY `gid` ASC LIMIT 0,1")
if err != nil {
log.Print("Error in groupEntryExists statement.")
return err
@ -160,7 +160,7 @@ func _gen_mysql() (err error) {
}
common.DebugLog("Preparing getForumTopics statement.")
stmts.getForumTopics, err = db.Prepare("SELECT `topics`.`tid`, `topics`.`title`, `topics`.`content`, `topics`.`createdBy`, `topics`.`is_closed`, `topics`.`sticky`, `topics`.`createdAt`, `topics`.`lastReplyAt`, `topics`.`parentID`, `users`.`name`, `users`.`avatar` FROM `topics` LEFT JOIN `users` ON `topics`.`createdBy` = `users`.`uid` WHERE `topics`.`parentID` = ? ORDER BY topics.sticky DESC,topics.lastReplyAt DESC,topics.createdBy DESC")
stmts.getForumTopics, err = db.Prepare("SELECT `topics`.`tid`, `topics`.`title`, `topics`.`content`, `topics`.`createdBy`, `topics`.`is_closed`, `topics`.`sticky`, `topics`.`createdAt`, `topics`.`lastReplyAt`, `topics`.`parentID`, `users`.`name`, `users`.`avatar` FROM `topics` LEFT JOIN `users` ON `topics`.`createdBy` = `users`.`uid` WHERE `topics`.`parentID` = ? ORDER BY `topics`.`sticky` DESC,`topics`.`lastReplyAt` DESC,`topics`.`createdBy` DESC")
if err != nil {
log.Print("Error in getForumTopics statement.")
return err

View File

@ -649,6 +649,8 @@
"panel_backups_download":"Download",
"panel_backups_no_backups":"There aren't any backups available at this time.",
"panel_debug_head":"Debug",
"panel_debug_go_version_label":"Go Version",
"panel_debug_database_version_label":"DB Version",
"panel_debug_uptime_label":"Uptime",
"panel_debug_open_database_connections_label":"Open DB Conns",
"panel_debug_adapter_label":"Adapter"

17
main.go
View File

@ -7,6 +7,7 @@
package main
import (
"bytes"
"flag"
"fmt"
"io"
@ -70,6 +71,18 @@ func afterDBInit() (err error) {
return err
}
log.Print("Initialising the menu item list")
common.Menus = common.NewDefaultMenuStore()
err = common.Menus.Load(1) // 1 = the default menu
if err != nil {
return err
}
menuHold := common.Menus.Get(1)
fmt.Println("menuHold: %+v", menuHold)
var b bytes.Buffer
menuHold.Build(&b, &common.GuestUser)
fmt.Println("menuHold output: ", string(b.Bytes()))
log.Print("Initialising the authentication system")
common.Auth, err = common.NewDefaultAuth()
if err != nil {
@ -225,6 +238,10 @@ func main() {
if err != nil {
log.Fatal(err)
}
err = common.CompileJSTemplates()
if err != nil {
log.Fatal(err)
}
return
}

View File

@ -12,6 +12,7 @@ import (
"net/http"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
"time"
@ -1747,7 +1748,7 @@ func routePanelUsers(w http.ResponseWriter, r *http.Request, user common.User) c
}
pageList := common.Paginate(stats.Users, perPage, 5)
pi := common.PanelUserPage{common.GetTitlePhrase("panel_users"), user, headerVars, stats, "users", userList, pageList, page, lastPage}
pi := common.PanelUserPage{common.GetTitlePhrase("panel_users"), user, headerVars, stats, "users", userList, common.Paginator{pageList, page, lastPage}}
return panelRenderTemplate("panel_users", w, r, user, &pi)
}
@ -1940,7 +1941,7 @@ func routePanelGroups(w http.ResponseWriter, r *http.Request, user common.User)
//log.Printf("groupList: %+v\n", groupList)
pageList := common.Paginate(stats.Groups, perPage, 5)
pi := common.PanelGroupPage{common.GetTitlePhrase("panel_groups"), user, headerVars, stats, "groups", groupList, pageList, page, lastPage}
pi := common.PanelGroupPage{common.GetTitlePhrase("panel_groups"), user, headerVars, stats, "groups", groupList, common.Paginator{pageList, page, lastPage}}
return panelRenderTemplate("panel_groups", w, r, user, &pi)
}
@ -2517,7 +2518,7 @@ func routePanelLogsMod(w http.ResponseWriter, r *http.Request, user common.User)
}
pageList := common.Paginate(logCount, perPage, 5)
pi := common.PanelLogsPage{common.GetTitlePhrase("panel_mod_logs"), user, headerVars, stats, "logs", logs, pageList, page, lastPage}
pi := common.PanelLogsPage{common.GetTitlePhrase("panel_mod_logs"), user, headerVars, stats, "logs", logs, common.Paginator{pageList, page, lastPage}}
return panelRenderTemplate("panel_modlogs", w, r, user, &pi)
}
@ -2557,7 +2558,7 @@ func routePanelLogsAdmin(w http.ResponseWriter, r *http.Request, user common.Use
}
pageList := common.Paginate(logCount, perPage, 5)
pi := common.PanelLogsPage{common.GetTitlePhrase("panel_admin_logs"), user, headerVars, stats, "logs", logs, pageList, page, lastPage}
pi := common.PanelLogsPage{common.GetTitlePhrase("panel_admin_logs"), user, headerVars, stats, "logs", logs, common.Paginator{pageList, page, lastPage}}
return panelRenderTemplate("panel_adminlogs", w, r, user, &pi)
}
@ -2567,6 +2568,8 @@ func routePanelDebug(w http.ResponseWriter, r *http.Request, user common.User) c
return ferr
}
goVersion := runtime.Version()
dbVersion := qgen.Builder.DbVersion()
var uptime string
upDuration := time.Since(startTime)
hours := int(upDuration.Hours())
@ -2586,6 +2589,6 @@ func routePanelDebug(w http.ResponseWriter, r *http.Request, user common.User) c
// Disk I/O?
// TODO: Fetch the adapter from Builder rather than getting it from a global?
pi := common.PanelDebugPage{common.GetTitlePhrase("panel_debug"), user, headerVars, stats, "debug", uptime, openConnCount, dbAdapter}
pi := common.PanelDebugPage{common.GetTitlePhrase("panel_debug"), user, headerVars, stats, "debug", goVersion, dbVersion, uptime, openConnCount, dbAdapter}
return panelRenderTemplate("panel_debug", w, r, user, &pi)
}

View File

@ -2,6 +2,7 @@ package main
import (
"bufio"
"database/sql"
"fmt"
"os"
"runtime/debug"
@ -63,28 +64,13 @@ func patcher(scanner *bufio.Scanner) error {
func eachUser(handle func(int) error) error {
acc := qgen.Builder.Accumulator()
stmt := acc.Select("users").Prepare()
err := acc.FirstError()
if err != nil {
return err
}
rows, err := stmt.Query()
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
err := acc.Select("users").Each(func(rows *sql.Rows) error {
var uid int
err := rows.Scan(&uid)
if err != nil {
return err
}
err = handle(uid)
if err != nil {
return handle(uid)
})
return err
}
}
return rows.Err()
}

View File

@ -17,7 +17,7 @@ func deactivateHeythere() {
}
func heythereReply(data ...interface{}) interface{} {
currentUser := data[0].(*common.TopicPage).CurrentUser
currentUser := data[0].(*common.TopicPage).Header.CurrentUser
reply := data[1].(*common.ReplyUser)
reply.Content = "Hey there, " + currentUser.Name + "!"
reply.ContentHtml = "Hey there, " + currentUser.Name + "!"

View File

@ -49,25 +49,25 @@ func (update *accUpdateBuilder) Prepare() *sql.Stmt {
return update.build.SimpleUpdate(update.table, update.set, update.where)
}
type accSelectBuilder struct {
type AccSelectBuilder struct {
table string
columns string
where string
orderby string
limit string
dateCutoff *dateCutoff // We might want to do this in a slightly less hacky way
inChain *accSelectBuilder
inChain *AccSelectBuilder
inColumn string
build *Accumulator
}
func (selectItem *accSelectBuilder) Columns(columns string) *accSelectBuilder {
func (selectItem *AccSelectBuilder) Columns(columns string) *AccSelectBuilder {
selectItem.columns = columns
return selectItem
}
func (selectItem *accSelectBuilder) Where(where string) *accSelectBuilder {
func (selectItem *AccSelectBuilder) Where(where string) *AccSelectBuilder {
if selectItem.where != "" {
selectItem.where += " AND "
}
@ -76,7 +76,7 @@ func (selectItem *accSelectBuilder) Where(where string) *accSelectBuilder {
}
// TODO: Don't implement the SQL at the accumulator level but the adapter level
func (selectItem *accSelectBuilder) In(column string, inList []int) *accSelectBuilder {
func (selectItem *AccSelectBuilder) In(column string, inList []int) *AccSelectBuilder {
if len(inList) == 0 {
return selectItem
}
@ -94,28 +94,28 @@ func (selectItem *accSelectBuilder) In(column string, inList []int) *accSelectBu
return selectItem
}
func (selectItem *accSelectBuilder) InQ(column string, subBuilder *accSelectBuilder) *accSelectBuilder {
func (selectItem *AccSelectBuilder) InQ(column string, subBuilder *AccSelectBuilder) *AccSelectBuilder {
selectItem.inChain = subBuilder
selectItem.inColumn = column
return selectItem
}
func (selectItem *accSelectBuilder) DateCutoff(column string, quantity int, unit string) *accSelectBuilder {
func (selectItem *AccSelectBuilder) DateCutoff(column string, quantity int, unit string) *AccSelectBuilder {
selectItem.dateCutoff = &dateCutoff{column, quantity, unit}
return selectItem
}
func (selectItem *accSelectBuilder) Orderby(orderby string) *accSelectBuilder {
func (selectItem *AccSelectBuilder) Orderby(orderby string) *AccSelectBuilder {
selectItem.orderby = orderby
return selectItem
}
func (selectItem *accSelectBuilder) Limit(limit string) *accSelectBuilder {
func (selectItem *AccSelectBuilder) Limit(limit string) *AccSelectBuilder {
selectItem.limit = limit
return selectItem
}
func (selectItem *accSelectBuilder) Prepare() *sql.Stmt {
func (selectItem *AccSelectBuilder) Prepare() *sql.Stmt {
// TODO: Phase out the procedural API and use the adapter's OO API? The OO API might need a bit more work before we do that and it needs to be rolled out to MSSQL.
if selectItem.dateCutoff != nil || selectItem.inChain != nil {
selectBuilder := selectItem.build.GetAdapter().Builder().Select().FromAcc(selectItem)
@ -124,7 +124,7 @@ func (selectItem *accSelectBuilder) Prepare() *sql.Stmt {
return selectItem.build.SimpleSelect(selectItem.table, selectItem.columns, selectItem.where, selectItem.orderby, selectItem.limit)
}
func (selectItem *accSelectBuilder) Query(args ...interface{}) (*sql.Rows, error) {
func (selectItem *AccSelectBuilder) Query(args ...interface{}) (*sql.Rows, error) {
stmt := selectItem.Prepare()
if stmt != nil {
return stmt.Query(args...)
@ -132,6 +132,23 @@ func (selectItem *accSelectBuilder) Query(args ...interface{}) (*sql.Rows, error
return nil, selectItem.build.FirstError()
}
// Experimental, reduces lines
func (selectItem *AccSelectBuilder) Each(handle func(*sql.Rows) error) error {
rows, err := selectItem.Query()
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
err = handle(rows)
if err != nil {
return err
}
}
return rows.Err()
}
type accInsertBuilder struct {
table string
columns string

View File

@ -197,8 +197,8 @@ func (build *Accumulator) Update(table string) *accUpdateBuilder {
return &accUpdateBuilder{table, "", "", build}
}
func (build *Accumulator) Select(table string) *accSelectBuilder {
return &accSelectBuilder{table, "", "", "", "", nil, nil, "", build}
func (build *Accumulator) Select(table string) *AccSelectBuilder {
return &AccSelectBuilder{table, "", "", "", "", nil, nil, "", build}
}
func (build *Accumulator) Insert(table string) *accInsertBuilder {

View File

@ -142,7 +142,7 @@ func (selectItem *selectPrebuilder) Limit(limit string) *selectPrebuilder {
}
// TODO: We probably want to avoid the double allocation of two builders somehow
func (selectItem *selectPrebuilder) FromAcc(accBuilder *accSelectBuilder) *selectPrebuilder {
func (selectItem *selectPrebuilder) FromAcc(accBuilder *AccSelectBuilder) *selectPrebuilder {
selectItem.table = accBuilder.table
selectItem.columns = accBuilder.columns
selectItem.where = accBuilder.where

View File

@ -135,14 +135,13 @@ func (adapter *MssqlAdapter) SimpleInsert(name string, table string, columns str
if table == "" {
return "", errors.New("You need a name for this table")
}
if len(columns) == 0 {
return "", errors.New("No columns found for SimpleInsert")
}
if len(fields) == 0 {
return "", errors.New("No input data found for SimpleInsert")
}
var querystr = "INSERT INTO [" + table + "] ("
var querystr = "INSERT INTO [" + table + "]"
if columns == "" {
adapter.pushStatement(name, "insert", querystr)
return querystr, nil
}
querystr += " ("
// Escape the column names, just in case we've used a reserved keyword
for _, column := range processColumns(columns) {

View File

@ -143,14 +143,10 @@ func (adapter *MysqlAdapter) SimpleInsert(name string, table string, columns str
if table == "" {
return "", errors.New("You need a name for this table")
}
if len(columns) == 0 {
return "", errors.New("No columns found for SimpleInsert")
}
if len(fields) == 0 {
return "", errors.New("No input data found for SimpleInsert")
}
var querystr = "INSERT INTO `" + table + "`(" + adapter.buildColumns(columns) + ") VALUES ("
var querystr = "INSERT INTO `" + table + "`"
if columns != "" {
querystr += "(" + adapter.buildColumns(columns) + ") VALUES ("
for _, field := range processFields(fields) {
nameLen := len(field.Name)
if field.Name[0] == '"' && field.Name[nameLen-1] == '"' && nameLen >= 3 {
@ -162,12 +158,16 @@ func (adapter *MysqlAdapter) SimpleInsert(name string, table string, columns str
querystr += field.Name + ","
}
querystr = querystr[0:len(querystr)-1] + ")"
}
adapter.pushStatement(name, "insert", querystr)
return querystr, nil
}
func (adapter *MysqlAdapter) buildColumns(columns string) (querystr string) {
if columns == "" {
return ""
}
// Escape the column names, just in case we've used a reserved keyword
for _, column := range processColumns(columns) {
if column.Type == "function" {
@ -393,7 +393,7 @@ func (adapter *MysqlAdapter) buildOrderby(orderby string) (querystr string) {
querystr = " ORDER BY "
for _, column := range processOrderby(orderby) {
// TODO: We might want to escape this column
querystr += column.Column + " " + strings.ToUpper(column.Order) + ","
querystr += "`" + strings.Replace(column.Column, ".", "`.`", -1) + "` " + strings.ToUpper(column.Order) + ","
}
querystr = querystr[0 : len(querystr)-1]
}

View File

@ -115,12 +115,6 @@ func (adapter *PgsqlAdapter) SimpleInsert(name string, table string, columns str
if table == "" {
return "", errors.New("You need a name for this table")
}
if len(columns) == 0 {
return "", errors.New("No columns found for SimpleInsert")
}
if len(fields) == 0 {
return "", errors.New("No input data found for SimpleInsert")
}
return "", nil
}

View File

@ -209,6 +209,32 @@ func seedTables(adapter qgen.Adapter) error {
qgen.Install.SimpleInsert("replies", "tid, content, parsed_content, createdAt, createdBy, lastUpdated, lastEdit, lastEditBy, ipaddress", "1,'A reply!','A reply!',UTC_TIMESTAMP(),1,UTC_TIMESTAMP(),0,0,'::1'")
/*
{{range .MenuItems}}
<li id="menu_{{.ID}}" class="menu_{{.Position}}"><a href="{{.Path}}" aria-label="{{.Aria}}" title="{{.Tooltip}}"></a></li>
{{end}}
<li class="menu_left menu_topics"><a href="/" aria-label="{{lang "menu_topics_aria"}}" title="{{lang "menu_topics_tooltip"}}"></a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter" aria-label="{{lang "menu_alert_counter_aria"}}"></div>
<div class="alert_aftercounter"></div>
<div class="alertList" aria-label="{{lang "menu_alert_list_aria"}}"></div>
</li>
qgen.DBTableColumn{"guestOnly", "boolean", 1, false, false, "0"},
qgen.DBTableColumn{"memberOnly", "boolean", 1, false, false, "0"},
qgen.DBTableColumn{"staffOnly", "boolean", 1, false, false, "0"},
qgen.DBTableColumn{"adminOnly", "boolean", 1, false, false, "0"},
*/
qgen.Install.SimpleInsert("menus", "", "")
qgen.Install.SimpleInsert("menu_items", "mid, htmlID, position, path, aria, tooltip, order", "1,'menu_forums','left','/forums/','{lang.menu_forums_aria}','{lang.menu_forums_tooltip}',0")
qgen.Install.SimpleInsert("menu_items", "mid, htmlID, cssClass, position, path, aria, tooltip, order", "1,'menu_topics','menu_topics','left','/topics/','{lang.menu_topics_aria}','{lang.menu_topics_tooltip}',1")
qgen.Install.SimpleInsert("menu_items", "mid, htmlID, cssClass, position, tmplName, order", "1,'general_alerts','menu_alerts','right','menu_alerts',2")
return nil
}

View File

@ -379,6 +379,35 @@ func createTables(adapter qgen.Adapter) error {
[]qgen.DBTableKey{},
)
qgen.Install.CreateTable("menus", "", "",
[]qgen.DBTableColumn{
qgen.DBTableColumn{"mid", "int", 0, false, true, ""},
},
[]qgen.DBTableKey{
qgen.DBTableKey{"mid", "primary"},
},
)
qgen.Install.CreateTable("menu_items", "", "",
[]qgen.DBTableColumn{
qgen.DBTableColumn{"mid", "int", 0, false, false, ""},
qgen.DBTableColumn{"htmlID", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"cssClass", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"position", "varchar", 100, false, false, ""},
qgen.DBTableColumn{"path", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"aria", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"tooltip", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"tmplName", "varchar", 200, false, false, "''"},
qgen.DBTableColumn{"order", "int", 0, false, false, "0"},
qgen.DBTableColumn{"guestOnly", "boolean", 0, false, false, "0"},
qgen.DBTableColumn{"memberOnly", "boolean", 0, false, false, "0"},
qgen.DBTableColumn{"staffOnly", "boolean", 0, false, false, "0"},
qgen.DBTableColumn{"adminOnly", "boolean", 0, false, false, "0"},
},
[]qgen.DBTableKey{},
)
/*
qgen.Install.CreateTable("registration_logs", "", "",
[]qgen.DBTableColumn{

View File

@ -1,6 +1,6 @@
package main
// TODO: How should we handle headerLite and headerVar?
// TODO: How should we handle *HeaderLite and *Header?
func routes() {
addRoute(View("routeAPI", "/api/"))
addRoute(View("routes.Overview", "/overview/"))

View File

@ -15,18 +15,18 @@ import (
var tList []interface{}
func AccountLogin(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
if user.Loggedin {
return common.LocalError("You're already logged in.", w, r, user)
}
pi := common.Page{common.GetTitlePhrase("login"), user, headerVars, tList, nil}
pi := common.Page{common.GetTitlePhrase("login"), user, header, tList, nil}
if common.RunPreRenderHook("pre_render_login", w, r, &user, &pi) {
return nil
}
err := common.RunThemeTemplate(headerVars.Theme.Name, "login", pi, w)
err := common.RunThemeTemplate(header.Theme.Name, "login", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}
@ -74,18 +74,18 @@ func AccountLoginSubmit(w http.ResponseWriter, r *http.Request, user common.User
}
func AccountRegister(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
if user.Loggedin {
return common.LocalError("You're already logged in.", w, r, user)
}
pi := common.Page{common.GetTitlePhrase("register"), user, headerVars, tList, nil}
pi := common.Page{common.GetTitlePhrase("register"), user, header, tList, nil}
if common.RunPreRenderHook("pre_render_register", w, r, &user, &pi) {
return nil
}
err := common.RunThemeTemplate(headerVars.Theme.Name, "register", pi, w)
err := common.RunThemeTemplate(header.Theme.Name, "register", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}
@ -169,12 +169,12 @@ func AccountRegisterSubmit(w http.ResponseWriter, r *http.Request, user common.U
}
func AccountEditCritical(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
pi := common.Page{"Edit Password", user, headerVars, tList, nil}
pi := common.Page{"Edit Password", user, header, tList, nil}
if common.RunPreRenderHook("pre_render_account_own_edit_critical", w, r, &user, &pi) {
return nil
}

View File

@ -40,19 +40,19 @@ func ViewForum(w http.ResponseWriter, r *http.Request, user common.User, sfid st
return common.PreError("The provided ForumID is not a valid number.", w, r)
}
headerVars, ferr := common.ForumUserCheck(w, r, &user, fid)
header, ferr := common.ForumUserCheck(w, r, &user, fid)
if ferr != nil {
return ferr
}
if !user.Perms.ViewTopic {
return common.NoPermissions(w, r, user)
}
headerVars.Zone = "view_forum"
header.Zone = "view_forum"
// TODO: Fix this double-check
forum, err := common.Forums.Get(fid)
if err == sql.ErrNoRows {
return common.NotFound(w, r, headerVars)
return common.NotFound(w, r, header)
} else if err != nil {
return common.InternalError(err, w, r)
}
@ -112,11 +112,11 @@ func ViewForum(w http.ResponseWriter, r *http.Request, user common.User, sfid st
}
pageList := common.Paginate(forum.TopicCount, common.Config.ItemsPerPage, 5)
pi := common.ForumPage{forum.Name, user, headerVars, topicList, forum, pageList, page, lastPage}
pi := common.ForumPage{forum.Name, user, header, topicList, forum, common.Paginator{pageList, page, lastPage}}
if common.RunPreRenderHook("pre_render_forum", w, r, &user, &pi) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "forum", pi, w)
err = common.RunThemeTemplate(header.Theme.Name, "forum", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}

View File

@ -8,12 +8,12 @@ import (
)
func ForumList(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
headerVars.Zone = "forums"
headerVars.MetaDesc = headerVars.Settings["meta_desc"].(string)
header.Zone = "forums"
header.MetaDesc = header.Settings["meta_desc"].(string)
var err error
var forumList []common.Forum
@ -50,11 +50,11 @@ func ForumList(w http.ResponseWriter, r *http.Request, user common.User) common.
}
}
pi := common.ForumsPage{common.GetTitlePhrase("forums"), user, headerVars, forumList}
pi := common.ForumsPage{common.GetTitlePhrase("forums"), user, header, forumList}
if common.RunPreRenderHook("pre_render_forum_list", w, r, &user, &pi) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "forums", pi, w)
err = common.RunThemeTemplate(header.Theme.Name, "forums", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}

View File

@ -45,13 +45,13 @@ func StaticFile(w http.ResponseWriter, r *http.Request) {
}
func Overview(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
headerVars.Zone = "overview"
header.Zone = "overview"
pi := common.Page{common.GetTitlePhrase("overview"), user, headerVars, tList, nil}
pi := common.Page{common.GetTitlePhrase("overview"), user, header, tList, nil}
if common.RunPreRenderHook("pre_render_overview", w, r, &user, &pi) {
return nil
}
@ -63,18 +63,18 @@ func Overview(w http.ResponseWriter, r *http.Request, user common.User) common.R
}
func CustomPage(w http.ResponseWriter, r *http.Request, user common.User, name string) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
headerVars.Zone = "custom_page"
header.Zone = "custom_page"
// ! Is this safe?
if common.Templates.Lookup("page_"+name+".html") == nil {
return common.NotFound(w, r, headerVars)
return common.NotFound(w, r, header)
}
pi := common.Page{common.GetTitlePhrase("page"), user, headerVars, tList, nil}
pi := common.Page{common.GetTitlePhrase("page"), user, header, tList, nil}
// TODO: Pass the page name to the pre-render hook?
if common.RunPreRenderHook("pre_render_custom_page", w, r, &user, &pi) {
return nil

View File

@ -8,7 +8,7 @@ import (
)
func IPSearch(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -30,11 +30,11 @@ func IPSearch(w http.ResponseWriter, r *http.Request, user common.User) common.R
return common.InternalError(err, w, r)
}
pi := common.IPSearchPage{common.GetTitlePhrase("ip_search"), user, headerVars, userList, ip}
pi := common.IPSearchPage{common.GetTitlePhrase("ip_search"), user, header, userList, ip}
if common.RunPreRenderHook("pre_render_ip_search", w, r, &user, &pi) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "ip_search", pi, w)
err = common.RunThemeTemplate(header.Theme.Name, "ip_search", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}

View File

@ -28,7 +28,7 @@ func init() {
}
func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -59,7 +59,7 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User) commo
// TODO: Add a shared function for checking for ErrNoRows and internal erroring if it's not that case?
puser, err = common.Users.Get(pid)
if err == sql.ErrNoRows {
return common.NotFound(w, r, headerVars)
return common.NotFound(w, r, header)
} else if err != nil {
return common.InternalError(err, w, r)
}
@ -113,12 +113,12 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User) commo
}
// TODO: Add a phrase for this title
ppage := common.ProfilePage{puser.Name + "'s Profile", user, headerVars, replyList, *puser}
ppage := common.ProfilePage{puser.Name + "'s Profile", user, header, replyList, *puser}
if common.RunPreRenderHook("pre_render_profile", w, r, &user, &ppage) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "profile", ppage, w)
err = common.RunThemeTemplate(header.Theme.Name, "profile", ppage, w)
if err != nil {
return common.InternalError(err, w, r)
}

View File

@ -9,12 +9,13 @@ import (
)
func TopicList(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError {
headerVars, ferr := common.UserCheck(w, r, &user)
header, ferr := common.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
headerVars.Zone = "topics"
headerVars.MetaDesc = headerVars.Settings["meta_desc"].(string)
header.Title = common.GetTitlePhrase("topics")
header.Zone = "topics"
header.MetaDesc = header.Settings["meta_desc"].(string)
group, err := common.Groups.Get(user.Group)
if err != nil {
@ -28,29 +29,26 @@ func TopicList(w http.ResponseWriter, r *http.Request, user common.User) common.
// TODO: Pass a struct back rather than passing back so many variables
var topicList []*common.TopicsRow
var forumList []common.Forum
var pageList []int
var lastPage int
var paginator common.Paginator
if user.IsSuperAdmin {
topicList, forumList, pageList, page, lastPage, err = common.TopicList.GetList(page)
topicList, forumList, paginator, err = common.TopicList.GetList(page)
} else {
topicList, forumList, pageList, page, lastPage, err = common.TopicList.GetListByGroup(group, page)
topicList, forumList, paginator, err = common.TopicList.GetListByGroup(group, page)
}
if err != nil {
return common.InternalError(err, w, r)
}
// ! Need an inline error not a page level error
//log.Printf("topicList: %+v\n", topicList)
//log.Printf("forumList: %+v\n", forumList)
if len(topicList) == 0 {
return common.NotFound(w, r, headerVars)
return common.NotFound(w, r, header)
}
pi := common.TopicsPage{common.GetTitlePhrase("topics"), user, headerVars, topicList, forumList, common.Config.DefaultForum, pageList, page, lastPage}
pi := common.TopicListPage{header, topicList, forumList, common.Config.DefaultForum, paginator}
if common.RunPreRenderHook("pre_render_topic_list", w, r, &user, &pi) {
return nil
}
err = common.RunThemeTemplate(headerVars.Theme.Name, "topics", pi, w)
err = common.RunThemeTemplate(header.Theme.Name, "topics", pi, w)
if err != nil {
return common.InternalError(err, w, r)
}

View File

@ -28,3 +28,7 @@ INSERT INTO [forums_permissions] ([gid],[fid],[permissions]) VALUES (5,2,'{"View
INSERT INTO [forums_permissions] ([gid],[fid],[permissions]) VALUES (6,2,'{"ViewTopic":true}');
INSERT INTO [topics] ([title],[content],[parsed_content],[createdAt],[lastReplyAt],[lastReplyBy],[createdBy],[parentID],[ipaddress]) VALUES ('TestTopic','Atopicautomaticallygeneratedbythesoftware.','Atopicautomaticallygeneratedbythesoftware.',GETUTCDATE(),GETUTCDATE(),1,1,2,'::1');
INSERT INTO [replies] ([tid],[content],[parsed_content],[createdAt],[createdBy],[lastUpdated],[lastEdit],[lastEditBy],[ipaddress]) VALUES (1,'Areply!','Areply!',GETUTCDATE(),1,GETUTCDATE(),0,0,'::1');
INSERT INTO [menus];
INSERT INTO [menu_items] ([mid],[htmlID],[position],[path],[aria],[tooltip],[order]) VALUES (1,'menu_forums','left','/forums/','{lang.menu_forums_aria}','{lang.menu_forums_tooltip}',0);
INSERT INTO [menu_items] ([mid],[htmlID],[cssClass],[position],[path],[aria],[tooltip],[order]) VALUES (1,'menu_topics','menu_topics','left','/topics/','{lang.menu_topics_aria}','{lang.menu_topics_tooltip}',1);
INSERT INTO [menu_items] ([mid],[htmlID],[cssClass],[position],[tmplName],[order]) VALUES (1,'general_alerts','menu_alerts','right','menu_alerts',2);

View File

@ -0,0 +1,15 @@
CREATE TABLE [menu_items] (
[mid] int not null,
[htmlID] nvarchar (200) DEFAULT '' not null,
[cssClass] nvarchar (200) DEFAULT '' not null,
[position] nvarchar (100) not null,
[path] nvarchar (200) DEFAULT '' not null,
[aria] nvarchar (200) DEFAULT '' not null,
[tooltip] nvarchar (200) DEFAULT '' not null,
[tmplName] nvarchar (200) DEFAULT '' not null,
[order] int DEFAULT 0 not null,
[guestOnly] bit DEFAULT 0 not null,
[memberOnly] bit DEFAULT 0 not null,
[staffOnly] bit DEFAULT 0 not null,
[adminOnly] bit DEFAULT 0 not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE [menus] (
[mid] int not null IDENTITY,
primary key([mid])
);

View File

@ -28,3 +28,7 @@ INSERT INTO `forums_permissions`(`gid`,`fid`,`permissions`) VALUES (5,2,'{"ViewT
INSERT INTO `forums_permissions`(`gid`,`fid`,`permissions`) VALUES (6,2,'{"ViewTopic":true}');
INSERT INTO `topics`(`title`,`content`,`parsed_content`,`createdAt`,`lastReplyAt`,`lastReplyBy`,`createdBy`,`parentID`,`ipaddress`) VALUES ('TestTopic','Atopicautomaticallygeneratedbythesoftware.','Atopicautomaticallygeneratedbythesoftware.',UTC_TIMESTAMP(),UTC_TIMESTAMP(),1,1,2,'::1');
INSERT INTO `replies`(`tid`,`content`,`parsed_content`,`createdAt`,`createdBy`,`lastUpdated`,`lastEdit`,`lastEditBy`,`ipaddress`) VALUES (1,'Areply!','Areply!',UTC_TIMESTAMP(),1,UTC_TIMESTAMP(),0,0,'::1');
INSERT INTO `menus`;
INSERT INTO `menu_items`(`mid`,`htmlID`,`position`,`path`,`aria`,`tooltip`,`order`) VALUES (1,'menu_forums','left','/forums/','{lang.menu_forums_aria}','{lang.menu_forums_tooltip}',0);
INSERT INTO `menu_items`(`mid`,`htmlID`,`cssClass`,`position`,`path`,`aria`,`tooltip`,`order`) VALUES (1,'menu_topics','menu_topics','left','/topics/','{lang.menu_topics_aria}','{lang.menu_topics_tooltip}',1);
INSERT INTO `menu_items`(`mid`,`htmlID`,`cssClass`,`position`,`tmplName`,`order`) VALUES (1,'general_alerts','menu_alerts','right','menu_alerts',2);

View File

@ -0,0 +1,15 @@
CREATE TABLE `menu_items` (
`mid` int not null,
`htmlID` varchar(200) DEFAULT '' not null,
`cssClass` varchar(200) DEFAULT '' not null,
`position` varchar(100) not null,
`path` varchar(200) DEFAULT '' not null,
`aria` varchar(200) DEFAULT '' not null,
`tooltip` varchar(200) DEFAULT '' not null,
`tmplName` varchar(200) DEFAULT '' not null,
`order` int DEFAULT 0 not null,
`guestOnly` boolean DEFAULT 0 not null,
`memberOnly` boolean DEFAULT 0 not null,
`staffOnly` boolean DEFAULT 0 not null,
`adminOnly` boolean DEFAULT 0 not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE `menus` (
`mid` int not null AUTO_INCREMENT,
primary key(`mid`)
);

View File

@ -28,3 +28,7 @@
;
;
;
;
;
;
;

View File

@ -0,0 +1,15 @@
CREATE TABLE `menu_items` (
`mid` int not null,
`htmlID` varchar (200) DEFAULT '' not null,
`cssClass` varchar (200) DEFAULT '' not null,
`position` varchar (100) not null,
`path` varchar (200) DEFAULT '' not null,
`aria` varchar (200) DEFAULT '' not null,
`tooltip` varchar (200) DEFAULT '' not null,
`tmplName` varchar (200) DEFAULT '' not null,
`order` int DEFAULT 0 not null,
`guestOnly` boolean DEFAULT 0 not null,
`memberOnly` boolean DEFAULT 0 not null,
`staffOnly` boolean DEFAULT 0 not null,
`adminOnly` boolean DEFAULT 0 not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE `menus` (
`mid` serial not null,
primary key(`mid`)
);

View File

@ -3,8 +3,8 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "./common"
import "io"
var error_tmpl_phrase_id int
@ -15,12 +15,6 @@ func init() {
common.TmplPtrMap["error"] = &common.Template_error_handle
common.TmplPtrMap["o_error"] = Template_error
error_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -42,7 +36,7 @@ func init() {
}
// nolint
func Template_error(tmpl_error_vars common.Page, w http.ResponseWriter) error {
func Template_error(tmpl_error_vars common.Page, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(error_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_error_vars.Title))
@ -84,59 +78,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_error_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_error_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_error_vars.Header)))
if tmpl_error_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_error_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_error_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_error_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_error_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_error_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -151,18 +133,18 @@ w.Write(header_frags[21])
}
w.Write(header_frags[22])
w.Write(error_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(error_frags[1])
w.Write([]byte(tmpl_error_vars.Something.(string)))
w.Write(error_frags[2])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_error_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(footer_frags[2])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(footer_frags[3])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(footer_frags[4])
if len(tmpl_error_vars.Header.Themes) != 0 {
for _, item := range tmpl_error_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
import "strconv"
@ -16,12 +16,6 @@ func init() {
common.TmplPtrMap["forum"] = &common.Template_forum_handle
common.TmplPtrMap["o_forum"] = Template_forum
forum_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -75,7 +69,7 @@ func init() {
}
// nolint
func Template_forum(tmpl_forum_vars common.ForumPage, w http.ResponseWriter) error {
func Template_forum(tmpl_forum_vars common.ForumPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(forum_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_forum_vars.Title))
@ -117,59 +111,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_forum_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_forum_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_forum_vars.Header)))
if tmpl_forum_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_forum_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_forum_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_forum_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_forum_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_forum_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -185,24 +167,24 @@ w.Write(header_frags[21])
w.Write(header_frags[22])
if tmpl_forum_vars.Page > 1 {
w.Write(forum_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(forum_frags[1])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_frags[2])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page - 1)))
w.Write(forum_frags[3])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(forum_frags[4])
}
if tmpl_forum_vars.LastPage != tmpl_forum_vars.Page {
w.Write(forum_frags[5])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(forum_frags[6])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_frags[7])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page + 1)))
w.Write(forum_frags[8])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(forum_frags[9])
}
w.Write(forum_frags[10])
@ -216,22 +198,22 @@ if tmpl_forum_vars.CurrentUser.ID != 0 {
w.Write(forum_frags[14])
if tmpl_forum_vars.CurrentUser.Perms.CreateTopic {
w.Write(forum_frags[15])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(forum_frags[16])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(forum_frags[17])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_frags[18])
w.Write(forum_frags[19])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(forum_frags[20])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(forum_frags[21])
} else {
w.Write(forum_frags[22])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(forum_frags[23])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(forum_frags[24])
}
w.Write(forum_frags[25])
@ -239,48 +221,48 @@ w.Write(forum_frags[25])
w.Write(forum_frags[26])
if tmpl_forum_vars.CurrentUser.ID != 0 {
w.Write(forum_frags[27])
w.Write(phrases[29])
w.Write(phrases[23])
w.Write(forum_frags[28])
w.Write(phrases[30])
w.Write(phrases[24])
w.Write(forum_frags[29])
w.Write(phrases[31])
w.Write(phrases[25])
w.Write(forum_frags[30])
w.Write(phrases[32])
w.Write(phrases[26])
w.Write(forum_frags[31])
w.Write(phrases[33])
w.Write(phrases[27])
w.Write(forum_frags[32])
if tmpl_forum_vars.CurrentUser.Perms.CreateTopic {
w.Write(forum_frags[33])
w.Write(phrases[34])
w.Write(phrases[28])
w.Write(forum_frags[34])
w.Write([]byte(tmpl_forum_vars.CurrentUser.Avatar))
w.Write(forum_frags[35])
w.Write(phrases[35])
w.Write(phrases[29])
w.Write(forum_frags[36])
w.Write(phrases[36])
w.Write(phrases[30])
w.Write(forum_frags[37])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_frags[38])
w.Write(phrases[37])
w.Write(phrases[31])
w.Write(forum_frags[39])
w.Write(phrases[38])
w.Write(phrases[32])
w.Write(forum_frags[40])
w.Write(phrases[39])
w.Write(phrases[33])
w.Write(forum_frags[41])
w.Write(phrases[40])
w.Write(phrases[34])
w.Write(forum_frags[42])
if tmpl_forum_vars.CurrentUser.Perms.UploadFiles {
w.Write(forum_frags[43])
w.Write(phrases[41])
w.Write(phrases[35])
w.Write(forum_frags[44])
}
w.Write(forum_frags[45])
w.Write(phrases[42])
w.Write(phrases[36])
w.Write(forum_frags[46])
}
}
w.Write(forum_frags[47])
w.Write(phrases[43])
w.Write(phrases[37])
w.Write(forum_frags[48])
if len(tmpl_forum_vars.ItemList) != 0 {
for _, item := range tmpl_forum_vars.ItemList {
@ -317,12 +299,12 @@ w.Write([]byte(item.Creator.Name))
w.Write(forum_frags[63])
if item.IsClosed {
w.Write(forum_frags[64])
w.Write(phrases[44])
w.Write(phrases[38])
w.Write(forum_frags[65])
}
if item.Sticky {
w.Write(forum_frags[66])
w.Write(phrases[45])
w.Write(phrases[39])
w.Write(forum_frags[67])
}
w.Write(forum_frags[68])
@ -357,12 +339,12 @@ w.Write(forum_frags[81])
}
} else {
w.Write(forum_frags[82])
w.Write(phrases[46])
w.Write(phrases[40])
if tmpl_forum_vars.CurrentUser.Perms.CreateTopic {
w.Write(forum_frags[83])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Forum.ID)))
w.Write(forum_frags[84])
w.Write(phrases[47])
w.Write(phrases[41])
w.Write(forum_frags[85])
}
w.Write(forum_frags[86])
@ -374,9 +356,9 @@ if tmpl_forum_vars.Page > 1 {
w.Write(paginator_frags[1])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page - 1)))
w.Write(paginator_frags[2])
w.Write(phrases[48])
w.Write(phrases[42])
w.Write(paginator_frags[3])
w.Write(phrases[49])
w.Write(phrases[43])
w.Write(paginator_frags[4])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page - 1)))
w.Write(paginator_frags[5])
@ -396,9 +378,9 @@ w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page + 1)))
w.Write(paginator_frags[10])
w.Write([]byte(strconv.Itoa(tmpl_forum_vars.Page + 1)))
w.Write(paginator_frags[11])
w.Write(phrases[50])
w.Write(phrases[44])
w.Write(paginator_frags[12])
w.Write(phrases[51])
w.Write(phrases[45])
w.Write(paginator_frags[13])
}
w.Write(paginator_frags[14])
@ -407,11 +389,11 @@ w.Write(forum_frags[88])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_forum_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[52])
w.Write(phrases[46])
w.Write(footer_frags[2])
w.Write(phrases[53])
w.Write(phrases[47])
w.Write(footer_frags[3])
w.Write(phrases[54])
w.Write(phrases[48])
w.Write(footer_frags[4])
if len(tmpl_forum_vars.Header.Themes) != 0 {
for _, item := range tmpl_forum_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
var forums_tmpl_phrase_id int
@ -15,12 +15,6 @@ func init() {
common.TmplPtrMap["forums"] = &common.Template_forums_handle
common.TmplPtrMap["o_forums"] = Template_forums
forums_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -45,7 +39,7 @@ func init() {
}
// nolint
func Template_forums(tmpl_forums_vars common.ForumsPage, w http.ResponseWriter) error {
func Template_forums(tmpl_forums_vars common.ForumsPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(forums_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_forums_vars.Title))
@ -87,59 +81,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_forums_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_forums_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_forums_vars.Header)))
if tmpl_forums_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_forums_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_forums_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_forums_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_forums_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_forums_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -154,7 +136,7 @@ w.Write(header_frags[21])
}
w.Write(header_frags[22])
w.Write(forums_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(forums_frags[1])
if len(tmpl_forums_vars.ItemList) != 0 {
for _, item := range tmpl_forums_vars.ItemList {
@ -173,7 +155,7 @@ w.Write([]byte(item.Desc))
w.Write(forums_frags[8])
} else {
w.Write(forums_frags[9])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(forums_frags[10])
}
w.Write(forums_frags[11])
@ -192,7 +174,7 @@ w.Write(forums_frags[17])
if item.LastTopic.Title != "" {
w.Write([]byte(item.LastTopic.Title))
} else {
w.Write(phrases[21])
w.Write(phrases[15])
}
w.Write(forums_frags[18])
if item.LastTopicTime != "" {
@ -204,18 +186,18 @@ w.Write(forums_frags[21])
}
} else {
w.Write(forums_frags[22])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(forums_frags[23])
}
w.Write(forums_frags[24])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_forums_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(footer_frags[2])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(footer_frags[3])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(footer_frags[4])
if len(tmpl_forums_vars.Header.Themes) != 0 {
for _, item := range tmpl_forums_vars.Header.Themes {

View File

@ -3,10 +3,10 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "strconv"
import "net/http"
import "io"
import "./common"
import "./extend/guilds/lib"
import "strconv"
var guilds_guild_list_tmpl_phrase_id int
@ -14,12 +14,6 @@ var guilds_guild_list_tmpl_phrase_id int
func init() {
common.TmplPtrMap["o_guilds_guild_list"] = Template_guilds_guild_list
guilds_guild_list_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -40,7 +34,7 @@ func init() {
}
// nolint
func Template_guilds_guild_list(tmpl_guilds_guild_list_vars guilds.ListPage, w http.ResponseWriter) error {
func Template_guilds_guild_list(tmpl_guilds_guild_list_vars guilds.ListPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(guilds_guild_list_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_guilds_guild_list_vars.Title))
@ -82,59 +76,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_guilds_guild_list_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_guilds_guild_list_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_guilds_guild_list_vars.Header)))
if tmpl_guilds_guild_list_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_guilds_guild_list_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_guilds_guild_list_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_guilds_guild_list_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_guilds_guild_list_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_guilds_guild_list_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -170,11 +152,11 @@ w.Write(guilds_guild_list_frags[8])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_guilds_guild_list_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(footer_frags[2])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(footer_frags[3])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(footer_frags[4])
if len(tmpl_guilds_guild_list_vars.Header.Themes) != 0 {
for _, item := range tmpl_guilds_guild_list_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
var ip_search_tmpl_phrase_id int
@ -15,12 +15,6 @@ func init() {
common.TmplPtrMap["ip_search"] = &common.Template_ip_search_handle
common.TmplPtrMap["o_ip_search"] = Template_ip_search
ip_search_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -44,7 +38,7 @@ func init() {
}
// nolint
func Template_ip_search(tmpl_ip_search_vars common.IPSearchPage, w http.ResponseWriter) error {
func Template_ip_search(tmpl_ip_search_vars common.IPSearchPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(ip_search_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_ip_search_vars.Title))
@ -86,59 +80,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_ip_search_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_ip_search_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_ip_search_vars.Header)))
if tmpl_ip_search_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_ip_search_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_ip_search_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_ip_search_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_ip_search_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_ip_search_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -153,7 +135,7 @@ w.Write(header_frags[21])
}
w.Write(header_frags[22])
w.Write(ip_search_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(ip_search_frags[1])
if tmpl_ip_search_vars.IP != "" {
w.Write(ip_search_frags[2])
@ -161,7 +143,7 @@ w.Write([]byte(tmpl_ip_search_vars.IP))
w.Write(ip_search_frags[3])
}
w.Write(ip_search_frags[4])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(ip_search_frags[5])
if tmpl_ip_search_vars.IP != "" {
w.Write(ip_search_frags[6])
@ -181,7 +163,7 @@ w.Write(ip_search_frags[12])
}
} else {
w.Write(ip_search_frags[13])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(ip_search_frags[14])
}
@ -191,11 +173,11 @@ w.Write(ip_search_frags[16])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_ip_search_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(footer_frags[2])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(footer_frags[3])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(footer_frags[4])
if len(tmpl_ip_search_vars.Header.Themes) != 0 {
for _, item := range tmpl_ip_search_vars.Header.Themes {

View File

@ -1,21 +1,21 @@
package main
var footer_frags = make([][]byte,13)
var topic_alt_frags = make([][]byte,200)
var ip_search_frags = make([][]byte,18)
var guilds_guild_list_frags = make([][]byte,10)
var topics_frags = make([][]byte,98)
var forum_frags = make([][]byte,90)
var header_frags = make([][]byte,24)
var topic_frags = make([][]byte,199)
var profile_comments_row_frags = make([][]byte,51)
var profile_frags = make([][]byte,50)
var forums_frags = make([][]byte,26)
var login_frags = make([][]byte,8)
var register_frags = make([][]byte,9)
var menu_frags = make([][]byte,30)
var paginator_frags = make([][]byte,16)
var register_frags = make([][]byte,9)
var topic_alt_frags = make([][]byte,200)
var profile_comments_row_frags = make([][]byte,51)
var topics_frags = make([][]byte,98)
var error_frags = make([][]byte,4)
var guilds_guild_list_frags = make([][]byte,10)
var topic_frags = make([][]byte,199)
var forums_frags = make([][]byte,26)
var profile_frags = make([][]byte,50)
var forum_frags = make([][]byte,90)
var login_frags = make([][]byte,8)
var ip_search_frags = make([][]byte,18)
var menu_frags = make([][]byte,23)
var footer_frags = make([][]byte,13)
var header_frags = make([][]byte,24)
// nolint
func init() {
@ -65,59 +65,44 @@ menu_frags[1] = []byte(`</div>
<nav class="nav">
<div class="move_left">
<div class="move_right">
<ul>`)
menu_frags[2] = []byte(`
<ul>
<li id="menu_overview" class="menu_left"><a href="/" rel="home">`)
menu_frags[3] = []byte(`</a></li>
<li id="menu_forums" class="menu_left"><a href="/forums/" aria-label="`)
menu_frags[2] = []byte(`</a></li>
`)
menu_frags[3] = []byte(`
<li class="menu_left menu_account"><a href="/user/edit/critical/" aria-label="`)
menu_frags[4] = []byte(`" title="`)
menu_frags[5] = []byte(`"></a></li>
<li class="menu_left menu_topics"><a href="/" aria-label="`)
menu_frags[6] = []byte(`" title="`)
menu_frags[7] = []byte(`"></a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter" aria-label="`)
menu_frags[8] = []byte(`"></div>
<div class="alert_aftercounter"></div>
<div class="alertList" aria-label="`)
menu_frags[9] = []byte(`"></div>
</li>
`)
menu_frags[10] = []byte(`
<li class="menu_left menu_account"><a href="/user/edit/critical/" aria-label="`)
menu_frags[11] = []byte(`" title="`)
menu_frags[12] = []byte(`"></a></li>
<li class="menu_left menu_profile"><a href="`)
menu_frags[13] = []byte(`" aria-label="`)
menu_frags[14] = []byte(`" title="`)
menu_frags[15] = []byte(`"></a></li>
menu_frags[6] = []byte(`" aria-label="`)
menu_frags[7] = []byte(`" title="`)
menu_frags[8] = []byte(`"></a></li>
<li class="menu_left menu_panel menu_account supermod_only"><a href="/panel/" aria-label="`)
menu_frags[16] = []byte(`" title="`)
menu_frags[17] = []byte(`"></a></li>
menu_frags[9] = []byte(`" title="`)
menu_frags[10] = []byte(`"></a></li>
<li class="menu_left menu_logout"><a href="/accounts/logout/?session=`)
menu_frags[18] = []byte(`" aria-label="`)
menu_frags[19] = []byte(`" title="`)
menu_frags[20] = []byte(`"></a></li>
menu_frags[11] = []byte(`" aria-label="`)
menu_frags[12] = []byte(`" title="`)
menu_frags[13] = []byte(`"></a></li>
`)
menu_frags[21] = []byte(`
menu_frags[14] = []byte(`
<li class="menu_left menu_register"><a href="/accounts/create/" aria-label="`)
menu_frags[22] = []byte(`" title="`)
menu_frags[23] = []byte(`"></a></li>
menu_frags[15] = []byte(`" title="`)
menu_frags[16] = []byte(`"></a></li>
<li class="menu_left menu_login"><a href="/accounts/login/" aria-label="`)
menu_frags[24] = []byte(`" title="`)
menu_frags[25] = []byte(`"></a></li>
menu_frags[17] = []byte(`" title="`)
menu_frags[18] = []byte(`"></a></li>
`)
menu_frags[26] = []byte(`
menu_frags[19] = []byte(`
<li class="menu_left menu_hamburger" title="`)
menu_frags[27] = []byte(`"><a></a></li>
menu_frags[20] = []byte(`"><a></a></li>
</ul>
</div>
</div>
<div style="clear: both;"></div>
</nav>
<div class="right_of_nav">`)
menu_frags[28] = []byte(`</div>`)
menu_frags[21] = []byte(`</div>`)
header_frags[17] = []byte(`
<div id="back"><div id="main" `)
header_frags[18] = []byte(`class="shrink_main"`)

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
var login_tmpl_phrase_id int
@ -15,12 +15,6 @@ func init() {
common.TmplPtrMap["login"] = &common.Template_login_handle
common.TmplPtrMap["o_login"] = Template_login
login_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -47,7 +41,7 @@ func init() {
}
// nolint
func Template_login(tmpl_login_vars common.Page, w http.ResponseWriter) error {
func Template_login(tmpl_login_vars common.Page, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(login_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_login_vars.Title))
@ -89,59 +83,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_login_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_login_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_login_vars.Header)))
if tmpl_login_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_login_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_login_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_login_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_login_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_login_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -156,26 +138,26 @@ w.Write(header_frags[21])
}
w.Write(header_frags[22])
w.Write(login_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(login_frags[1])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(login_frags[2])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(login_frags[3])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(login_frags[4])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(login_frags[5])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(login_frags[6])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_login_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(footer_frags[2])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(footer_frags[3])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(footer_frags[4])
if len(tmpl_login_vars.Header.Themes) != 0 {
for _, item := range tmpl_login_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
import "strconv"
@ -16,12 +16,6 @@ func init() {
common.TmplPtrMap["profile"] = &common.Template_profile_handle
common.TmplPtrMap["o_profile"] = Template_profile
profile_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -70,7 +64,7 @@ func init() {
}
// nolint
func Template_profile(tmpl_profile_vars common.ProfilePage, w http.ResponseWriter) error {
func Template_profile(tmpl_profile_vars common.ProfilePage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(profile_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_profile_vars.Title))
@ -112,59 +106,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_profile_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_profile_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_profile_vars.Header)))
if tmpl_profile_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_profile_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_profile_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_profile_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -199,11 +181,11 @@ w.Write(profile_frags[8])
w.Write(profile_frags[9])
if !tmpl_profile_vars.CurrentUser.Loggedin {
w.Write(profile_frags[10])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(profile_frags[11])
} else {
w.Write(profile_frags[12])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(profile_frags[13])
if tmpl_profile_vars.CurrentUser.IsSuperMod && !tmpl_profile_vars.ProfileOwner.IsSuperMod {
w.Write(profile_frags[14])
@ -213,11 +195,11 @@ w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
w.Write(profile_frags[16])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_frags[17])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(profile_frags[18])
} else {
w.Write(profile_frags[19])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(profile_frags[20])
}
w.Write(profile_frags[21])
@ -227,36 +209,36 @@ w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
w.Write(profile_frags[23])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_frags[24])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(profile_frags[25])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(profile_frags[26])
}
w.Write(profile_frags[27])
if tmpl_profile_vars.CurrentUser.Perms.BanUsers {
w.Write(profile_frags[28])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(profile_frags[29])
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
w.Write(profile_frags[30])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_frags[31])
w.Write(profile_frags[32])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(profile_frags[33])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(profile_frags[34])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(profile_frags[35])
w.Write(phrases[29])
w.Write(phrases[23])
w.Write(profile_frags[36])
w.Write(phrases[30])
w.Write(phrases[24])
w.Write(profile_frags[37])
w.Write(phrases[31])
w.Write(phrases[25])
w.Write(profile_frags[38])
}
w.Write(profile_frags[39])
w.Write(phrases[32])
w.Write(phrases[26])
w.Write(profile_frags[40])
if tmpl_profile_vars.Header.Theme.BgAvatars {
if len(tmpl_profile_vars.ItemList) != 0 {
@ -282,17 +264,17 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[9])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[10])
w.Write(phrases[33])
w.Write(phrases[27])
w.Write(profile_comments_row_frags[11])
w.Write(phrases[34])
w.Write(phrases[28])
w.Write(profile_comments_row_frags[12])
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[13])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[14])
w.Write(phrases[35])
w.Write(phrases[29])
w.Write(profile_comments_row_frags[15])
w.Write(phrases[36])
w.Write(phrases[30])
w.Write(profile_comments_row_frags[16])
}
w.Write(profile_comments_row_frags[17])
@ -300,9 +282,9 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[18])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[19])
w.Write(phrases[37])
w.Write(phrases[31])
w.Write(profile_comments_row_frags[20])
w.Write(phrases[38])
w.Write(phrases[32])
w.Write(profile_comments_row_frags[21])
if item.Tag != "" {
w.Write(profile_comments_row_frags[22])
@ -340,17 +322,17 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[36])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[37])
w.Write(phrases[39])
w.Write(phrases[33])
w.Write(profile_comments_row_frags[38])
w.Write(phrases[40])
w.Write(phrases[34])
w.Write(profile_comments_row_frags[39])
w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[40])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[41])
w.Write(phrases[41])
w.Write(phrases[35])
w.Write(profile_comments_row_frags[42])
w.Write(phrases[42])
w.Write(phrases[36])
w.Write(profile_comments_row_frags[43])
}
w.Write(profile_comments_row_frags[44])
@ -358,9 +340,9 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(profile_comments_row_frags[45])
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_comments_row_frags[46])
w.Write(phrases[43])
w.Write(phrases[37])
w.Write(profile_comments_row_frags[47])
w.Write(phrases[44])
w.Write(phrases[38])
w.Write(profile_comments_row_frags[48])
w.Write([]byte(item.ContentHtml))
w.Write(profile_comments_row_frags[49])
@ -374,9 +356,9 @@ w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
w.Write(profile_frags[43])
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
w.Write(profile_frags[44])
w.Write(phrases[45])
w.Write(phrases[39])
w.Write(profile_frags[45])
w.Write(phrases[46])
w.Write(phrases[40])
w.Write(profile_frags[46])
}
w.Write(profile_frags[47])
@ -384,11 +366,11 @@ w.Write(profile_frags[48])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_profile_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[47])
w.Write(phrases[41])
w.Write(footer_frags[2])
w.Write(phrases[48])
w.Write(phrases[42])
w.Write(footer_frags[3])
w.Write(phrases[49])
w.Write(phrases[43])
w.Write(footer_frags[4])
if len(tmpl_profile_vars.Header.Themes) != 0 {
for _, item := range tmpl_profile_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
var register_tmpl_phrase_id int
@ -15,12 +15,6 @@ func init() {
common.TmplPtrMap["register"] = &common.Template_register_handle
common.TmplPtrMap["o_register"] = Template_register
register_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -48,7 +42,7 @@ func init() {
}
// nolint
func Template_register(tmpl_register_vars common.Page, w http.ResponseWriter) error {
func Template_register(tmpl_register_vars common.Page, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(register_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_register_vars.Title))
@ -90,59 +84,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_register_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_register_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_register_vars.Header)))
if tmpl_register_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_register_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_register_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_register_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_register_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_register_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -157,28 +139,28 @@ w.Write(header_frags[21])
}
w.Write(header_frags[22])
w.Write(register_frags[0])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(register_frags[1])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(register_frags[2])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(register_frags[3])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(register_frags[4])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(register_frags[5])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(register_frags[6])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(register_frags[7])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_register_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(footer_frags[2])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(footer_frags[3])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(footer_frags[4])
if len(tmpl_register_vars.Header.Themes) != 0 {
for _, item := range tmpl_register_vars.Header.Themes {

View File

@ -3,8 +3,8 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "./common"
import "io"
import "strconv"
var topic_tmpl_phrase_id int
@ -16,12 +16,6 @@ func init() {
common.TmplPtrMap["topic"] = &common.Template_topic_handle
common.TmplPtrMap["o_topic"] = Template_topic
topic_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -101,7 +95,7 @@ func init() {
}
// nolint
func Template_topic(tmpl_topic_vars common.TopicPage, w http.ResponseWriter) error {
func Template_topic(tmpl_topic_vars common.TopicPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(topic_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_topic_vars.Title))
@ -143,59 +137,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_topic_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_topic_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_topic_vars.Header)))
if tmpl_topic_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_topic_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_topic_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_topic_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -220,13 +202,13 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[4])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page - 1)))
w.Write(topic_frags[5])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(topic_frags[6])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[7])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page - 1)))
w.Write(topic_frags[8])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(topic_frags[9])
}
if tmpl_topic_vars.LastPage != tmpl_topic_vars.Page {
@ -235,18 +217,18 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[11])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page + 1)))
w.Write(topic_frags[12])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(topic_frags[13])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[14])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Page + 1)))
w.Write(topic_frags[15])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(topic_frags[16])
}
w.Write(topic_frags[17])
w.Write(topic_frags[18])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(topic_frags[19])
if tmpl_topic_vars.Topic.Sticky {
w.Write(topic_frags[20])
@ -262,24 +244,24 @@ w.Write([]byte(tmpl_topic_vars.Topic.Title))
w.Write(topic_frags[24])
if tmpl_topic_vars.Topic.IsClosed {
w.Write(topic_frags[25])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(topic_frags[26])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(topic_frags[27])
}
if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_frags[28])
w.Write([]byte(tmpl_topic_vars.Topic.Title))
w.Write(topic_frags[29])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(topic_frags[30])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(topic_frags[31])
}
w.Write(topic_frags[32])
if tmpl_topic_vars.Poll.ID > 0 {
w.Write(topic_frags[33])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(topic_frags[34])
w.Write([]byte(tmpl_topic_vars.Topic.ClassName))
w.Write(topic_frags[35])
@ -311,20 +293,20 @@ w.Write(topic_frags[46])
w.Write(topic_frags[47])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Poll.ID)))
w.Write(topic_frags[48])
w.Write(phrases[29])
w.Write(phrases[23])
w.Write(topic_frags[49])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Poll.ID)))
w.Write(topic_frags[50])
w.Write(phrases[30])
w.Write(phrases[24])
w.Write(topic_frags[51])
w.Write(phrases[31])
w.Write(phrases[25])
w.Write(topic_frags[52])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Poll.ID)))
w.Write(topic_frags[53])
}
w.Write(topic_frags[54])
w.Write(topic_frags[55])
w.Write(phrases[32])
w.Write(phrases[26])
w.Write(topic_frags[56])
w.Write([]byte(tmpl_topic_vars.Topic.ClassName))
w.Write(topic_frags[57])
@ -344,7 +326,7 @@ if tmpl_topic_vars.Topic.LikeCount > 0 {
w.Write(topic_frags[64])
}
w.Write(topic_frags[65])
w.Write(phrases[33])
w.Write(phrases[27])
w.Write(topic_frags[66])
w.Write([]byte(tmpl_topic_vars.Topic.UserLink))
w.Write(topic_frags[67])
@ -358,15 +340,15 @@ w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[71])
if tmpl_topic_vars.Topic.Liked {
w.Write(topic_frags[72])
w.Write(phrases[34])
w.Write(phrases[28])
w.Write(topic_frags[73])
w.Write(phrases[35])
w.Write(phrases[29])
w.Write(topic_frags[74])
} else {
w.Write(topic_frags[75])
w.Write(phrases[36])
w.Write(phrases[30])
w.Write(topic_frags[76])
w.Write(phrases[37])
w.Write(phrases[31])
w.Write(topic_frags[77])
}
w.Write(topic_frags[78])
@ -381,9 +363,9 @@ if tmpl_topic_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_frags[82])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[83])
w.Write(phrases[38])
w.Write(phrases[32])
w.Write(topic_frags[84])
w.Write(phrases[39])
w.Write(phrases[33])
w.Write(topic_frags[85])
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteTopic {
@ -392,9 +374,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[87])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[88])
w.Write(phrases[40])
w.Write(phrases[34])
w.Write(topic_frags[89])
w.Write(phrases[41])
w.Write(phrases[35])
w.Write(topic_frags[90])
}
if tmpl_topic_vars.CurrentUser.Perms.CloseTopic {
@ -404,9 +386,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[92])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[93])
w.Write(phrases[42])
w.Write(phrases[36])
w.Write(topic_frags[94])
w.Write(phrases[43])
w.Write(phrases[37])
w.Write(topic_frags[95])
} else {
w.Write(topic_frags[96])
@ -414,9 +396,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[97])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[98])
w.Write(phrases[44])
w.Write(phrases[38])
w.Write(topic_frags[99])
w.Write(phrases[45])
w.Write(phrases[39])
w.Write(topic_frags[100])
}
}
@ -427,9 +409,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[102])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[103])
w.Write(phrases[46])
w.Write(phrases[40])
w.Write(topic_frags[104])
w.Write(phrases[47])
w.Write(phrases[41])
w.Write(topic_frags[105])
} else {
w.Write(topic_frags[106])
@ -437,9 +419,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[107])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[108])
w.Write(phrases[48])
w.Write(phrases[42])
w.Write(topic_frags[109])
w.Write(phrases[49])
w.Write(phrases[43])
w.Write(topic_frags[110])
}
}
@ -447,7 +429,7 @@ if tmpl_topic_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_frags[111])
w.Write([]byte(tmpl_topic_vars.Topic.IPAddress))
w.Write(topic_frags[112])
w.Write(phrases[50])
w.Write(phrases[44])
w.Write(topic_frags[113])
w.Write([]byte(tmpl_topic_vars.Topic.IPAddress))
w.Write(topic_frags[114])
@ -457,15 +439,15 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[116])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[117])
w.Write(phrases[51])
w.Write(phrases[45])
w.Write(topic_frags[118])
w.Write(phrases[52])
w.Write(phrases[46])
w.Write(topic_frags[119])
w.Write(phrases[53])
w.Write(phrases[47])
w.Write(topic_frags[120])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.LikeCount)))
w.Write(topic_frags[121])
w.Write(phrases[54])
w.Write(phrases[48])
w.Write(topic_frags[122])
if tmpl_topic_vars.Topic.Tag != "" {
w.Write(topic_frags[123])
@ -473,15 +455,15 @@ w.Write([]byte(tmpl_topic_vars.Topic.Tag))
w.Write(topic_frags[124])
} else {
w.Write(topic_frags[125])
w.Write(phrases[55])
w.Write(phrases[49])
w.Write(topic_frags[126])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.Level)))
w.Write(topic_frags[127])
w.Write(phrases[56])
w.Write(phrases[50])
w.Write(topic_frags[128])
}
w.Write(topic_frags[129])
w.Write(phrases[57])
w.Write(phrases[51])
w.Write(topic_frags[130])
if len(tmpl_topic_vars.ItemList) != 0 {
for _, item := range tmpl_topic_vars.ItemList {
@ -522,9 +504,9 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_frags[148])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[149])
w.Write(phrases[58])
w.Write(phrases[52])
w.Write(topic_frags[150])
w.Write(phrases[59])
w.Write(phrases[53])
w.Write(topic_frags[151])
} else {
w.Write(topic_frags[152])
@ -532,9 +514,9 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_frags[153])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[154])
w.Write(phrases[60])
w.Write(phrases[54])
w.Write(topic_frags[155])
w.Write(phrases[61])
w.Write(phrases[55])
w.Write(topic_frags[156])
}
}
@ -544,9 +526,9 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_frags[158])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[159])
w.Write(phrases[62])
w.Write(phrases[56])
w.Write(topic_frags[160])
w.Write(phrases[63])
w.Write(phrases[57])
w.Write(topic_frags[161])
}
if tmpl_topic_vars.CurrentUser.Perms.DeleteReply {
@ -555,16 +537,16 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_frags[163])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[164])
w.Write(phrases[64])
w.Write(phrases[58])
w.Write(topic_frags[165])
w.Write(phrases[65])
w.Write(phrases[59])
w.Write(topic_frags[166])
}
if tmpl_topic_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_frags[167])
w.Write([]byte(item.IPAddress))
w.Write(topic_frags[168])
w.Write(phrases[66])
w.Write(phrases[60])
w.Write(topic_frags[169])
w.Write([]byte(item.IPAddress))
w.Write(topic_frags[170])
@ -574,13 +556,13 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_frags[172])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[173])
w.Write(phrases[67])
w.Write(phrases[61])
w.Write(topic_frags[174])
w.Write(phrases[68])
w.Write(phrases[62])
w.Write(topic_frags[175])
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topic_frags[176])
w.Write(phrases[69])
w.Write(phrases[63])
w.Write(topic_frags[177])
if item.Tag != "" {
w.Write(topic_frags[178])
@ -588,11 +570,11 @@ w.Write([]byte(item.Tag))
w.Write(topic_frags[179])
} else {
w.Write(topic_frags[180])
w.Write(phrases[70])
w.Write(phrases[64])
w.Write(topic_frags[181])
w.Write([]byte(strconv.Itoa(item.Level)))
w.Write(topic_frags[182])
w.Write(phrases[71])
w.Write(phrases[65])
w.Write(topic_frags[183])
}
w.Write(topic_frags[184])
@ -602,23 +584,23 @@ w.Write(topic_frags[184])
w.Write(topic_frags[185])
if tmpl_topic_vars.CurrentUser.Perms.CreateReply {
w.Write(topic_frags[186])
w.Write(phrases[72])
w.Write(phrases[66])
w.Write(topic_frags[187])
w.Write([]byte(tmpl_topic_vars.CurrentUser.Session))
w.Write(topic_frags[188])
w.Write([]byte(strconv.Itoa(tmpl_topic_vars.Topic.ID)))
w.Write(topic_frags[189])
w.Write(phrases[73])
w.Write(phrases[67])
w.Write(topic_frags[190])
w.Write(phrases[74])
w.Write(phrases[68])
w.Write(topic_frags[191])
w.Write(phrases[75])
w.Write(phrases[69])
w.Write(topic_frags[192])
w.Write(phrases[76])
w.Write(phrases[70])
w.Write(topic_frags[193])
if tmpl_topic_vars.CurrentUser.Perms.UploadFiles {
w.Write(topic_frags[194])
w.Write(phrases[77])
w.Write(phrases[71])
w.Write(topic_frags[195])
}
w.Write(topic_frags[196])
@ -627,11 +609,11 @@ w.Write(topic_frags[197])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_topic_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[78])
w.Write(phrases[72])
w.Write(footer_frags[2])
w.Write(phrases[79])
w.Write(phrases[73])
w.Write(footer_frags[3])
w.Write(phrases[80])
w.Write(phrases[74])
w.Write(footer_frags[4])
if len(tmpl_topic_vars.Header.Themes) != 0 {
for _, item := range tmpl_topic_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
import "strconv"
@ -16,12 +16,6 @@ func init() {
common.TmplPtrMap["topic_alt"] = &common.Template_topic_alt_handle
common.TmplPtrMap["o_topic_alt"] = Template_topic_alt
topic_alt_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -88,7 +82,7 @@ func init() {
}
// nolint
func Template_topic_alt(tmpl_topic_alt_vars common.TopicPage, w http.ResponseWriter) error {
func Template_topic_alt(tmpl_topic_alt_vars common.TopicPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(topic_alt_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_topic_alt_vars.Title))
@ -130,59 +124,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_topic_alt_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_topic_alt_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_topic_alt_vars.Header)))
if tmpl_topic_alt_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_topic_alt_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_topic_alt_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_topic_alt_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -202,13 +184,13 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[1])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Page - 1)))
w.Write(topic_alt_frags[2])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(topic_alt_frags[3])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[4])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Page - 1)))
w.Write(topic_alt_frags[5])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(topic_alt_frags[6])
}
if tmpl_topic_alt_vars.LastPage != tmpl_topic_alt_vars.Page {
@ -217,18 +199,18 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[8])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Page + 1)))
w.Write(topic_alt_frags[9])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(topic_alt_frags[10])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[11])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Page + 1)))
w.Write(topic_alt_frags[12])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(topic_alt_frags[13])
}
w.Write(topic_alt_frags[14])
w.Write(topic_alt_frags[15])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(topic_alt_frags[16])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[17])
@ -248,18 +230,18 @@ w.Write([]byte(tmpl_topic_alt_vars.Topic.Title))
w.Write(topic_alt_frags[23])
if tmpl_topic_alt_vars.Topic.IsClosed {
w.Write(topic_alt_frags[24])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(topic_alt_frags[25])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(topic_alt_frags[26])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_alt_frags[27])
w.Write([]byte(tmpl_topic_alt_vars.Topic.Title))
w.Write(topic_alt_frags[28])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(topic_alt_frags[29])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(topic_alt_frags[30])
}
w.Write(topic_alt_frags[31])
@ -271,7 +253,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Poll.ID)))
w.Write(topic_alt_frags[34])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[35])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(topic_alt_frags[36])
w.Write([]byte(tmpl_topic_alt_vars.Topic.Avatar))
w.Write(topic_alt_frags[37])
@ -285,7 +267,7 @@ w.Write([]byte(tmpl_topic_alt_vars.Topic.Tag))
w.Write(topic_alt_frags[41])
} else {
w.Write(topic_alt_frags[42])
w.Write(phrases[29])
w.Write(phrases[23])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.Level)))
w.Write(topic_alt_frags[43])
}
@ -312,22 +294,22 @@ w.Write(topic_alt_frags[52])
w.Write(topic_alt_frags[53])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Poll.ID)))
w.Write(topic_alt_frags[54])
w.Write(phrases[30])
w.Write(phrases[24])
w.Write(topic_alt_frags[55])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Poll.ID)))
w.Write(topic_alt_frags[56])
w.Write(phrases[31])
w.Write(phrases[25])
w.Write(topic_alt_frags[57])
w.Write(phrases[32])
w.Write(phrases[26])
w.Write(topic_alt_frags[58])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Poll.ID)))
w.Write(topic_alt_frags[59])
}
w.Write(topic_alt_frags[60])
w.Write(topic_alt_frags[61])
w.Write(phrases[33])
w.Write(phrases[27])
w.Write(topic_alt_frags[62])
w.Write(phrases[34])
w.Write(phrases[28])
w.Write(topic_alt_frags[63])
w.Write([]byte(tmpl_topic_alt_vars.Topic.Avatar))
w.Write(topic_alt_frags[64])
@ -341,7 +323,7 @@ w.Write([]byte(tmpl_topic_alt_vars.Topic.Tag))
w.Write(topic_alt_frags[68])
} else {
w.Write(topic_alt_frags[69])
w.Write(phrases[35])
w.Write(phrases[29])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.Level)))
w.Write(topic_alt_frags[70])
}
@ -367,14 +349,14 @@ w.Write(topic_alt_frags[79])
w.Write(topic_alt_frags[80])
}
w.Write(topic_alt_frags[81])
w.Write(phrases[36])
w.Write(phrases[30])
w.Write(topic_alt_frags[82])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.EditTopic {
w.Write(topic_alt_frags[83])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[84])
w.Write(phrases[37])
w.Write(phrases[31])
w.Write(topic_alt_frags[85])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.DeleteTopic {
@ -383,7 +365,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[87])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[88])
w.Write(phrases[38])
w.Write(phrases[32])
w.Write(topic_alt_frags[89])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.CloseTopic {
@ -393,7 +375,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[91])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[92])
w.Write(phrases[39])
w.Write(phrases[33])
w.Write(topic_alt_frags[93])
} else {
w.Write(topic_alt_frags[94])
@ -401,7 +383,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[95])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[96])
w.Write(phrases[40])
w.Write(phrases[34])
w.Write(topic_alt_frags[97])
}
}
@ -412,7 +394,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[99])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[100])
w.Write(phrases[41])
w.Write(phrases[35])
w.Write(topic_alt_frags[101])
} else {
w.Write(topic_alt_frags[102])
@ -420,7 +402,7 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[103])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[104])
w.Write(phrases[42])
w.Write(phrases[36])
w.Write(topic_alt_frags[105])
}
}
@ -428,9 +410,9 @@ if tmpl_topic_alt_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_alt_frags[106])
w.Write([]byte(tmpl_topic_alt_vars.Topic.IPAddress))
w.Write(topic_alt_frags[107])
w.Write(phrases[43])
w.Write(phrases[37])
w.Write(topic_alt_frags[108])
w.Write(phrases[44])
w.Write(phrases[38])
w.Write(topic_alt_frags[109])
}
w.Write(topic_alt_frags[110])
@ -438,11 +420,11 @@ w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[111])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[112])
w.Write(phrases[45])
w.Write(phrases[39])
w.Write(topic_alt_frags[113])
}
w.Write(topic_alt_frags[114])
w.Write(phrases[46])
w.Write(phrases[40])
w.Write(topic_alt_frags[115])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.LikeCount)))
w.Write(topic_alt_frags[116])
@ -452,7 +434,7 @@ if tmpl_topic_alt_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_alt_frags[118])
w.Write([]byte(tmpl_topic_alt_vars.Topic.IPAddress))
w.Write(topic_alt_frags[119])
w.Write(phrases[47])
w.Write(phrases[41])
w.Write(topic_alt_frags[120])
w.Write([]byte(tmpl_topic_alt_vars.Topic.IPAddress))
w.Write(topic_alt_frags[121])
@ -466,7 +448,7 @@ if item.ActionType != "" {
w.Write(topic_alt_frags[125])
}
w.Write(topic_alt_frags[126])
w.Write(phrases[48])
w.Write(phrases[42])
w.Write(topic_alt_frags[127])
w.Write([]byte(item.Avatar))
w.Write(topic_alt_frags[128])
@ -480,7 +462,7 @@ w.Write([]byte(item.Tag))
w.Write(topic_alt_frags[132])
} else {
w.Write(topic_alt_frags[133])
w.Write(phrases[49])
w.Write(phrases[43])
w.Write([]byte(strconv.Itoa(item.Level)))
w.Write(topic_alt_frags[134])
}
@ -516,7 +498,7 @@ w.Write(topic_alt_frags[148])
w.Write(topic_alt_frags[149])
}
w.Write(topic_alt_frags[150])
w.Write(phrases[50])
w.Write(phrases[44])
w.Write(topic_alt_frags[151])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.EditReply {
@ -525,7 +507,7 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_alt_frags[153])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[154])
w.Write(phrases[51])
w.Write(phrases[45])
w.Write(topic_alt_frags[155])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.DeleteReply {
@ -534,16 +516,16 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_alt_frags[157])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[158])
w.Write(phrases[52])
w.Write(phrases[46])
w.Write(topic_alt_frags[159])
}
if tmpl_topic_alt_vars.CurrentUser.Perms.ViewIPs {
w.Write(topic_alt_frags[160])
w.Write([]byte(item.IPAddress))
w.Write(topic_alt_frags[161])
w.Write(phrases[53])
w.Write(phrases[47])
w.Write(topic_alt_frags[162])
w.Write(phrases[54])
w.Write(phrases[48])
w.Write(topic_alt_frags[163])
}
w.Write(topic_alt_frags[164])
@ -551,11 +533,11 @@ w.Write([]byte(strconv.Itoa(item.ID)))
w.Write(topic_alt_frags[165])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[166])
w.Write(phrases[55])
w.Write(phrases[49])
w.Write(topic_alt_frags[167])
}
w.Write(topic_alt_frags[168])
w.Write(phrases[56])
w.Write(phrases[50])
w.Write(topic_alt_frags[169])
w.Write([]byte(strconv.Itoa(item.LikeCount)))
w.Write(topic_alt_frags[170])
@ -576,7 +558,7 @@ w.Write(topic_alt_frags[176])
w.Write(topic_alt_frags[177])
if tmpl_topic_alt_vars.CurrentUser.Perms.CreateReply {
w.Write(topic_alt_frags[178])
w.Write(phrases[57])
w.Write(phrases[51])
w.Write(topic_alt_frags[179])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Avatar))
w.Write(topic_alt_frags[180])
@ -590,28 +572,28 @@ w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Tag))
w.Write(topic_alt_frags[184])
} else {
w.Write(topic_alt_frags[185])
w.Write(phrases[58])
w.Write(phrases[52])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.CurrentUser.Level)))
w.Write(topic_alt_frags[186])
}
w.Write(topic_alt_frags[187])
w.Write(phrases[59])
w.Write(phrases[53])
w.Write(topic_alt_frags[188])
w.Write([]byte(tmpl_topic_alt_vars.CurrentUser.Session))
w.Write(topic_alt_frags[189])
w.Write([]byte(strconv.Itoa(tmpl_topic_alt_vars.Topic.ID)))
w.Write(topic_alt_frags[190])
w.Write(phrases[60])
w.Write(phrases[54])
w.Write(topic_alt_frags[191])
w.Write(phrases[61])
w.Write(phrases[55])
w.Write(topic_alt_frags[192])
w.Write(phrases[62])
w.Write(phrases[56])
w.Write(topic_alt_frags[193])
w.Write(phrases[63])
w.Write(phrases[57])
w.Write(topic_alt_frags[194])
if tmpl_topic_alt_vars.CurrentUser.Perms.UploadFiles {
w.Write(topic_alt_frags[195])
w.Write(phrases[64])
w.Write(phrases[58])
w.Write(topic_alt_frags[196])
}
w.Write(topic_alt_frags[197])
@ -620,11 +602,11 @@ w.Write(topic_alt_frags[198])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_topic_alt_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[65])
w.Write(phrases[59])
w.Write(footer_frags[2])
w.Write(phrases[66])
w.Write(phrases[60])
w.Write(footer_frags[3])
w.Write(phrases[67])
w.Write(phrases[61])
w.Write(footer_frags[4])
if len(tmpl_topic_alt_vars.Header.Themes) != 0 {
for _, item := range tmpl_topic_alt_vars.Header.Themes {

View File

@ -3,7 +3,7 @@
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package main
import "net/http"
import "io"
import "./common"
import "strconv"
@ -16,12 +16,6 @@ func init() {
common.TmplPtrMap["topics"] = &common.Template_topics_handle
common.TmplPtrMap["o_topics"] = Template_topics
topics_tmpl_phrase_id = common.RegisterTmplPhraseNames([]string{
"menu_forums_aria",
"menu_forums_tooltip",
"menu_topics_aria",
"menu_topics_tooltip",
"menu_alert_counter_aria",
"menu_alert_list_aria",
"menu_account_aria",
"menu_account_tooltip",
"menu_profile_aria",
@ -75,7 +69,7 @@ func init() {
}
// nolint
func Template_topics(tmpl_topics_vars common.TopicsPage, w http.ResponseWriter) error {
func Template_topics(tmpl_topics_vars common.TopicListPage, w io.Writer) error {
var phrases = common.GetTmplPhrasesBytes(topics_tmpl_phrase_id)
w.Write(header_frags[0])
w.Write([]byte(tmpl_topics_vars.Title))
@ -117,59 +111,47 @@ w.Write(header_frags[16])
w.Write(menu_frags[0])
w.Write([]byte(common.BuildWidget("leftOfNav",tmpl_topics_vars.Header)))
w.Write(menu_frags[1])
w.Write(menu_frags[2])
w.Write([]byte(tmpl_topics_vars.Header.Site.ShortName))
w.Write(menu_frags[2])
w.Write([]byte(common.BuildWidget("topMenu",tmpl_topics_vars.Header)))
if tmpl_topics_vars.CurrentUser.Loggedin {
w.Write(menu_frags[3])
w.Write(phrases[0])
w.Write(menu_frags[4])
w.Write(phrases[1])
w.Write(menu_frags[5])
w.Write(phrases[2])
w.Write(menu_frags[6])
w.Write(phrases[3])
w.Write(menu_frags[7])
w.Write(phrases[4])
w.Write(menu_frags[8])
w.Write(phrases[5])
w.Write(menu_frags[9])
if tmpl_topics_vars.CurrentUser.Loggedin {
w.Write(menu_frags[10])
w.Write(phrases[6])
w.Write(menu_frags[11])
w.Write(phrases[7])
w.Write(menu_frags[12])
w.Write([]byte(tmpl_topics_vars.CurrentUser.Link))
w.Write(menu_frags[13])
w.Write(phrases[8])
w.Write(menu_frags[14])
w.Write(phrases[9])
w.Write(menu_frags[15])
w.Write(phrases[10])
w.Write(menu_frags[16])
w.Write(phrases[11])
w.Write(menu_frags[17])
w.Write(menu_frags[6])
w.Write(phrases[2])
w.Write(menu_frags[7])
w.Write(phrases[3])
w.Write(menu_frags[8])
w.Write(phrases[4])
w.Write(menu_frags[9])
w.Write(phrases[5])
w.Write(menu_frags[10])
w.Write([]byte(tmpl_topics_vars.CurrentUser.Session))
w.Write(menu_frags[18])
w.Write(phrases[12])
w.Write(menu_frags[19])
w.Write(phrases[13])
w.Write(menu_frags[20])
w.Write(menu_frags[11])
w.Write(phrases[6])
w.Write(menu_frags[12])
w.Write(phrases[7])
w.Write(menu_frags[13])
} else {
w.Write(menu_frags[21])
w.Write(phrases[14])
w.Write(menu_frags[22])
w.Write(phrases[15])
w.Write(menu_frags[23])
w.Write(phrases[16])
w.Write(menu_frags[24])
w.Write(phrases[17])
w.Write(menu_frags[25])
w.Write(menu_frags[14])
w.Write(phrases[8])
w.Write(menu_frags[15])
w.Write(phrases[9])
w.Write(menu_frags[16])
w.Write(phrases[10])
w.Write(menu_frags[17])
w.Write(phrases[11])
w.Write(menu_frags[18])
}
w.Write(menu_frags[26])
w.Write(phrases[18])
w.Write(menu_frags[27])
w.Write(menu_frags[19])
w.Write(phrases[12])
w.Write(menu_frags[20])
w.Write([]byte(common.BuildWidget("rightOfNav",tmpl_topics_vars.Header)))
w.Write(menu_frags[28])
w.Write(menu_frags[21])
w.Write(header_frags[17])
if tmpl_topics_vars.Header.Widgets.RightSidebar != "" {
w.Write(header_frags[18])
@ -188,26 +170,26 @@ if tmpl_topics_vars.CurrentUser.ID != 0 {
w.Write(topics_frags[1])
}
w.Write(topics_frags[2])
w.Write(phrases[19])
w.Write(phrases[13])
w.Write(topics_frags[3])
if tmpl_topics_vars.CurrentUser.ID != 0 {
w.Write(topics_frags[4])
if len(tmpl_topics_vars.ForumList) != 0 {
w.Write(topics_frags[5])
w.Write(phrases[20])
w.Write(phrases[14])
w.Write(topics_frags[6])
w.Write(phrases[21])
w.Write(phrases[15])
w.Write(topics_frags[7])
w.Write(topics_frags[8])
w.Write(phrases[22])
w.Write(phrases[16])
w.Write(topics_frags[9])
w.Write(phrases[23])
w.Write(phrases[17])
w.Write(topics_frags[10])
} else {
w.Write(topics_frags[11])
w.Write(phrases[24])
w.Write(phrases[18])
w.Write(topics_frags[12])
w.Write(phrases[25])
w.Write(phrases[19])
w.Write(topics_frags[13])
}
w.Write(topics_frags[14])
@ -215,21 +197,21 @@ w.Write(topics_frags[14])
w.Write(topics_frags[15])
if tmpl_topics_vars.CurrentUser.ID != 0 {
w.Write(topics_frags[16])
w.Write(phrases[26])
w.Write(phrases[20])
w.Write(topics_frags[17])
w.Write(phrases[27])
w.Write(phrases[21])
w.Write(topics_frags[18])
w.Write(phrases[28])
w.Write(phrases[22])
w.Write(topics_frags[19])
w.Write(phrases[29])
w.Write(phrases[23])
w.Write(topics_frags[20])
w.Write(phrases[30])
w.Write(phrases[24])
w.Write(topics_frags[21])
if len(tmpl_topics_vars.ForumList) != 0 {
w.Write(topics_frags[22])
w.Write([]byte(tmpl_topics_vars.CurrentUser.Session))
w.Write(topics_frags[23])
w.Write(phrases[31])
w.Write(phrases[25])
w.Write(topics_frags[24])
if len(tmpl_topics_vars.ForumList) != 0 {
for _, item := range tmpl_topics_vars.ForumList {
@ -243,17 +225,17 @@ w.Write(topics_frags[28])
}
}
w.Write(topics_frags[29])
w.Write(phrases[32])
w.Write(phrases[26])
w.Write(topics_frags[30])
w.Write(phrases[33])
w.Write(phrases[27])
w.Write(topics_frags[31])
w.Write([]byte(tmpl_topics_vars.CurrentUser.Session))
w.Write(topics_frags[32])
w.Write([]byte(tmpl_topics_vars.CurrentUser.Avatar))
w.Write(topics_frags[33])
w.Write(phrases[34])
w.Write(phrases[28])
w.Write(topics_frags[34])
w.Write(phrases[35])
w.Write(phrases[29])
w.Write(topics_frags[35])
if len(tmpl_topics_vars.ForumList) != 0 {
for _, item := range tmpl_topics_vars.ForumList {
@ -269,28 +251,28 @@ w.Write(topics_frags[40])
}
}
w.Write(topics_frags[41])
w.Write(phrases[36])
w.Write(phrases[30])
w.Write(topics_frags[42])
w.Write(phrases[37])
w.Write(phrases[31])
w.Write(topics_frags[43])
w.Write(phrases[38])
w.Write(phrases[32])
w.Write(topics_frags[44])
w.Write(phrases[39])
w.Write(phrases[33])
w.Write(topics_frags[45])
w.Write(phrases[40])
w.Write(phrases[34])
w.Write(topics_frags[46])
if tmpl_topics_vars.CurrentUser.Perms.UploadFiles {
w.Write(topics_frags[47])
w.Write(phrases[41])
w.Write(phrases[35])
w.Write(topics_frags[48])
}
w.Write(topics_frags[49])
w.Write(phrases[42])
w.Write(phrases[36])
w.Write(topics_frags[50])
}
}
w.Write(topics_frags[51])
w.Write(phrases[43])
w.Write(phrases[37])
w.Write(topics_frags[52])
if len(tmpl_topics_vars.TopicList) != 0 {
for _, item := range tmpl_topics_vars.TopicList {
@ -337,12 +319,12 @@ w.Write([]byte(item.Creator.Name))
w.Write(topics_frags[72])
if item.IsClosed {
w.Write(topics_frags[73])
w.Write(phrases[44])
w.Write(phrases[38])
w.Write(topics_frags[74])
}
if item.Sticky {
w.Write(topics_frags[75])
w.Write(phrases[45])
w.Write(phrases[39])
w.Write(topics_frags[76])
}
w.Write(topics_frags[77])
@ -377,10 +359,10 @@ w.Write(topics_frags[90])
}
} else {
w.Write(topics_frags[91])
w.Write(phrases[46])
w.Write(phrases[40])
if tmpl_topics_vars.CurrentUser.Perms.CreateTopic {
w.Write(topics_frags[92])
w.Write(phrases[47])
w.Write(phrases[41])
w.Write(topics_frags[93])
}
w.Write(topics_frags[94])
@ -392,9 +374,9 @@ if tmpl_topics_vars.Page > 1 {
w.Write(paginator_frags[1])
w.Write([]byte(strconv.Itoa(tmpl_topics_vars.Page - 1)))
w.Write(paginator_frags[2])
w.Write(phrases[48])
w.Write(phrases[42])
w.Write(paginator_frags[3])
w.Write(phrases[49])
w.Write(phrases[43])
w.Write(paginator_frags[4])
w.Write([]byte(strconv.Itoa(tmpl_topics_vars.Page - 1)))
w.Write(paginator_frags[5])
@ -414,9 +396,9 @@ w.Write([]byte(strconv.Itoa(tmpl_topics_vars.Page + 1)))
w.Write(paginator_frags[10])
w.Write([]byte(strconv.Itoa(tmpl_topics_vars.Page + 1)))
w.Write(paginator_frags[11])
w.Write(phrases[50])
w.Write(phrases[44])
w.Write(paginator_frags[12])
w.Write(phrases[51])
w.Write(phrases[45])
w.Write(paginator_frags[13])
}
w.Write(paginator_frags[14])
@ -425,11 +407,11 @@ w.Write(topics_frags[96])
w.Write(footer_frags[0])
w.Write([]byte(common.BuildWidget("footer",tmpl_topics_vars.Header)))
w.Write(footer_frags[1])
w.Write(phrases[52])
w.Write(phrases[46])
w.Write(footer_frags[2])
w.Write(phrases[53])
w.Write(phrases[47])
w.Write(footer_frags[3])
w.Write(phrases[54])
w.Write(phrases[48])
w.Write(footer_frags[4])
if len(tmpl_topics_vars.Header.Themes) != 0 {
for _, item := range tmpl_topics_vars.Header.Themes {

2
templates/alert.html Normal file
View File

@ -0,0 +1,2 @@
{{if .Avatar}}<div class='alertItem withAvatar' style='background-image:url("{{.Avatar}}");'><a class='text' data-asid='{{.ASID}}' href="{{.Path}}">{{.Message}}</a></div>{{else}}
<div class='alertItem'><a href="{{.Path}}" class='text'>{{.Message}}</a></div>{{end}}

View File

@ -2,16 +2,9 @@
<nav class="nav">
<div class="move_left">
<div class="move_right">
<ul>{{/** Add a menu manager **/}}
<ul>
<li id="menu_overview" class="menu_left"><a href="/" rel="home">{{.Header.Site.ShortName}}</a></li>
<li id="menu_forums" class="menu_left"><a href="/forums/" aria-label="{{lang "menu_forums_aria"}}" title="{{lang "menu_forums_tooltip"}}"></a></li>
<li class="menu_left menu_topics"><a href="/" aria-label="{{lang "menu_topics_aria"}}" title="{{lang "menu_topics_tooltip"}}"></a></li>
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter" aria-label="{{lang "menu_alert_counter_aria"}}"></div>
<div class="alert_aftercounter"></div>
<div class="alertList" aria-label="{{lang "menu_alert_list_aria"}}"></div>
</li>
{{dock "topMenu" .Header }}
{{if .CurrentUser.Loggedin}}
<li class="menu_left menu_account"><a href="/user/edit/critical/" aria-label="{{lang "menu_account_aria"}}" title="{{lang "menu_account_tooltip"}}"></a></li>
<li class="menu_left menu_profile"><a href="{{.CurrentUser.Link}}" aria-label="{{lang "menu_profile_aria"}}" title="{{lang "menu_profile_tooltip"}}"></a></li>

View File

@ -0,0 +1,6 @@
<li id="general_alerts" class="menu_right menu_alerts">
<div class="alert_bell"></div>
<div class="alert_counter" aria-label="{{lang "menu_alert_counter_aria"}}"></div>
<div class="alert_aftercounter"></div>
<div class="alertList" aria-label="{{lang "menu_alert_list_aria"}}"></div>
</li>

1
templates/menu_item.html Normal file
View File

@ -0,0 +1 @@
<li id="{{.HTMLID}}" class="menu_{{.Position}} {{.CSSClass}}"><a href="{{.Path}}" aria-label="{{.Aria}}" title="{{.Tooltip}}"></a></li>

View File

@ -7,12 +7,21 @@
</div>
<div id="panel_debug" class="colstack_grid">
<div class="grid_item grid_stat"><span>{{lang "panel_debug_uptime_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_open_database_connections_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_adapter_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_go_version_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_database_version_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{.Uptime}}</span></div>
<div class="grid_item grid_stat"><span>{{.GoVersion}}</span></div>
<div class="grid_item grid_stat"><span>{{.DBVersion}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_open_database_connections_label"}}</span></div>
<div class="grid_item grid_stat"><span>{{lang "panel_debug_adapter_label"}}</span></div>
<div class="grid_item grid_stat"><span>???</span></div>
<div class="grid_item grid_stat"><span>{{.OpenConns}}</span></div>
<div class="grid_item grid_stat"><span>{{.DBAdapter}}</span></div>
<div class="grid_item grid_stat"><span>?</span></div>
</div>
</main>
</div>

View File

@ -5,6 +5,9 @@
<div class="colstack_item colstack_head">
<div class="rowitem"><a href="/panel/themes/">Theme Manager</a></div>
</div>
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="/panel/themes/menus/">Menus</a></div>
</div>
<div class="colstack_item rowmenu">
<div class="rowitem passive"><a href="#">Widgets</a></div>
</div>

View File

@ -5,7 +5,7 @@
"Creator": "Azareal",
"URL": "github.com/Azareal/Gosora",
"Tag": "WIP",
"Docks":["rightSidebar","footer"],
"Docks":["topMenu","rightSidebar","footer"],
"Templates": [
{
"Name": "topic",

View File

@ -6,6 +6,7 @@
"FullImage": "shadow.png",
"URL": "github.com/Azareal/Gosora",
"BgAvatars":true,
"Docks":["topMenu"],
"Templates": [
{
"Name": "topic",

View File

@ -7,7 +7,7 @@
"MobileFriendly": true,
"BgAvatars":true,
"URL": "github.com/Azareal/Gosora",
"Docks":["rightSidebar"],
"Docks":["topMenu","rightSidebar"],
"Templates": [
{
"Name": "topic",

View File

@ -9,6 +9,7 @@
"HideFromThemes": true,
"BgAvatars":true,
"URL": "github.com/Azareal/Gosora",
"Docks":["topMenu"],
"Templates": [
{
"Name": "topic",

View File

@ -7,7 +7,7 @@
"MobileFriendly": true,
"URL": "github.com/Azareal/Gosora",
"BgAvatars":true,
"Docks":["rightSidebar"],
"Docks":["topMenu","rightSidebar"],
"Templates": [
{
"Name": "topic",

View File

@ -0,0 +1,35 @@
// +build !no_templategen
// Code generated by Gosora. More below:
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
package tmpl
import "../../common"
import "io"
import "strconv"
// nolint
func init() {
common.TmplPtrMap["o_alert"] = Template_alert
}
// nolint
func Template_alert(tmpl_alert_vars common.AlertItem, w io.Writer) error {
if tmpl_alert_vars.Avatar != "" {
w.Write(alert_frags[0])
w.Write([]byte(tmpl_alert_vars.Avatar))
w.Write(alert_frags[1])
w.Write([]byte(strconv.Itoa(tmpl_alert_vars.ASID)))
w.Write(alert_frags[2])
w.Write([]byte(tmpl_alert_vars.Path))
w.Write(alert_frags[3])
w.Write([]byte(tmpl_alert_vars.Message))
w.Write(alert_frags[4])
} else {
w.Write(alert_frags[5])
w.Write([]byte(tmpl_alert_vars.Path))
w.Write(alert_frags[6])
w.Write([]byte(tmpl_alert_vars.Message))
w.Write(alert_frags[7])
}
return nil
}

View File

@ -0,0 +1,16 @@
package tmpl
var alert_frags = make([][]byte,9)
// nolint
func init() {
alert_frags[0] = []byte(`<div class='alertItem withAvatar' style='background-image:url("`)
alert_frags[1] = []byte(`");'><a class='text' data-asid='`)
alert_frags[2] = []byte(`' href="`)
alert_frags[3] = []byte(`">`)
alert_frags[4] = []byte(`</a></div>`)
alert_frags[5] = []byte(`
<div class='alertItem'><a href="`)
alert_frags[6] = []byte(`" class='text'>`)
alert_frags[7] = []byte(`</a></div>`)
}