fixed settings parsing & embed
This commit is contained in:
parent
878cb3d3a8
commit
bfe7ddffd4
9 changed files with 257 additions and 66 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
title: Something
|
28
internal/builder/embed/default.html
Normal file
28
internal/builder/embed/default.html
Normal 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>
|
BIN
internal/builder/embed/favicon.png
Normal file
BIN
internal/builder/embed/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
1
internal/builder/embed/footer.md
Normal file
1
internal/builder/embed/footer.md
Normal file
|
@ -0,0 +1 @@
|
|||
# Footer File
|
1
internal/builder/embed/header.md
Normal file
1
internal/builder/embed/header.md
Normal file
|
@ -0,0 +1 @@
|
|||
# Header File
|
148
internal/builder/embed/style.css
Normal file
148
internal/builder/embed/style.css
Normal 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);
|
||||
}
|
|
@ -5,4 +5,4 @@ fi
|
|||
|
||||
go run cmd/zona/main.go test
|
||||
|
||||
# bat foobar/in.html
|
||||
bat foobar/in.html
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue