fixed settings parsing & embed

This commit is contained in:
Daniel Fichtinger 2024-11-28 18:03:00 -05:00
parent 878cb3d3a8
commit bfe7ddffd4
9 changed files with 257 additions and 66 deletions

View file

@ -14,11 +14,13 @@ type PageData struct {
Title string Title string
Icon string Icon string
Stylesheet string Stylesheet string
Header string HeaderName string
Header template.HTML
Content template.HTML Content template.HTML
NextPost string NextPost string
PrevPost string PrevPost string
Footer string FooterName string
Footer template.HTML
Template string Template string
} }
@ -61,14 +63,19 @@ func buildPageData(m Metadata, path string, settings *Settings) *PageData {
p.Stylesheet = settings.StylesheetName p.Stylesheet = settings.StylesheetName
} }
if header, ok := m["header"].(string); ok { if header, ok := m["header"].(string); ok {
p.Header = header p.HeaderName = header
// for now we use default anyways
p.Header = settings.Header
} else { } else {
p.Header = settings.HeaderName p.HeaderName = settings.HeaderName
p.Header = settings.Header
} }
if footer, ok := m["footer"].(string); ok { if footer, ok := m["footer"].(string); ok {
p.Footer = footer p.FooterName = footer
p.Footer = settings.Footer
} else { } else {
p.Footer = settings.FooterName p.FooterName = settings.FooterName
p.Footer = settings.Footer
} }
return p return p
} }

View file

