From bfe7ddffd464c37e3450abf72d9aa5249431e300 Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Thu, 28 Nov 2024 18:03:00 -0500 Subject: [PATCH] fixed settings parsing & embed --- internal/builder/build_page.go | 19 ++-- internal/builder/config.go | 123 ++++++++++++----------- internal/builder/embed/config.yml | 1 + internal/builder/embed/default.html | 28 ++++++ internal/builder/embed/favicon.png | Bin 0 -> 2543 bytes internal/builder/embed/footer.md | 1 + internal/builder/embed/header.md | 1 + internal/builder/embed/style.css | 148 ++++++++++++++++++++++++++++ runtest.sh | 2 +- 9 files changed, 257 insertions(+), 66 deletions(-) create mode 100644 internal/builder/embed/default.html create mode 100644 internal/builder/embed/favicon.png create mode 100644 internal/builder/embed/footer.md create mode 100644 internal/builder/embed/header.md create mode 100644 internal/builder/embed/style.css diff --git a/internal/builder/build_page.go b/internal/builder/build_page.go index 4ad28b2..f0fb5cd 100644 --- a/internal/builder/build_page.go +++ b/internal/builder/build_page.go @@ -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 } diff --git a/internal/builder/config.go b/internal/builder/config.go index ad2aef5..d291591 100644 --- a/internal/builder/config.go +++ b/internal/builder/config.go @@ -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) diff --git a/internal/builder/embed/config.yml b/internal/builder/embed/config.yml index e69de29..cd304c3 100644 --- a/internal/builder/embed/config.yml +++ b/internal/builder/embed/config.yml @@ -0,0 +1 @@ +title: Something diff --git a/internal/builder/embed/default.html b/internal/builder/embed/default.html new file mode 100644 index 0000000..eb677d8 --- /dev/null +++ b/internal/builder/embed/default.html @@ -0,0 +1,28 @@ + + + + {{ .Title }} + + + + + + +
+ +
+ {{ .Content }} + +
+
{{ .Footer }}
+
+ + diff --git a/internal/builder/embed/favicon.png b/internal/builder/embed/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d92131f9e406d2c635eb15fa22a098eaf5dfd73d GIT binary patch literal 2543 zcmeAS@N?(olHy`uVBq!ia0y~yV9Ekv4rT@hhBZ8Md>I%R4+Z#yxVjhkFwh>%o;~Zr z`Ev{m4EFZ+iJP8qb90-Tnp#;|sj8~-^77W!)FdV*EL*lzP*708+9x%BZm*!*w{EZIUYE$-^|RcqP%?3qJ`(rofTCx(9+Tp5D-XCO7imZ zI(T4zS7)cFsHm*0Y)($LzP^4&M*5uDvz9MgW^QJttE;>+Q`*Pd6|y(9_dXQc@BV6MO9M+rYrUpi~m% z7tA15!Fc9CtWqdb?#!Pe*Z;mP|0wJ{>5KU04er5@WF#aH9d6dtZed_x-{tAz7*cWT z?cMOnBB3(v57pLrpOX~5y;zT_dxb`h%5$9+8d?f73>ls=q%Gpyr>`m^u48;V_3g~K z|7SkOeZTr=-mI7FURec;Oj7Zr8k(~CrYzT$OXn7xvwEgi8MAQK_JTl%jK|0P3}X+7 z`S7~uZn~OemRo0#IXOpcE9b^{H;$b#ioBuLw#e*qLZP&L*Da%F)^`&P(w5?M|li(z(xUE;eUQUv4}UvLOI zK`Dqbgz8xkO|!r*Z+k0~^^)sRCH>H}Cpm=&

9Z`H)(>+(c zVac*wu~v2ECUK-FMMSRi+OAvO{#&YFBa6YKo?5J}>@BypUVVEn^2)1)YRlagfkF>j zB0%CRz4Gph$CazRSEMfdX6q&T_Px6<_tx;ZrpzC8 z+JUE?*527Nec8jRa)zxwS58f@uE@IQ9`1dmC{X*p#jEbMp6zvd-d8>aYM=gRzdv^6 z!rFi5R-N~{@+s(YJr7c>Axb6eNgg7PKMqmC2w@53+CpgS%x_({e|TK#GTf{qwyksF3em|rVp}=qZd@TcIah3R z=I3Tl?PI-jleRVJ&WJj)I{BT@>7!Zq4!OEsNGsO}@V4frUJa?@dFq<(zfhM3%Utbc PpjMlwtDnm{r-UW|{6Pd? literal 0 HcmV?d00001 diff --git a/internal/builder/embed/footer.md b/internal/builder/embed/footer.md new file mode 100644 index 0000000..b986fa2 --- /dev/null +++ b/internal/builder/embed/footer.md @@ -0,0 +1 @@ +# Footer File diff --git a/internal/builder/embed/header.md b/internal/builder/embed/header.md new file mode 100644 index 0000000..4b88196 --- /dev/null +++ b/internal/builder/embed/header.md @@ -0,0 +1 @@ +# Header File diff --git a/internal/builder/embed/style.css b/internal/builder/embed/style.css new file mode 100644 index 0000000..7199c84 --- /dev/null +++ b/internal/builder/embed/style.css @@ -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 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); +} diff --git a/runtest.sh b/runtest.sh index 27611e4..d20c26e 100755 --- a/runtest.sh +++ b/runtest.sh @@ -5,4 +5,4 @@ fi go run cmd/zona/main.go test -# bat foobar/in.html +bat foobar/in.html