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

View file

@ -20,7 +20,23 @@ const (
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
type Settings struct {
@ -37,6 +53,23 @@ type Settings struct {
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) {
s := &Settings{}
var c map[string]interface{}
@ -44,66 +77,37 @@ func buildSettings(f []byte) (*Settings, error) {
if err := yaml.Unmarshal(f, &c); err != nil {
return nil, err
}
if headerName, ok := c["header"].(string); ok {
header, err := util.ReadFile(headerName)
s.HeaderName = headerName
if err != nil {
return nil, util.ErrorPrepend("Could not read header specified in config: ", err)
}
s.Header = template.HTML(MdToHTML(header))
} else {
header := readEmbed(DefHeaderName)
s.Header = template.HTML(MdToHTML(header))
s.HeaderName = DefHeaderName
n, v, err := processSetting(c, "header")
if err != nil {
return nil, err
}
if footerName, ok := c["footer"].(string); ok {
footer, err := util.ReadFile(footerName)
s.FooterName = footerName
if err != nil {
return nil, util.ErrorPrepend("Could not read footer specified in config: ", err)
}
s.Footer = template.HTML(MdToHTML(footer))
} else {
footer := readEmbed(DefFooterName)
s.Footer = template.HTML(MdToHTML(footer))
s.FooterName = DefFooterName
s.HeaderName = n
s.Header = template.HTML(MdToHTML(v))
n, v, err = processSetting(c, "footer")
if err != nil {
return nil, err
}
if stylesheetName, ok := c["stylesheet"].(string); ok {
stylesheet, err := util.ReadFile(stylesheetName)
if err != nil {
return nil, util.ErrorPrepend("Could not read stylesheet specified in config: ", err)
}
s.StylesheetName = stylesheetName
s.Stylesheet = stylesheet
} else {
stylesheet := readEmbed(DefStylesheetName)
s.Stylesheet = stylesheet
s.StylesheetName = DefStylesheetName
s.FooterName = n
s.Footer = template.HTML(MdToHTML(v))
n, v, err = processSetting(c, "style")
if err != nil {
return nil, err
}
if iconName, ok := c["icon"].(string); ok {
icon, err := util.ReadFile(iconName)
if err != nil {
return nil, util.ErrorPrepend("Could not read icon specified in config: ", err)
}
s.Icon = icon
s.IconName = iconName
} else {
icon := readEmbed(DefIconName)
s.Icon = icon
s.IconName = DefIconName
s.StylesheetName = n
s.Stylesheet = MdToHTML(v)
n, v, err = processSetting(c, "icon")
if err != nil {
return nil, err
}
if templateName, ok := c["template"].(string); ok {
temp, err := util.ReadFile(templateName)
if err != nil {
return nil, util.ErrorPrepend("Could not read template specified in config: ", err)
}
s.DefaultTemplate = string(temp)
s.DefaultTemplateName = templateName
} else {
temp := readEmbed(DefTemplateName)
s.DefaultTemplate = string(temp)
s.DefaultTemplateName = DefTemplateName
s.IconName = n
s.Icon = v
n, v, err = processSetting(c, "template")
if err != nil {
return nil, err
}
s.DefaultTemplateName = n
s.DefaultTemplate = string(v)
artTemp := readEmbed(ArticleTemplateName)
s.ArticleTemplate = string(artTemp)
@ -112,9 +116,10 @@ func buildSettings(f []byte) (*Settings, error) {
// readEmbed reads a file inside the embedded dir
func readEmbed(name string) []byte {
f, err := embedDir.ReadFile(name)
f, err := embedDir.ReadFile("embed/" + name)
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
}
@ -124,7 +129,7 @@ func GetSettings(root string) *Settings {
configPath := filepath.Join(root, DefConfigName)
if !util.FileExists(configPath) {
// Config file does not exist, we used embedded default
config = readEmbed(configPath)
config = readEmbed(defaultNames["config"])
} else {
var err error
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
# bat foobar/in.html
bat foobar/in.html