forked from goffee/core
theme base system
This commit is contained in:
parent
1172e23c16
commit
465e88bf40
7 changed files with 74 additions and 51 deletions
11
core.go
11
core.go
|
@ -39,7 +39,7 @@ var basePath string
|
||||||
var disableEvents bool = false
|
var disableEvents bool = false
|
||||||
|
|
||||||
//go:embed all:template
|
//go:embed all:template
|
||||||
var resources embed.FS
|
var components_resources embed.FS
|
||||||
|
|
||||||
type configContainer struct {
|
type configContainer struct {
|
||||||
Request RequestConfig
|
Request RequestConfig
|
||||||
|
@ -79,6 +79,10 @@ func (app *App) Bootstrap() {
|
||||||
NewEventsManager()
|
NewEventsManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (app *App) RegisterTemplates(templates_resources embed.FS) {
|
||||||
|
NewTemplates(components_resources, templates_resources)
|
||||||
|
}
|
||||||
|
|
||||||
func (app *App) Run(router *httprouter.Router) {
|
func (app *App) Run(router *httprouter.Router) {
|
||||||
portNumber := os.Getenv("App_HTTP_PORT")
|
portNumber := os.Getenv("App_HTTP_PORT")
|
||||||
if portNumber == "" {
|
if portNumber == "" {
|
||||||
|
@ -97,11 +101,6 @@ func (app *App) Run(router *httprouter.Router) {
|
||||||
// add public path
|
// add public path
|
||||||
publicPath := os.Getenv("TEMPLATE_PUBLIC")
|
publicPath := os.Getenv("TEMPLATE_PUBLIC")
|
||||||
router.ServeFiles("/public/*filepath", http.Dir(publicPath))
|
router.ServeFiles("/public/*filepath", http.Dir(publicPath))
|
||||||
|
|
||||||
// templates
|
|
||||||
var template = new(Template)
|
|
||||||
template.NewTemplates(resources)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
useHttpsStr := os.Getenv("App_USE_HTTPS")
|
useHttpsStr := os.Getenv("App_USE_HTTPS")
|
||||||
|
|
15
response.go
15
response.go
|
@ -6,6 +6,7 @@
|
||||||
package core
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
@ -63,6 +64,20 @@ func (rs *Response) HTML(body string) *Response {
|
||||||
return rs
|
return rs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO add doc
|
||||||
|
func (rs *Response) Template(name string, data interface{}) *Response {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
if rs.isTerminated == false {
|
||||||
|
err := tmpl.ExecuteTemplate(&buffer, name, data)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("error executing template: %v", err))
|
||||||
|
}
|
||||||
|
rs.contentType = CONTENT_TYPE_HTML
|
||||||
|
buffer.WriteTo(rs.HttpResponseWriter)
|
||||||
|
}
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
// TODO add doc
|
// TODO add doc
|
||||||
func (rs *Response) SetStatusCode(code int) *Response {
|
func (rs *Response) SetStatusCode(code int) *Response {
|
||||||
if rs.isTerminated == false {
|
if rs.isTerminated == false {
|
||||||
|
|
45
template.go
45
template.go
|
@ -1,45 +0,0 @@
|
||||||
// Copyright (c) 2024 Zeni Kim <zenik@smarteching.com>
|
|
||||||
// Use of this source code is governed by MIT-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package core
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"embed"
|
|
||||||
"fmt"
|
|
||||||
"html/template"
|
|
||||||
"io/fs"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Template struct {
|
|
||||||
tmpl *template.Template
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Template) NewTemplates(resources embed.FS) {
|
|
||||||
var paths []string
|
|
||||||
fs.WalkDir(resources, ".", func(path string, d fs.DirEntry, err error) error {
|
|
||||||
if strings.Contains(d.Name(), ".html") {
|
|
||||||
paths = append(paths, path)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
t.tmpl = template.Must(template.ParseFS(resources, paths...))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Template) Render(w http.ResponseWriter, name string, data interface{}) {
|
|
||||||
var buffer bytes.Buffer
|
|
||||||
|
|
||||||
err := t.tmpl.ExecuteTemplate(&buffer, name, data)
|
|
||||||
if err != nil {
|
|
||||||
err = fmt.Errorf("error executing template: %w", err)
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "text/html; charset=UTF-8")
|
|
||||||
buffer.WriteTo(w)
|
|
||||||
}
|
|
8
template/components/head.html
Normal file
8
template/components/head.html
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{{define "head"}}
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="initial-scale=1, viewport-fit=cover, width=device-width, maximum-scale=1.0, minimum-scale=1.0">
|
||||||
|
<title>{{.}} | Goffee</title>
|
||||||
|
<link href="/public/style.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
{{end}}
|
5
template/components/title.go
Normal file
5
template/components/title.go
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package components
|
||||||
|
|
||||||
|
type Title struct {
|
||||||
|
Label string
|
||||||
|
}
|
5
template/components/title.html
Normal file
5
template/components/title.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{{define "title"}}
|
||||||
|
<div class="title">
|
||||||
|
<h1>{{.Label}}</h1>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
36
templates.go
Normal file
36
templates.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright (c) 2024 Zeni Kim <zenik@smarteching.com>
|
||||||
|
// Use of this source code is governed by MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"html/template"
|
||||||
|
"io/fs"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var tmpl *template.Template = nil
|
||||||
|
|
||||||
|
func NewTemplates(components embed.FS, templates embed.FS) {
|
||||||
|
// templates
|
||||||
|
var paths []string
|
||||||
|
fs.WalkDir(components, ".", func(path string, d fs.DirEntry, err error) error {
|
||||||
|
if strings.Contains(d.Name(), ".html") {
|
||||||
|
paths = append(paths, path)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
var pathst []string
|
||||||
|
fs.WalkDir(templates, ".", func(patht string, d fs.DirEntry, err error) error {
|
||||||
|
if strings.Contains(d.Name(), ".html") {
|
||||||
|
pathst = append(pathst, patht)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
tmpla := template.Must(template.ParseFS(components, paths...))
|
||||||
|
tmpl = template.Must(tmpla.ParseFS(templates, pathst...))
|
||||||
|
}
|
Loading…
Reference in a new issue