From 4d1b18fd12a8a3d0d13c5d44cb14e3ea80be2549 Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Mon, 25 Nov 2024 14:55:45 -0500 Subject: [PATCH] refactoring; began implementing embedding --- cmd/zona/config.go | 1 - cmd/zona/main.go | 5 ++-- internal/{build => builder}/build_page.go | 24 +++++++++-------- internal/{build => builder}/config.go | 29 ++++++++++++++++----- internal/{build => builder}/convert.go | 10 +++---- internal/{build => builder}/convert_test.go | 16 ++++++------ internal/builder/embed/article.html | 28 ++++++++++++++++++++ internal/builder/embed/config.yml | 0 internal/{build => builder}/traverse.go | 13 +++++---- internal/util/path.go | 4 +++ internal/{build => util}/title.go | 16 ++++++------ 11 files changed, 96 insertions(+), 50 deletions(-) delete mode 100644 cmd/zona/config.go rename internal/{build => builder}/build_page.go (76%) rename internal/{build => builder}/config.go (62%) rename internal/{build => builder}/convert.go (94%) rename internal/{build => builder}/convert_test.go (90%) create mode 100644 internal/builder/embed/article.html create mode 100644 internal/builder/embed/config.yml rename internal/{build => builder}/traverse.go (76%) rename internal/{build => util}/title.go (61%) diff --git a/cmd/zona/config.go b/cmd/zona/config.go deleted file mode 100644 index 06ab7d0..0000000 --- a/cmd/zona/config.go +++ /dev/null @@ -1 +0,0 @@ -package main diff --git a/cmd/zona/main.go b/cmd/zona/main.go index d925f7d..b5c4989 100644 --- a/cmd/zona/main.go +++ b/cmd/zona/main.go @@ -6,7 +6,7 @@ import ( "fmt" "os" - "github.com/ficcdaf/zona/internal/build" + "github.com/ficcdaf/zona/internal/builder" ) // // validateFile checks whether a given path @@ -41,7 +41,8 @@ func main() { } } - err := build.Traverse(*rootPath, "foobar") + settings := builder.GetSettings() + err := builder.Traverse(*rootPath, "foobar", settings) if err != nil { fmt.Printf("Error: %s\n", err.Error()) } diff --git a/internal/build/build_page.go b/internal/builder/build_page.go similarity index 76% rename from internal/build/build_page.go rename to internal/builder/build_page.go index 2337213..35a601a 100644 --- a/internal/build/build_page.go +++ b/internal/builder/build_page.go @@ -1,4 +1,4 @@ -package build +package builder import ( "bytes" @@ -6,6 +6,7 @@ import ( "html/template" "strings" + "github.com/ficcdaf/zona/internal/util" "gopkg.in/yaml.v3" ) @@ -18,6 +19,7 @@ type PageData struct { NextPost string PrevPost string Footer string + Template string } type Metadata map[string]interface{} @@ -41,37 +43,37 @@ func processWithYaml(f []byte) (Metadata, []byte, error) { return meta, []byte(split[2]), nil } -func buildPageData(m Metadata, path string) *PageData { +func buildPageData(m Metadata, path string, settings *Settings) *PageData { p := &PageData{} if title, ok := m["title"].(string); ok { - p.Title = wordsToTitle(title) + p.Title = util.WordsToTitle(title) } else { - p.Title = pathToTitle(path) + p.Title = util.PathToTitle(path) } if icon, ok := m["icon"].(string); ok { p.Icon = icon } else { - p.Icon = DefaultIcon + p.Icon = settings.Icon } if style, ok := m["style"].(string); ok { p.Stylesheet = style } else { - p.Stylesheet = DefaultStylesheet + p.Stylesheet = settings.Stylesheet } if header, ok := m["header"].(string); ok { p.Header = header } else { - p.Header = DefaultHeader + p.Header = settings.Header } if footer, ok := m["footer"].(string); ok { p.Footer = footer } else { - p.Footer = DefaultFooter + p.Footer = settings.Footer } return p } -func ConvertFile(in string, out string) error { +func ConvertFile(in string, out string, settings *Settings) error { mdPre, err := ReadFile(in) if err != nil { return err @@ -80,7 +82,7 @@ func ConvertFile(in string, out string) error { if err != nil { return err } - pd := buildPageData(metadata, in) + pd := buildPageData(metadata, in, settings) fmt.Println("Title: ", pd.Title) // build according to template here @@ -90,7 +92,7 @@ func ConvertFile(in string, out string) error { } pd.Content = template.HTML(html) - tmpl, err := template.New("webpage").Parse(DefaultTemplate) + tmpl, err := template.New("webpage").Parse(settings.DefaultTemplate) if err != nil { return err } diff --git a/internal/build/config.go b/internal/builder/config.go similarity index 62% rename from internal/build/config.go rename to internal/builder/config.go index 5618d93..3059230 100644 --- a/internal/build/config.go +++ b/internal/builder/config.go @@ -1,4 +1,8 @@ -package build +package builder + +import ( + "embed" +) const ( DefaultHeader = "" @@ -35,18 +39,31 @@ const ( ` ) +//go:embed embed +var embedDir embed.FS + type Settings struct { - Header string - Footer string - Stylesheet string - Icon string + Header string + Footer string + Stylesheet string + Icon string + DefaultTemplate string } -func NewSettings(header string, footer string, style string, icon string) *Settings { +func NewSettings(header string, footer string, style string, icon string, temp string) *Settings { return &Settings{ header, footer, style, icon, + temp, } } + +func GetSettings() *Settings { + // TODO: Read a config file to override defaults + // "Defaults" should be a default config file via embed package, + // so the settings func should need to handle one case: + // check if config file exists, if not, use embedded one + return NewSettings(DefaultHeader, DefaultFooter, DefaultStylesheet, DefaultIcon, DefaultTemplate) +} diff --git a/internal/build/convert.go b/internal/builder/convert.go similarity index 94% rename from internal/build/convert.go rename to internal/builder/convert.go index cd1602b..7c032b7 100644 --- a/internal/build/convert.go +++ b/internal/builder/convert.go @@ -1,12 +1,12 @@ -package build +package builder import ( "fmt" "io" "os" "path/filepath" - "strings" + "github.com/ficcdaf/zona/internal/util" "github.com/gomarkdown/markdown" "github.com/gomarkdown/markdown/ast" "github.com/gomarkdown/markdown/html" @@ -47,7 +47,7 @@ func processLink(p string) string { // Only process if it points to an existing, local markdown file if ext == ".md" && filepath.IsLocal(p) { // fmt.Println("Markdown link detected...") - return ChangeExtension(p, ".html") + return util.ChangeExtension(p, ".html") } else { return p } @@ -130,7 +130,3 @@ func CopyFile(inPath string, outPath string) error { return nil } } - -func ChangeExtension(in string, outExt string) string { - return strings.TrimSuffix(in, filepath.Ext(in)) + outExt -} diff --git a/internal/build/convert_test.go b/internal/builder/convert_test.go similarity index 90% rename from internal/build/convert_test.go rename to internal/builder/convert_test.go index 49a9691..45c4843 100644 --- a/internal/build/convert_test.go +++ b/internal/builder/convert_test.go @@ -1,11 +1,11 @@ -package build_test +package builder_test import ( "os" "path/filepath" "testing" - "github.com/ficcdaf/zona/internal/build" + "github.com/ficcdaf/zona/internal/builder" "github.com/ficcdaf/zona/internal/util" ) @@ -13,7 +13,7 @@ func TestMdToHTML(t *testing.T) { md := []byte("# Hello World\n\nThis is a test.") expectedHTML := "

Hello World

\n

This is a test.

\n" nExpectedHTML := util.NormalizeContent(expectedHTML) - html, err := build.MdToHTML(md) + html, err := builder.MdToHTML(md) nHtml := util.NormalizeContent(string(html)) if err != nil { t.Fatalf("Expected no error, got %v", err) @@ -27,7 +27,7 @@ func TestWriteFile(t *testing.T) { path := filepath.Join(t.TempDir(), "test.txt") content := []byte("Hello, World!") - err := build.WriteFile(content, path) + err := builder.WriteFile(content, path) if err != nil { t.Fatalf("Expected no error, got %v", err) } @@ -51,7 +51,7 @@ func TestReadFile(t *testing.T) { t.Fatalf("Error writing file: %v", err) } - data, err := build.ReadFile(path) + data, err := builder.ReadFile(path) if err != nil { t.Fatalf("Expected no error, got %v", err) } @@ -70,7 +70,7 @@ func TestCopyFile(t *testing.T) { t.Fatalf("Error writing source file: %v", err) } - err = build.CopyFile(src, dst) + err = builder.CopyFile(src, dst) if err != nil { t.Fatalf("Expected no error, got %v", err) } @@ -96,7 +96,7 @@ func TestConvertFile(t *testing.T) { t.Fatalf("Error writing source Markdown file: %v", err) } - err = build.ConvertFile(src, dst) + err = builder.ConvertFile(src, dst) if err != nil { t.Fatalf("Expected no error, got %v", err) } @@ -113,7 +113,7 @@ func TestConvertFile(t *testing.T) { func TestChangeExtension(t *testing.T) { input := "test.md" - output := build.ChangeExtension(input, ".html") + output := builder.ChangeExtension(input, ".html") expected := "test.html" if output != expected { diff --git a/internal/builder/embed/article.html b/internal/builder/embed/article.html new file mode 100644 index 0000000..eb677d8 --- /dev/null +++ b/internal/builder/embed/article.html @@ -0,0 +1,28 @@ + + + + {{ .Title }} + + + + + + +
+ +
+ {{ .Content }} + +
+ +
+ + diff --git a/internal/builder/embed/config.yml b/internal/builder/embed/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/internal/build/traverse.go b/internal/builder/traverse.go similarity index 76% rename from internal/build/traverse.go rename to internal/builder/traverse.go index 379fe8b..44f493f 100644 --- a/internal/build/traverse.go +++ b/internal/builder/traverse.go @@ -1,4 +1,4 @@ -package build +package builder import ( "errors" @@ -8,7 +8,7 @@ import ( "github.com/ficcdaf/zona/internal/util" ) -func processFile(inPath string, entry fs.DirEntry, err error, outRoot string) error { +func processFile(inPath string, entry fs.DirEntry, err error, outRoot string, settings *Settings) error { if err != nil { return err } @@ -18,11 +18,11 @@ func processFile(inPath string, entry fs.DirEntry, err error, outRoot string) er switch ext { case ".md": // fmt.Println("Processing markdown...") - outPath = ChangeExtension(outPath, ".html") + outPath = util.ChangeExtension(outPath, ".html") if err := util.CreateParents(outPath); err != nil { return err } - if err := ConvertFile(inPath, outPath); err != nil { + if err := ConvertFile(inPath, outPath, settings); err != nil { return errors.Join(errors.New("Error processing file "+inPath), err) } else { return nil @@ -44,10 +44,9 @@ func processFile(inPath string, entry fs.DirEntry, err error, outRoot string) er return nil } -func Traverse(root string, outRoot string) error { - // err := filepath.WalkDir(root, func(path string, entry fs.DirEntry, err error) error { +func Traverse(root string, outRoot string, settings *Settings) error { walkFunc := func(path string, entry fs.DirEntry, err error) error { - return processFile(path, entry, err, outRoot) + return processFile(path, entry, err, outRoot, settings) } err := filepath.WalkDir(root, walkFunc) return err diff --git a/internal/util/path.go b/internal/util/path.go index 7359afb..e53c9b7 100644 --- a/internal/util/path.go +++ b/internal/util/path.go @@ -18,6 +18,10 @@ func CheckExtension(path, ext string) error { } } +func ChangeExtension(in string, outExt string) string { + return strings.TrimSuffix(in, filepath.Ext(in)) + outExt +} + func getRoot(path string) string { for { parent := filepath.Dir(path) diff --git a/internal/build/title.go b/internal/util/title.go similarity index 61% rename from internal/build/title.go rename to internal/util/title.go index 704e0b2..4fef45d 100644 --- a/internal/build/title.go +++ b/internal/util/title.go @@ -1,4 +1,4 @@ -package build +package util import ( "path/filepath" @@ -8,23 +8,23 @@ import ( "golang.org/x/text/language" ) -// pathToWords takes a full path +// PathToWords takes a full path // and strips separators and extension // from the file name -func pathToWords(path string) string { +func PathToWords(path string) string { stripped := ChangeExtension(filepath.Base(path), "") replaced := strings.NewReplacer("-", " ", "_", " ", `\ `, " ").Replace(stripped) return strings.ToTitle(replaced) } -func wordsToTitle(words string) string { +func WordsToTitle(words string) string { caser := cases.Title(language.English) return caser.String(words) } -// pathToTitle converts a full path to a string +// PathToTitle converts a full path to a string // in title case -func pathToTitle(path string) string { - words := pathToWords(path) - return wordsToTitle(words) +func PathToTitle(path string) string { + words := PathToWords(path) + return WordsToTitle(words) }