render page with user config
This commit is contained in:
parent
09a084e5fa
commit
03a27f890c
|
@ -7,10 +7,27 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ .Title }}</title>
|
||||
<link rel="stylesheet" href="/static/pico.min.css">
|
||||
<style>
|
||||
header {
|
||||
background-color: {{.HeaderColor}};
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<nav class="container">
|
||||
<ul>
|
||||
<li>
|
||||
<hgroup>
|
||||
<h2>{{ .UserTitle }}</h2>
|
||||
<h3>{{ .UserSubtitle }}</h3>
|
||||
</hgroup>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
</header>
|
||||
<main class="container">
|
||||
{{ .Content }}
|
||||
</main>
|
||||
|
|
47
renderer.go
47
renderer.go
|
@ -22,8 +22,35 @@ type PostRenderData struct {
|
|||
Post template.HTML
|
||||
}
|
||||
|
||||
func renderIntoBaseTemplate(user User, data PageContent) (string, error) {
|
||||
baseTemplate, _ := user.Template()
|
||||
t, err := template.New("index").Parse(baseTemplate)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
user_config, _ := user.Config()
|
||||
full_data := struct {
|
||||
Title string
|
||||
Content template.HTML
|
||||
UserTitle string
|
||||
UserSubtitle string
|
||||
HeaderColor string
|
||||
}{
|
||||
Title: data.Title,
|
||||
Content: data.Content,
|
||||
UserTitle: user_config.Title,
|
||||
UserSubtitle: user_config.SubTitle,
|
||||
HeaderColor: user_config.HeaderColor,
|
||||
}
|
||||
|
||||
var html bytes.Buffer
|
||||
t.Execute(&html, full_data)
|
||||
|
||||
return html.String(), nil
|
||||
}
|
||||
|
||||
func RenderPost(post Post) (string, error) {
|
||||
baseTemplate, _ := post.user.Template()
|
||||
buf, _ := post.MarkdownData()
|
||||
|
||||
postTemplate, _ := template.New("post").Parse(postTemplateStr)
|
||||
|
@ -41,16 +68,10 @@ func RenderPost(post Post) (string, error) {
|
|||
Content: template.HTML(postHtml.String()),
|
||||
}
|
||||
|
||||
var html bytes.Buffer
|
||||
t, err := template.New("page").Parse(baseTemplate)
|
||||
|
||||
t.Execute(&html, data)
|
||||
|
||||
return html.String(), err
|
||||
return renderIntoBaseTemplate(post.user, data)
|
||||
}
|
||||
|
||||
func RenderIndexPage(user User) (string, error) {
|
||||
baseTemplate, _ := user.Template()
|
||||
posts, _ := user.Posts()
|
||||
|
||||
postHtml := ""
|
||||
|
@ -64,15 +85,7 @@ func RenderIndexPage(user User) (string, error) {
|
|||
Content: template.HTML(postHtml),
|
||||
}
|
||||
|
||||
var html bytes.Buffer
|
||||
t, err := template.New("index").Parse(baseTemplate)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
t.Execute(&html, data)
|
||||
|
||||
return html.String(), nil
|
||||
return renderIntoBaseTemplate(user, data)
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -82,3 +82,24 @@ func TestRenderUserList(t *testing.T) {
|
|||
t.Error("Post title not rendered. Got: " + result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRendersHeaderTitle(t *testing.T) {
|
||||
user := getTestUser()
|
||||
user.SetConfig(kiss.UserConfig{
|
||||
Title: "Test Title",
|
||||
SubTitle: "Test SubTitle",
|
||||
HeaderColor: "#ff1337",
|
||||
})
|
||||
post, _ := user.CreateNewPost("testpost")
|
||||
|
||||
result, _ := kiss.RenderPost(post)
|
||||
if !strings.Contains(result, "Test Title") {
|
||||
t.Error("Header title not rendered. Got: " + result)
|
||||
}
|
||||
if !strings.Contains(result, "Test SubTitle") {
|
||||
t.Error("Header subtitle not rendered. Got: " + result)
|
||||
}
|
||||
if !strings.Contains(result, "#ff1337") {
|
||||
t.Error("Header color not rendered. Got: " + result)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@ import (
|
|||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
//go:embed embed/initial/base.html
|
||||
|
@ -108,6 +110,13 @@ func (repo Repository) CreateUser(name string) (User, error) {
|
|||
os.WriteFile(path.Join(user_dir, "meta", "VERSION"), []byte(VERSION), 0644)
|
||||
os.WriteFile(path.Join(user_dir, "meta", "base.html"), []byte(base_template), 0644)
|
||||
|
||||
meta, _ := yaml.Marshal(UserConfig{
|
||||
Title: name,
|
||||
SubTitle: "",
|
||||
HeaderColor: "#bdd6be",
|
||||
})
|
||||
os.WriteFile(new_user.ConfigFile(), meta, 0644)
|
||||
|
||||
return new_user, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,15 @@ func TestCreateUserAddsBaseHtmlFile(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestCreateUserAddConfigYml(t *testing.T) {
|
||||
// Create a new user
|
||||
repo, _ := kiss.CreateRepository(testRepoName())
|
||||
user, _ := repo.CreateUser(randomUserName())
|
||||
if _, err := os.Stat(path.Join(user.Dir(), "/meta/config.yml")); err != nil {
|
||||
t.Error("Config file not created")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateUserAddsPublicFolder(t *testing.T) {
|
||||
// Create a new user
|
||||
repo, _ := kiss.CreateRepository(testRepoName())
|
||||
|
|
43
user.go
43
user.go
|
@ -7,6 +7,8 @@ import (
|
|||
"path"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
|
@ -14,6 +16,12 @@ type User struct {
|
|||
name string
|
||||
}
|
||||
|
||||
type UserConfig struct {
|
||||
Title string `yaml:"title"`
|
||||
SubTitle string `yaml:"subtitle"`
|
||||
HeaderColor string `yaml:"header_color"`
|
||||
}
|
||||
|
||||
func (user User) Dir() string {
|
||||
return path.Join(user.repo.UsersDir(), user.name)
|
||||
}
|
||||
|
@ -26,6 +34,14 @@ func (user User) PostDir() string {
|
|||
return path.Join(user.Dir(), "public")
|
||||
}
|
||||
|
||||
func (user User) MetaDir() string {
|
||||
return path.Join(user.Dir(), "meta")
|
||||
}
|
||||
|
||||
func (user User) ConfigFile() string {
|
||||
return path.Join(user.MetaDir(), "config.yml")
|
||||
}
|
||||
|
||||
func (user User) Name() string {
|
||||
return user.name
|
||||
}
|
||||
|
@ -90,3 +106,30 @@ func (user User) Template() (string, error) {
|
|||
}
|
||||
return string(base_html), nil
|
||||
}
|
||||
|
||||
func (user User) Config() (UserConfig, error) {
|
||||
config_path := user.ConfigFile()
|
||||
config_data, err := ioutil.ReadFile(config_path)
|
||||
if err != nil {
|
||||
return UserConfig{}, err
|
||||
}
|
||||
var meta UserConfig
|
||||
err = yaml.Unmarshal(config_data, &meta)
|
||||
if err != nil {
|
||||
return UserConfig{}, err
|
||||
}
|
||||
return meta, nil
|
||||
}
|
||||
|
||||
func (user User) SetConfig(new_config UserConfig) error {
|
||||
config_path := user.ConfigFile()
|
||||
config_data, err := yaml.Marshal(new_config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = ioutil.WriteFile(config_path, config_data, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue