From 16e16a033bc40d944c72dcddfd829e7db3840985 Mon Sep 17 00:00:00 2001 From: DutchEllie Date: Tue, 1 Mar 2022 12:02:05 +0100 Subject: [PATCH] various things --- .gitignore | 1 + cmd/server/main.go | 41 +++++++++++++ go.mod | 22 +++++++ go.sum | 54 ++++++++++++++++++ internal/pages/repository.go | 24 ++++++++ internal/pages/routes.go | 26 +++++++++ internal/pages/service.go | 31 ++++++++++ internal/templatelib/library.go | 46 +++++++++++++++ test-website/base.html | 30 ++++++++++ test-website/static/anisha.css | 1 + test-website/static/images/008.gif | Bin 0 -> 8555 bytes .../static/images/background_star.gif | Bin 0 -> 3785 bytes test-website/static/style.css | 20 +++++++ website/templates/base.layout.tmpl | 16 ++++++ website/templates/index.page.tmpl | 0 15 files changed, 312 insertions(+) create mode 100644 .gitignore create mode 100644 cmd/server/main.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/pages/repository.go create mode 100644 internal/pages/routes.go create mode 100644 internal/pages/service.go create mode 100644 internal/templatelib/library.go create mode 100644 test-website/base.html create mode 100644 test-website/static/anisha.css create mode 100644 test-website/static/images/008.gif create mode 100644 test-website/static/images/background_star.gif create mode 100644 test-website/static/style.css create mode 100644 website/templates/base.layout.tmpl create mode 100644 website/templates/index.page.tmpl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..600d2d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode \ No newline at end of file diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..2c4a3a6 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "fmt" + "os" + + "git.home.dutchellie.nl/DutchEllie/proper-website-2/internal/pages" + "git.home.dutchellie.nl/DutchEllie/proper-website-2/internal/templatelib" + "github.com/gin-gonic/gin" +) + +func main() { + port := os.Getenv("SRV_PORT") + if port == "" { + msg := `Website writen in Go! + +Please include all the proper environment variables: +- "SRV_PORT" + ` + fmt.Println(msg) + return + } + address := ":" + port + + lib, err := templatelib.NewTemplateLibrary("../../website/templates") + if err != nil { + fmt.Println(err) + return + } + + router, _ := setupRouter(lib) + + router.Run(address) +} + +func setupRouter(lib templatelib.TemplateLibrary) (*gin.Engine, error) { + router := gin.Default() + + pages.RegisterHandlers(router.Group("/"), pages.NewService(pages.NewRepository(&lib))) + return router, nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0979de5 --- /dev/null +++ b/go.mod @@ -0,0 +1,22 @@ +module git.home.dutchellie.nl/DutchEllie/proper-website-2 + +go 1.17 + +require github.com/gin-gonic/gin v1.7.7 + +require ( + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.4.1 // indirect + github.com/golang/protobuf v1.3.3 // indirect + github.com/json-iterator/go v1.1.9 // indirect + github.com/leodido/go-urn v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect + github.com/ugorji/go/codec v1.1.7 // indirect + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect + golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect + gopkg.in/yaml.v2 v2.2.8 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..5ee9be1 --- /dev/null +++ b/go.sum @@ -0,0 +1,54 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/pages/repository.go b/internal/pages/repository.go new file mode 100644 index 0000000..bb7f7ad --- /dev/null +++ b/internal/pages/repository.go @@ -0,0 +1,24 @@ +package pages + +import ( + "context" + "html/template" + + "git.home.dutchellie.nl/DutchEllie/proper-website-2/internal/templatelib" +) + +type Repository interface { + Page(ctx context.Context, name string) (*template.Template, error) +} + +func NewRepository(lib *templatelib.TemplateLibrary) Repository { + return repository{lib} +} + +type repository struct { + library *templatelib.TemplateLibrary +} + +func (r repository) Page(ctx context.Context, name string) (*template.Template, error) { + return r.library.Templates[name], nil +} diff --git a/internal/pages/routes.go b/internal/pages/routes.go new file mode 100644 index 0000000..72f3088 --- /dev/null +++ b/internal/pages/routes.go @@ -0,0 +1,26 @@ +package pages + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func RegisterHandlers(r *gin.RouterGroup, service Service) { + res := resource{service} + + r.GET("/index", res.getindex) +} + +type resource struct { + service Service +} + +func (r resource) getindex(c *gin.Context) { + page, err := r.service.Page(c.Request.Context(), "index") + if err != nil { + c.AbortWithStatus(http.StatusInternalServerError) + } + + page.template.Execute(c.Writer, nil) +} diff --git a/internal/pages/service.go b/internal/pages/service.go new file mode 100644 index 0000000..4deced3 --- /dev/null +++ b/internal/pages/service.go @@ -0,0 +1,31 @@ +package pages + +import ( + "context" + "html/template" +) + +type Service interface { + Page(ctx context.Context, name string) (Page, error) +} + +type Page struct { + template *template.Template +} + +type service struct { + repository Repository + //logger log.Logger +} + +func NewService(r Repository) Service { + return service{r} +} + +func (s service) Page(ctx context.Context, name string) (Page, error) { + page, err := s.repository.Page(ctx, name) + if err != nil { + return Page{}, err + } + return Page{page}, nil +} diff --git a/internal/templatelib/library.go b/internal/templatelib/library.go new file mode 100644 index 0000000..a35e47d --- /dev/null +++ b/internal/templatelib/library.go @@ -0,0 +1,46 @@ +package templatelib + +import ( + "html/template" + "path/filepath" +) + +type TemplateLibrary struct { + Templates map[string]*template.Template +} + +func NewTemplateLibrary(dir string) (TemplateLibrary, error) { + t := make(map[string]*template.Template) + + pages, err := filepath.Glob(filepath.Join(dir, "*.page.tmpl")) + if err != nil { + return TemplateLibrary{}, err + } + + for _, page := range pages { + name := filepath.Base(page) + ts, err := template.ParseFiles(page) + if err != nil { + return TemplateLibrary{}, err + } + + // Use the ParseGlob method to add any 'layout' templates to the + // template set (in our case, it's just the 'base' layout at the + // moment). + ts, err = ts.ParseGlob(filepath.Join(dir, "*.layout.tmpl")) + if err != nil { + return TemplateLibrary{}, err + } + + // Use the ParseGlob method to add any 'partial' templates to the + // template set (in our case, it's just the 'footer' partial at the + // moment). + ts, err = ts.ParseGlob(filepath.Join(dir, "*.partial.tmpl")) + if err != nil { + return TemplateLibrary{}, err + } + t[name] = ts + } + + return TemplateLibrary{Templates: t}, nil +} diff --git a/test-website/base.html b/test-website/base.html new file mode 100644 index 0000000..a436432 --- /dev/null +++ b/test-website/base.html @@ -0,0 +1,30 @@ + + + + + + + + + Index + + +
+ Internetica Galactica +
+
+ +
+ +
+
+ + + + \ No newline at end of file diff --git a/test-website/static/anisha.css b/test-website/static/anisha.css new file mode 100644 index 0000000..4c88c73 --- /dev/null +++ b/test-website/static/anisha.css @@ -0,0 +1 @@ +@font-face {font-family: anisha; src: url(data:;base64,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ABwAMwBQABwANABQABwANgBQABwANwBkABwAOACgABwAOQCMABwAOwCMABwAPABkABwAPQB4ABwAPgCMABwAPwBkAB0AJ//sAB0AKP/sAB0AN//sAB0AOP/YAB0AOf/sAB4ANgAUAB4AOQAUAB4AOgA8AB4APAAUAB4APgAoAB4APwAoAB8AJ//sAB8AKP/OAB8ANv/sACAAJ//sACAAKP/sACEAIf/OACEAJ//OACEAKP/OACEAKf/OACEANv/YACEAN//YACEAOf/sACEAO//YACEAPP/YACEAPf/YACEAPv/sACEAP//sACIAJ//sACIANwAUACIAPwAoACMAG/+cACMAJ//sACMAKf/OACMALP/OACMAOP/YACMAPAAoACMAPwAoACQAMf/OACQAMv/OACQANwAoACQAOwA8ACQAPQBkACQAPwA8ACUANwAUACUAPwA8ACYAEACMACYAG//OACYAHACMACYAHQCMACYAHgCMACYAHwCMACYAIACMACYAIQCMACYAIgCMACYAIwCMACYAJACMACYAJQCMACYAJgCMACYAJwCMACYAKACMACYAKQCMACYAKgCMACYAKwCMACYALACMACYALQCMACYALgCMACYALwCMACYAMACMACYAMQCMACYAMgCMACYAMwCMACYANACMACYANgC0ACYANwEEACYAOADcACYAOQDcACYAOgB4ACYAOwDwACYAPAC0ACYAPQEsACYAPgDcACYAPwEEACcAG//OACcAHP/OACcAHf/OACcAHv/OACcAH//OACcAIP/OACcAIf/sACcAIv+wACcAI//OACcAJP/OACcAJf/OACcAJv/OACcAJ//OACcAKP/OACcAKf+wACcAKv/OACcAK//OACcALP/OACcALf+wACcALv/OACcAL//OACcAMP/OACcAMf/OACcAMv/OACcAM//OACcANP+wACcANv/sACcAN//YACcAOP/YACcAO//YACcAPf/YACgAG//OACgAHf/OACgAHv/OACgAH//OACgAIP/sACgAIf/OACgAIv/OACgAJP/OACgAJf/OACgAJ//OACgAKf/OACgAKv/OACgAK//OACgALf/OACgALv/OACgAL//OACgAMP/OACgAMf/OACgANv/sACgAN//YACgAOP/sACkAOAAUACkAOQAUACkAOwAUACkAPgAUACkAPwAoACoANgAUACoANwAUACoAOQAUACoAOgA8ACoAOwAoACoAPAAoACoAPQA8ACoAPgAUACoAPwAoACsAIQAUACsAJwAeACsAKAAUACsANgBkACsANwCgACsAOACMACsAOQBkACsAOgAoACsAOwCMACsAPABQACsAPQDwACsAPgB4ACsAPwCgACwANwAUACwAPQAUACwAPwA8AC0AHv/sAC0AIP/sAC0AJ//sAC0AKP/sAC0AOf/sAC0AO//sAC4ANwAoAC4AOAAoAC4AOQAoAC4AOwA8AC4APQAoAC4APgA8AC4APwA8AC8AG/+cAC8ANwAoAC8AOAAUAC8AOQAUAC8APQA8AC8APwBQADAAA//OADAABf/YADAAG/+cADAANwAoADAAOAAUADAAOQAUADAAPQA8ADAAPwBQADEANgAUADEAOQAUADEAOgA8ADEAPAAUADEAPgAoADIAG//sADIANgAUADIANwAoADIAPQA8ADIAPwAoADMAPQA8ADMAPwA8ADQANwAUADQAPQA8ADQAPwA8AAEAAAAMAAAAAAAAAAIAAAABAAAACgAwAEoAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAEAAAAAP//AAEAAQACa2VybgAOa2VybgAUAAAAAQAAAAAAAQAAAAEABAAJAAgAAQAIAAEAAgAAAAgAAQS+AAQAAAAmAFYAXABiAGgAbgB0AHoAgACGAIwAkgCYAJ4AxAFSAWgBggGQAZoBzAHaAfgCEgIcArIDMAOGA5wDwgP4BAYEIAQ+BFgEegSQBKYEsAABACf/zgABACwAFAABACb/zgABACD/zgABACoAFAABADEAFAABAB8AKAABADIAFAABAB4AMgABACj/zgABACEAFAABACsAFAAJADYAFAA3ABQAOQAUADoAPAA7ACgAPAAoAD0APAA+ACgAPwA8ACMADABQABsAUAAdAFAAHgBQAB8AUAAgAFAAIQBQACIAUAAjAFAAJABQACUAUAAmAFAAJwBQACgAUAApAFAAKgBQACsAUAAsAFAALQBQAC4AUAAvAFAAMABQADEAUAAyAFAAMwBQADQAUAA2AFAANwBkADgAoAA5AIwAOwCMADwAZAA9AHgAPgCMAD8AZAAFACf/7AAo/+wAN//sADj/2AA5/+wABgA2ABQAOQAUADoAPAA8ABQAPgAoAD8AKAADACf/7AAo/84ANv/sAAIAJ//sACj/7AAMACH/zgAn/84AKP/OACn/zgA2/9gAN//YADn/7AA7/9gAPP/YAD3/2AA+/+wAP//sAAMAJ//sADcAFAA/ACgABwAb/5wAJ//sACn/zgAs/84AOP/YADwAKAA/ACgABgAx/84AMv/OADcAKAA7ADwAPQBkAD8APAACADcAFAA/ADwAJQAQAIwAG//OABwAjAAdAIwAHgCMAB8AjAAgAIwAIQCMACIAjAAjAIwAJACMACUAjAAmAIwAJwCMACgAjAApAIwAKgCMACsAjAAsAIwALQCMAC4AjAAvAIwAMACMADEAjAAyAIwAMwCMADQAjAA2ALQANwEEADgA3AA5ANwAOgB4ADsA8AA8ALQAPQEsAD4A3AA/AQQAHwAb/84AHP/OAB3/zgAe/84AH//OACD/zgAh/+wAIv+wACP/zgAk/84AJf/OACb/zgAn/84AKP/OACn/sAAq/84AK//OACz/zgAt/7AALv/OAC//zgAw/84AMf/OADL/zgAz/84ANP+wADb/7AA3/9gAOP/YADv/2AA9/9gAFQAb/84AHf/OAB7/zgAf/84AIP/sACH/zgAi/84AJP/OACX/zgAn/84AKf/OACr/zgAr/84ALf/OAC7/zgAv/84AMP/OADH/zgA2/+wAN//YADj/7AAFADgAFAA5ABQAOwAUAD4AFAA/ACgACQA2ABQANwAUADkAFAA6ADwAOwAoADwAKAA9ADwAPgAUAD8AKAANACEAFAAnAB4AKAAUADYAZAA3AKAAOACMADkAZAA6ACgAOwCMADwAUAA9APAAPgB4AD8AoAADADcAFAA9ABQAPwA8AAYAHv/sACD/7AAn/+wAKP/sADn/7AA7/+wABwA3ACgAOAAoADkAKAA7ADwAPQAoAD4APAA/ADwABgAb/5wANwAoADgAFAA5ABQAPQA8AD8AUAAIAAP/zgAF/9gAG/+cADcAKAA4ABQAOQAUAD0APAA/AFAABQA2ABQAOQAUADoAPAA8ABQAPgAoAAUAG//sADYAFAA3ACgAPQA8AD8AKAACAD0APAA/ADwAAwA3ABQAPQA8AD8APAACAAkAAQACAAAABgAGAAIACQAKAAMADAANAAUADwAQAAcAEgASAAkAFAAUAAoAFgAWAAsAGwA0AAwAAAEABAIAAQEB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) format('truetype');font-weight:normal; font-style:normal;)} \ No newline at end of file diff --git a/test-website/static/images/008.gif b/test-website/static/images/008.gif new file mode 100644 index 0000000000000000000000000000000000000000..1982ec6ea5a4fccbf0473cae5a43484d175b1d29 GIT binary patch literal 8555 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 literal 0 HcmV?d00001 diff --git a/test-website/static/images/background_star.gif b/test-website/static/images/background_star.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3c84ffdeb0a7d2bc15212110ec7c2093d3a3591 GIT binary patch literal 3785 zcmZ?wbhEHbEMzET_|5YB*a_*kzjz)KrZ7321bx5SOFuDT?kcE2xLn@*o-05M4+PD4p$wn0@>PN zK1lrpsLb>)89>%MD6at74yYKh6xcl=v%Y}bxd7z;=RzROv~~Yi4UnB6dw_r{?*D24 zH0c7!{V#+;hSJ#mFMw81*Zm(rt_HdP6*&I!xt|HB>YD-2dWIVyJ*>b4_2~hS@eVBR z!MTayD@dFRDE=@u`q-VekN-~N+SrkCD4oCqgn=o+vV_@Wv@z}87U^9oXR?LYF3lF#R z^E%A&*tqCuw}f%lof8`uAMaOi?($LCwB+PuMb-r|CpRrUJ>4Kusl#*gva_=-ieGKf zC|rJizC$yYtXE0O#l;?zwPdRjULKn1m+RE4HDSr=l_AkeH%^(pKD{n(eID=XQiZTh z8JAbZp5C_h_I8D}hpuXD&pO6X%ztfd$MvUi(>R&9_uVjmf8d}9vqoIbj;w@3UA3!t zG{3KRKGth0rq^?!=-K%N&fRizzpgpBY>B;}U+!h&>}BhdPtWtct@i5H8sEolH-f*s zx_h8G{hIEc9UmW`n5-QycjfEBduL8M_4~y>e*fx*E?>gF+RE>bnGYp)``hg^e)s7C zd)@hSaf*%KJ|v1I*x4^EzVtQQUp!*L{{K(@Gv0`I`@V8&eBDRY6%U$t!a@?774Nb= zY!M0bxK+K-c7{Nk#M|%-rHO?ZGK?zIeoSuDpE+Yr*YQG)MXj4yS%?jEb}WHz0ts|( zc%Td63-noNfi6URptI2<(77Oi&V(N5O~62xLj-ySse#T!-9XoY1UfHm0^N-fp3+(2 zfzC?1l+FeTbjCpx=$u$mx(s@ti{VS@U1%v?jQEt!3=eb~7B4tbdLo4>J%)mmPX9nh sO6iC|r+-QxS%HpJks<<{9 literal 0 HcmV?d00001 diff --git a/test-website/static/style.css b/test-website/static/style.css new file mode 100644 index 0000000..04e3ad1 --- /dev/null +++ b/test-website/static/style.css @@ -0,0 +1,20 @@ +html { + background-image: url(images/background_star.gif); +} + +body { + width: 900px; + position: relative; + margin-left: auto; + margin-right: auto; + color:aliceblue; +} + +.header { + border: 3px solid; + border-radius: 4px; + border-color: rgb(252, 230, 255); + background-color: rgb(54, 39, 48); + font-size: 5em; + font-family: anisha; +} \ No newline at end of file diff --git a/website/templates/base.layout.tmpl b/website/templates/base.layout.tmpl new file mode 100644 index 0000000..51754ac --- /dev/null +++ b/website/templates/base.layout.tmpl @@ -0,0 +1,16 @@ +{{ define "base" }} + + + + + {{template "title" .}} + + +
+

+
+ + + + +{{ end }} \ No newline at end of file diff --git a/website/templates/index.page.tmpl b/website/templates/index.page.tmpl new file mode 100644 index 0000000..e69de29