@ -20,7 +20,23 @@ const (
ArticleTemplateName = "article.html" ArticleTemplateName = "article.html"
) )
//go:embed embed var defaultNames = map[string]string{
"config": "config.yml",
"header": "header.md",
"footer": "footer.md",
"style": "style.css",
"icon": "favicon.png",
"article": "article.html",
"template": "default.html",
}
//go:embed embed/article.html
//go:embed embed/config.yml
//go:embed embed/default.html
//go:embed embed/favicon.png
//go:embed embed/footer.md
//go:embed embed/header.md
//go:embed embed/style.css
var embedDir embed.FS var embedDir embed.FS
type Settings struct { type Settings struct {
@ -37,6 +53,23 @@ type Settings struct {
Icon []byte Icon []byte
} }
// processSetting checks the user's configuration for
// each option. If set, reads the specified file. If not,
// default option is used.
func processSetting(c map[string]interface{}, s string) (string, []byte, error) {
if name, ok := c[s].(string); ok {
val, err := util.ReadFile(name)
if err != nil {
return "", nil, util.ErrorPrepend("Could not read "+s+" specified in config: ", err)
}
return name, val, nil
} else {
val := readEmbed(defaultNames[s])
return defaultNames[s], val, nil
}
}
// buildSettings constructs the Settings struct.
func buildSettings(f []byte) (*Settings, error) { func buildSettings(f []byte) (*Settings, error) {
s := &Settings{} s := &Settings{}
var c map[string]interface{} var c map[string]interface{}
@ -44,66 +77,37 @@ func buildSettings(f []byte) (*Settings, error) {
if err := yaml.Unmarshal(f, &c); err != nil { if err := yaml.Unmarshal(f, &c); err != nil {
return nil, err return nil, err
} }
if headerName, ok := c["header"].(string); ok { n, v, err := processSetting(c, "header")
header, err := util.ReadFile(headerName)
s.HeaderName = headerName
if err != nil { if err != nil {
return nil, util.ErrorPrepend("Could not read header specified in config: ", err) return nil, err
} }
s.Header = template.HTML(MdToHTML(header)) s.HeaderName = n
} else { s.Header = template.HTML(MdToHTML(v))
header := readEmbed(DefHeaderName) n, v, err = processSetting(c, "footer")
s.Header = template.HTML(MdToHTML(header))
s.HeaderName = DefHeaderName
}
if footerName, ok := c["footer"].(string); ok {
footer, err := util.ReadFile(footerName)
s.FooterName = footerName
if err != nil { if err != nil {
return nil, util.ErrorPrepend("Could not read footer specified in config: ", err) return nil, err
} }
s.Footer = template.HTML(MdToHTML(footer)) s.FooterName = n
} else { s.Footer = template.HTML(MdToHTML(v))
footer := readEmbed(DefFooterName) n, v, err = processSetting(c, "style")
s.Footer = template.HTML(MdToHTML(footer))
s.FooterName = DefFooterName
}
if stylesheetName, ok := c["stylesheet"].(string); ok {
stylesheet, err := util.ReadFile(stylesheetName)
if err != nil { if err != nil {
return nil, util.ErrorPrepend("Could not read stylesheet specified in config: ", err) return nil, err
} }
s.StylesheetName = stylesheetName s.StylesheetName = n
s.Stylesheet = stylesheet s.Stylesheet = MdToHTML(v)
} else {
stylesheet := readEmbed(DefStylesheetName) n, v, err = processSetting(c, "icon")
s.Stylesheet = stylesheet
s.StylesheetName = DefStylesheetName
}
if iconName, ok := c["icon"].(string); ok {
icon, err := util.ReadFile(iconName)
if err != nil { if err != nil {
return nil, util.ErrorPrepend("Could not read icon specified in config: ", err) return nil, err
} }
s.Icon = icon s.IconName = n
s.IconName = iconName s.Icon = v
} else { n, v, err = processSetting(c, "template")
icon := readEmbed(DefIconName)
s.Icon = icon
s.IconName = DefIconName
}
if templateName, ok := c["template"].(string); ok {
temp, err := util.ReadFile(templateName)
if err != nil { if err != nil {
return nil, util.ErrorPrepend("Could not read template specified in config: ", err) return nil, err
}
s.DefaultTemplate = string(temp)
s.DefaultTemplateName = templateName
} else {
temp := readEmbed(DefTemplateName)
s.DefaultTemplate = string(temp)
s.DefaultTemplateName = DefTemplateName
} }
s.DefaultTemplateName = n
s.DefaultTemplate = string(v)
artTemp := readEmbed(ArticleTemplateName) artTemp := readEmbed(ArticleTemplateName)
s.ArticleTemplate = string(artTemp) s.ArticleTemplate = string(artTemp)
@ -112,9 +116,10 @@ func buildSettings(f []byte) (*Settings, error) {
// readEmbed reads a file inside the embedded dir // readEmbed reads a file inside the embedded dir
func readEmbed(name string) []byte { func readEmbed(name string) []byte {
f, err := embedDir.ReadFile(name) f, err := embedDir.ReadFile("embed/" + name)
if err != nil { if err != nil {
log.Fatalln("Fatal internal error: Could not read embedded default config!") // panic(0)
log.Fatalf("Fatal internal error: Could not read embedded default %s! %u", name, err)
} }
return f return f
} }
@ -124,7 +129,7 @@ func GetSettings(root string) *Settings {
configPath := filepath.Join(root, DefConfigName) configPath := filepath.Join(root, DefConfigName)
if !util.FileExists(configPath) { if !util.FileExists(configPath) {
// Config file does not exist, we used embedded default // Config file does not exist, we used embedded default
config = readEmbed(configPath) config = readEmbed(defaultNames["config"])
} else { } else {
var err error var err error
config, err = util.ReadFile(configPath) config, err = util.ReadFile(configPath)

View file

@ -0,0 +1 @@
title: Something

View file

@ -0,0 +1,28 @@
<!doctype html>
<html>
<head>
<title>{{ .Title }}</title>
<link rel="icon" href="{{ .Icon }}" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" />
<link
href="{{ .Stylesheet }}"
rel="stylesheet"
type="text/css"
media="all"
/>
</head>
<body>
<div id="container">
<header id="header">{{ .Header }}</header>
<article id="content">
{{ .Content }}
<nav id="nextprev">
{{ .NextPost }}<br />
{{ .PrevPost }}
</nav>
</article>
<footer id="footer">{{ .Footer }}</footer>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1 @@
# Footer File

View file

@ -0,0 +1 @@
# Header File

View file

@ -0,0 +1,148 @@
:root {
--main-text-color: white;
--main-bg-color: #1b1b1b;
--main-transparent: rgba(255, 255, 255, 0.15);
--main-small-text-color: rgba(255, 255, 255, 0.45);
}
body {
line-height: 1.6;
font-size: 18px;
font-family: sans-serif;
background: var(--main-bg-color);
color: var(--main-text-color);
padding-left: calc(100vw - 100%);
}
h1 {
margin-block-start: 0.67rem;
margin-block-end: 0.67rem;
font-size: 2rem;
font-weight: bold;
}
article h1:first-of-type {
margin-block-start: 1.67rem;
}
h2 {
margin-block-start: 0.83rem;
margin-block-end: 0.83rem;
font-size: 1.5rem;
font-weight: bold;
}
h3 {
margin-block-start: 1rem;
margin-block-end: 1rem;
font-size: 1.17em;
font-weight: bold;
}
h4 {
margin-block-start: 1.33rem;
margin-block-end: 1.33rem;
font-size: 1rem;
font-weight: bold;
}
article h1 + h4:first-of-type {
margin-block-start: 0rem;
}
h5 {
margin-block-start: 1.67rem;
margin-block-end: 1.67rem;
font-size: 0.83rem;
font-weight: bold;
}
h6 {
margin-block-start: 2.33rem;
margin-block-end: 2.33rem;
font-size: 0.67rem;
font-weight: bold;
}
a {
color: var(--main-text-color);
}
a:hover {
background: var(--main-transparent);
}
img {
width: auto;
height: auto;
}
blockquote {
color: var(--main-small-text-color);
border-left: 3px solid var(--main-transparent);
padding: 0 1rem;
margin-left: 0;
margin-right: 0;
}
hr {
border: none;
height: 1px;
background: var(--main-small-text-color);
}
code {
background: var(--main-transparent);
border-radius: 0.1875rem;
/* padding: .0625rem .1875rem; */
/* margin: 0 .1875rem; */
}
code,
pre {
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
}
small {
font-size: 0.95rem;
color: var(--main-small-text-color);
}
small a {
color: inherit; /* Inherit the color of the surrounding <small> text */
text-decoration: underline; /* Optional: Keep the underline to indicate a link */
}
.image-container {
text-align: center;
margin: 20px 0; /* Optional: add some spacing around the image container */
}
.image-container img {
/* max-width: 308px; */
max-height: 308px;
}
.image-container small {
display: block; /* Ensure the caption is on a new line */
margin-top: 5px; /* Optional: adjust spacing between image and caption */
}
.image-container small a {
color: inherit; /* Ensure the link color matches the small text */
text-decoration: underline; /* Optional: underline to indicate a link */
}
#header ul {
list-style-type: none;
padding-left: 0;
}
#header li {
display: inline;
font-size: 1.2rem;
margin-right: 1.2rem;
}
#container {
margin: 2.5rem auto;
width: 90%;
max-width: 60ch;
}
#postlistdiv ul {
list-style-type: none;
padding-left: 0;
}
.moreposts {
font-size: 0.95rem;
padding-left: 0.5rem;
}
#nextprev {
text-align: center;
margin-top: 1.4rem;
font-size: 0.95rem;
}
#footer {
color: var(--main-small-text-color);
}

View file

@ -5,4 +5,4 @@ fi
go run cmd/zona/main.go test go run cmd/zona/main.go test
# bat foobar/in.html bat foobar/in.html