Browse Source

Standard theme template files inside engine

Vova Tkach 5 years ago
parent
commit
2d862cf54d

+ 6 - 2
Makefile

@@ -2,7 +2,7 @@ VERSION="1.1.1"
 
 default: debug test run
 
-debug: version dockerfile
+debug: version template dockerfile
 	go vet ./...
 	gofmt -d ./
 	gofmt -w ./
@@ -14,7 +14,7 @@ test:
 run:
 	@./fave -host 0.0.0.0 -port 8080 -dir ./hosts -debug true -keepalive true
 
-build: clean version dockerfile
+build: clean version template dockerfile
 	@-mkdir ./bin
 	@cd ./bin
 	@cd ..
@@ -47,6 +47,10 @@ version:
 	@echo "" >> consts/consts_version.go
 	@echo "const ServerVersion = \"${VERSION}\"" >> consts/consts_version.go
 
+template:
+	./support/template.sh
+	@gofmt -w ./assets/template/
+
 dockerfile:
 	@echo "FROM debian:latest" > Dockerfile
 	@echo "MAINTAINER Vova Tkach <vladimirok5959@gmail.com>" >> Dockerfile

+ 12 - 0
assets/template/404_html_file.go

@@ -0,0 +1,12 @@
+package template
+
+var Var404HtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	<div class="card-body">
+		<h2 class="card-title">Error 404</h2>
+		<div class="page-content">
+			The page what you looking for "<b>{{$.Data.RequestURL}}</b>" is not found
+		</div>
+	</div>
+</div>
+{{template "footer.html" .}}`)

+ 60 - 0
assets/template/blog_category_html_file.go

@@ -0,0 +1,60 @@
+package template
+
+var VarBlogCategoryHtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	<div class="post">
+		<div class="card-body">
+			<b>Category author:</b> {{$.Data.Blog.Category.User.FirstName}} {{$.Data.Blog.Category.User.LastName}}
+		</div>
+	</div>
+</div>
+<div class="card mb-4">
+	{{if $.Data.Blog.HavePosts}}
+		{{range $.Data.Blog.Posts}}
+			<div class="post">
+				<div class="card-body">
+					<h2 class="card-title">
+						<a href="{{.Permalink}}">
+							{{.Name}}
+						</a>
+					</h2>
+					<div class="post-content">
+						{{.Briefly}}
+					</div>
+					<div class="post-date">
+						<div><small>Published on {{.DateTimeFormat "02/01/2006, 15:04:05"}}</small></div>
+						<div>Author: {{.User.FirstName}} {{.User.LastName}}</div>
+					</div>
+				</div>
+			</div>
+		{{end}}
+	{{else}}
+		<div class="card-body">
+			Sorry, no posts matched your criteria
+		</div>
+	{{end}}
+</div>
+{{if $.Data.Blog.HavePosts}}
+	{{if gt $.Data.Blog.PostsMaxPage 1 }}
+		<nav>
+			<ul class="pagination mb-4">
+				{{if $.Data.Blog.PaginationPrev}}
+					<li class="page-item{{if $.Data.Blog.PaginationPrev.Current}} disabled{{end}}">
+						<a class="page-link" href="{{$.Data.Blog.PaginationPrev.Link}}">Previous</a>
+					</li>
+				{{end}}
+				{{range $.Data.Blog.Pagination}}
+					<li class="page-item{{if .Current}} active{{end}}">
+						<a class="page-link" href="{{.Link}}">{{.Num}}</a>
+					</li>
+				{{end}}
+				{{if $.Data.Blog.PaginationNext}}
+					<li class="page-item{{if $.Data.Blog.PaginationNext.Current}} disabled{{end}}">
+						<a class="page-link" href="{{$.Data.Blog.PaginationNext.Link}}">Next</a>
+					</li>
+				{{end}}
+			</ul>
+		</nav>
+	{{end}}
+{{end}}
+{{template "footer.html" .}}`)

+ 57 - 0
assets/template/blog_html_file.go

@@ -0,0 +1,57 @@
+package template
+
+var VarBlogHtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	{{if $.Data.Blog.HavePosts}}
+		{{range $.Data.Blog.Posts}}
+			<div class="post">
+				<div class="card-body">
+					<h2 class="card-title">
+						<a href="{{.Permalink}}">
+							{{.Name}}
+						</a>
+					</h2>
+					<div class="post-content">
+						{{.Briefly}}
+					</div>
+					<div class="post-date">
+						<div><small>Published on {{.DateTimeFormat "02/01/2006, 15:04:05"}}</small></div>
+						<div>Author: {{.User.FirstName}} {{.User.LastName}}</div>
+					</div>
+				</div>
+			</div>
+		{{end}}
+	{{else}}
+		<div class="card-body">
+			Sorry, no posts matched your criteria
+		</div>
+	{{end}}
+</div>
+{{if $.Data.Blog.HavePosts}}
+	{{if gt $.Data.Blog.PostsMaxPage 1 }}
+		<nav>
+			<ul class="pagination mb-4">
+				{{if $.Data.Blog.PaginationPrev}}
+					<li class="page-item{{if $.Data.Blog.PaginationPrev.Current}} disabled{{end}}">
+						<a class="page-link" href="{{$.Data.Blog.PaginationPrev.Link}}">Previous</a>
+					</li>
+				{{end}}
+				{{range $.Data.Blog.Pagination}}
+					{{if .Dots}}
+						<li class="page-item disabled"><a class="page-link" href="">...</a></li>
+					{{else}}
+						<li class="page-item{{if .Current}} active{{end}}">
+							<a class="page-link" href="{{.Link}}">{{.Num}}</a>
+						</li>
+					{{end}}
+				{{end}}
+				{{if $.Data.Blog.PaginationNext}}
+					<li class="page-item{{if $.Data.Blog.PaginationNext.Current}} disabled{{end}}">
+						<a class="page-link" href="{{$.Data.Blog.PaginationNext.Link}}">Next</a>
+					</li>
+				{{end}}
+			</ul>
+		</nav>
+	{{end}}
+{{end}}
+{{template "footer.html" .}}`)

+ 17 - 0
assets/template/blog_post_html_file.go

@@ -0,0 +1,17 @@
+package template
+
+var VarBlogPostHtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	<div class="card-body">
+		<h2 class="card-title">{{$.Data.Blog.Post.Name}}</h2>
+		<div class="page-content">
+			{{$.Data.Blog.Post.Briefly}}
+			{{$.Data.Blog.Post.Content}}
+		</div>
+	</div>
+	<div class="card-footer text-muted">
+		<div>Published on {{$.Data.Blog.Post.DateTimeFormat "02/01/2006, 15:04:05"}}</div>
+		<div>Author: {{$.Data.Blog.Post.User.FirstName}} {{$.Data.Blog.Post.User.LastName}}</div>
+	</div>
+</div>
+{{template "footer.html" .}}`)

+ 29 - 0
assets/template/footer_html_file.go

@@ -0,0 +1,29 @@
+package template
+
+var VarFooterHtmlFile = []byte(`						</div>
+						<div class="col-md-4">
+							{{template "sidebar-right.html" .}}
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<footer class="bg-light py-4">
+			<div class="container">
+				<p class="m-0 text-center text-black">
+					Copyright © Your Website {{if eq ($.Data.DateTimeFormat "2006") "2019"}}
+						{{$.Data.DateTimeFormat "2006"}}
+					{{else}}
+						2019-{{$.Data.DateTimeFormat "2006"}}
+					{{end}}
+				</p>
+			</div>
+		</footer>
+		<!-- Optional JavaScript -->
+		<!-- jQuery first, then Popper.js, then Bootstrap JS -->
+		<script src="{{$.System.PathJsJquery}}"></script>
+		<script src="{{$.System.PathJsPopper}}"></script>
+		<script src="{{$.System.PathJsBootstrap}}"></script>
+		<script src="{{$.System.PathThemeScripts}}"></script>
+	</body>
+</html>`)

+ 98 - 0
assets/template/header_html_file.go

@@ -0,0 +1,98 @@
+package template
+
+var VarHeaderHtmlFile = []byte(`<!doctype html>
+<html lang="en">
+	<head>
+		<!-- Required meta tags -->
+		<meta charset="utf-8">
+		<meta name="theme-color" content="#205081" />
+		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+		<!-- Bootstrap CSS -->
+		<link rel="stylesheet" href="{{$.System.PathCssBootstrap}}">
+
+		<title>
+			{{if not (eq $.Data.Module "404")}}
+				{{if eq $.Data.Module "index"}}
+					{{$.Data.Page.Name}}
+				{{else if or (eq $.Data.Module "blog") (eq $.Data.Module "blog-post") (eq $.Data.Module "blog-category")}}
+					{{if eq $.Data.Module "blog-category"}}
+						Posts of category "{{$.Data.Blog.Category.Name}}" | Blog
+					{{else if eq $.Data.Module "blog-post"}}
+						{{$.Data.Blog.Post.Name}} | Blog
+					{{else}}
+						Latest posts | Blog
+					{{end}}
+				{{end}}
+			{{else}}
+				Error 404
+			{{end}}
+		</title>
+		<meta name="keywords" content="{{$.Data.Page.MetaKeywords}}" />
+		<meta name="description" content="{{$.Data.Page.MetaDescription}}" />
+		<link rel="shortcut icon" href="{{$.System.PathIcoFav}}" type="image/x-icon" />
+
+		<!-- Template CSS file from template folder -->
+		<link rel="stylesheet" href="{{$.System.PathThemeStyles}}?v=1">
+
+		<!-- Template JavaScript file from template folder -->
+		<script src="{{$.System.PathThemeScripts}}?v=1"></script>
+	</head>
+	<body class="fixed-top-bar1">
+		<div id="wrap">
+			<nav class="navbar navbar-expand-lg navbar-light bg-light">
+				<div class="container">
+					<a class="navbar-brand" href="/">Fave {{$.System.InfoVersion}}</a>
+					<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+						<span class="navbar-toggler-icon"></span>
+					</button>
+					<div class="collapse navbar-collapse" id="navbarResponsive">
+						<ul class="navbar-nav ml-auto">
+							<li class="nav-item{{if eq $.Data.Page.Alias "/"}} active{{end}}">
+								<a class="nav-link" href="/">Home</a>
+							</li>
+							<li class="nav-item">
+								<a class="nav-link{{if eq $.Data.Page.Alias "/another/"}} active{{end}}" href="/another/">Another</a>
+							</li>
+							<li class="nav-item">
+								<a class="nav-link{{if eq $.Data.Page.Alias "/about/"}} active{{end}}" href="/about/">About</a>
+							</li>
+							<li class="nav-item">
+								<a class="nav-link{{if or (eq $.Data.Module "blog") (eq $.Data.Module "blog-post") (eq $.Data.Module "blog-category")}} active{{end}}" href="/blog/">Blog</a>
+							</li>
+							<li class="nav-item">
+								<a class="nav-link{{if eq $.Data.Module "404"}} active{{end}}" href="/not-existent-page/">404</a>
+							</li>
+						</ul>
+					</div>
+				</div>
+			</nav>
+			<div id="main">
+				<div class="bg-fave">
+					<div class="container">
+						<h1 class="text-left text-white m-0 p-0 py-5">
+							{{if not (eq $.Data.Module "404")}}
+								{{if eq $.Data.Module "index"}}
+									{{if eq $.Data.Page.Alias "/"}}
+										Welcome to home page
+									{{else}}
+										Welcome to some another page
+									{{end}}
+								{{else if or (eq $.Data.Module "blog") (eq $.Data.Module "blog-post") (eq $.Data.Module "blog-category")}}
+									{{if eq $.Data.Module "blog-category"}}
+										Blog category
+									{{else if eq $.Data.Module "blog-post"}}
+										Blog post
+									{{else}}
+										Blog
+									{{end}}
+								{{end}}
+							{{else}}
+								Oops, page is not found...
+							{{end}}
+						</h1>
+					</div>
+				</div>
+				<div class="container clear-top">
+					<div class="row pt-4">
+						<div class="col-md-8">`)

+ 16 - 0
assets/template/index_html_file.go

@@ -0,0 +1,16 @@
+package template
+
+var VarIndexHtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	<div class="card-body">
+		<h2 class="card-title">{{$.Data.Page.Name}}</h2>
+		<div class="page-content">
+			{{$.Data.Page.Content}}
+		</div>
+	</div>
+	<div class="card-footer text-muted">
+		<div>Published on {{$.Data.Page.DateTimeFormat "02/01/2006, 15:04:05"}}</div>
+		<div>Author: {{$.Data.Page.User.FirstName}} {{$.Data.Page.User.LastName}}</div>
+	</div>
+</div>
+{{template "footer.html" .}}`)

+ 16 - 0
assets/template/page_html_file.go

@@ -0,0 +1,16 @@
+package template
+
+var VarPageHtmlFile = []byte(`{{template "header.html" .}}
+<div class="card mb-4">
+	<div class="card-body">
+		<h2 class="card-title">{{$.Data.Page.Name}}</h2>
+		<div class="page-content">
+			{{$.Data.Page.Content}}
+		</div>
+	</div>
+	<div class="card-footer text-muted">
+		<div>Published on {{$.Data.Page.DateTimeFormat "02/01/2006, 15:04:05"}}</div>
+		<div>Author: {{$.Data.Page.User.FirstName}} {{$.Data.Page.User.LastName}}</div>
+	</div>
+</div>
+{{template "footer.html" .}}`)

+ 4 - 0
assets/template/robots_txt_file.go

@@ -0,0 +1,4 @@
+package template
+
+var VarRobotsTxtFile = []byte(`User-agent: *
+Disallow: /`)

+ 3 - 0
assets/template/scripts_js_file.go

@@ -0,0 +1,3 @@
+package template
+
+var VarScriptsJsFile = []byte(``)

+ 3 - 0
assets/template/sidebar_left_html_file.go

@@ -0,0 +1,3 @@
+package template
+
+var VarSidebarLeftHtmlFile = []byte(``)

+ 23 - 0
assets/template/sidebar_right_html_file.go

@@ -0,0 +1,23 @@
+package template
+
+var VarSidebarRightHtmlFile = []byte(`<div class="card mb-4">
+	<h5 class="card-header">Categories</h5>
+	<div class="card-body">
+		<ul class="m-0 p-0 pl-4">
+			{{range $.Data.Blog.Categories 0}}
+				<li class="{{if and $.Data.Blog.Category (eq $.Data.Blog.Category.Id .Id)}}active{{end}}">
+					<a href="{{.Permalink}}">{{.Name}}</a>
+				</li>
+			{{end}}
+		</ul>
+	</div>
+</div>
+<div class="card mb-4">
+	<h5 class="card-header">Useful links</h5>
+	<div class="card-body">
+		<ul class="m-0 p-0 pl-4">
+			<li><a href="https://github.com/vladimirok5959/golang-fave" target="_blank">Project on GitHub</a></li>
+			<li><a href="https://github.com/vladimirok5959/golang-fave/wiki" target="_blank">Wiki on GitHub</a></li>
+		</ul>
+	</div>
+</div>`)

+ 119 - 0
assets/template/styles_css_file.go

@@ -0,0 +1,119 @@
+package template
+
+var VarStylesCssFile = []byte(`/* Fix bootstrap */
+@media (max-width: 991.98px) {
+	.navbar-expand-lg>.container,
+	.navbar-expand-lg>.container-fluid {
+		padding-right: 15px;
+		padding-left: 15px;
+	}
+}
+
+@media (max-width: 575px) {
+	.navbar-expand-lg>.container,
+	.navbar-expand-lg>.container-fluid {
+		padding-right: 0px;
+		padding-left: 0px;
+	}
+}
+
+@media (min-width: 992px) {
+	.navbar-expand-lg .navbar-nav {
+		margin-right: -.5rem;
+	}
+}
+
+/* Set base bootstrap width */
+@media (min-width: 1200px) {
+	.container {
+		max-width: 1000px;
+	}
+	.navbar-expand-lg .navbar-nav {
+		margin-right: -.5rem;
+	}
+}
+
+/* Base font and colors */
+body {
+	color: #444;
+	font-size: 1.0rem;
+	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+footer {
+	color: #000;
+}
+
+.navbar-brand {
+	font-weight: bold;
+}
+
+h1 {
+	font-size: 250%;
+}
+
+/* Nice sticky footer */
+html,
+body {
+	height: 100%;
+}
+
+#wrap {
+	min-height: 100%;
+}
+
+#main {
+	overflow: auto;
+	padding-bottom: 4.5rem;
+}
+
+footer {
+	position: relative;
+	margin-top: -4.5rem;
+	height: 4.5rem;
+	clear: both;
+}
+
+/* Sticky top nav bar, body class "fixed-top-bar" */
+.fixed-top-bar .navbar {
+	position: fixed;
+	top: 0;
+	right: 0;
+	left: 0;
+	z-index: 1030;
+}
+
+.fixed-top-bar #main {
+	padding-top: 3.5rem;
+}
+
+/* Fave background */
+.bg-fave {
+	background: #205081 url(/assets/sys/bg.png) repeat 0 0;
+}
+
+/* Fix content marging */
+.page-content p:last-child {
+	margin-bottom: 0px;
+}
+
+/* Borders */
+.navbar {
+	border-bottom: 1px solid rgba(0, 0, 0, .125);
+}
+
+footer {
+	border-top: 1px solid rgba(0, 0, 0, .125);
+}`)

+ 17 - 0
assets/template/template.go

@@ -0,0 +1,17 @@
+package template
+
+var AllData = map[string][]byte{
+	"blog-category.html": VarBlogCategoryHtmlFile,
+	"footer.html":        VarFooterHtmlFile,
+	"styles.css":         VarStylesCssFile,
+	"header.html":        VarHeaderHtmlFile,
+	"blog.html":          VarBlogHtmlFile,
+	"index.html":         VarIndexHtmlFile,
+	"robots.txt":         VarRobotsTxtFile,
+	"page.html":          VarPageHtmlFile,
+	"404.html":           Var404HtmlFile,
+	"blog-post.html":     VarBlogPostHtmlFile,
+	"scripts.js":         VarScriptsJsFile,
+	"sidebar-left.html":  VarSidebarLeftHtmlFile,
+	"sidebar-right.html": VarSidebarRightHtmlFile,
+}

+ 30 - 0
support/template.sh

@@ -0,0 +1,30 @@
+#!/bin/bash
+
+find ./assets/template/ ! -name 'template.go' -type f -exec rm -f {} +
+
+echo "package template" > ./assets/template/template.go
+echo "" >> ./assets/template/template.go
+echo "var AllData = map[string][]byte{" >> ./assets/template/template.go
+
+for FILE_FULL in $(find ./hosts/localhost/template/ | grep -v 'hosts/localhost/template/$' | grep -v '.keep'); do
+	# Vars
+	FILE_BASE="$(basename -- $FILE_FULL)"
+	FILE_GO_BASE="${FILE_BASE//[\-\.]/_}_file.go"
+	FILE_GO_FULL="./assets/template/${FILE_GO_BASE}"
+	GO_VAR_NAME="${FILE_GO_BASE}"
+	GO_VAR_NAME=$(echo "$GO_VAR_NAME" | sed -E 's/^([a-zA-Z]{1})/\U\1/g')
+	GO_VAR_NAME=$(echo "$GO_VAR_NAME" | sed -E 's/(_)([a-zA-Z]{1})/\U\2/g')
+	GO_VAR_NAME=$(echo "$GO_VAR_NAME" | sed -e 's/\.go$//g')
+	GO_VAR_NAME="Var${GO_VAR_NAME}"
+	FILE_CONTENT=$(cat ${FILE_FULL})
+
+	# Write target file
+	echo "package template" > ${FILE_GO_FULL}
+	echo "" >> ${FILE_GO_FULL}
+	echo "var ${GO_VAR_NAME} = []byte(\`${FILE_CONTENT}\`)" >> ${FILE_GO_FULL}
+
+	# Add files to hash
+	echo "	\"${FILE_BASE}\": ${GO_VAR_NAME}," >> ./assets/template/template.go
+done
+
+echo "}" >> ./assets/template/template.go