From a0f6a55ba1c7d87afe556ab0dd733157a5c28934 Mon Sep 17 00:00:00 2001 From: Kirill Zhuravlev Date: Sat, 4 Feb 2023 02:39:51 +0100 Subject: [PATCH] change code that works with filenames --- make_site.go => main.go | 77 +++++++++++++++++++++++++++++------- repo_test.go => main_test.go | 2 +- scripts.go | 32 ++++++++++----- 3 files changed, 86 insertions(+), 25 deletions(-) rename make_site.go => main.go (62%) rename repo_test.go => main_test.go (98%) diff --git a/make_site.go b/main.go similarity index 62% rename from make_site.go rename to main.go index 3811b494..6c269b42 100644 --- a/make_site.go +++ b/main.go @@ -3,8 +3,8 @@ package main import ( "bytes" "fmt" - "log" "os" + "path/filepath" "strings" "text/template" @@ -25,15 +25,30 @@ type Object struct { Items []Link } +// Source +const readmePath = "README.md" + +// Templates +const tmplCategory = "tmpl/cat-tmpl.html" +const tmplSitemap = "tmpl/sitemap-tmpl.xml" + +// Output +const outDir = "out/" +const outIndexFile = "index.html" +const outSitemapFile = "sitemap.xml" + func main() { - err := GenerateHTML() + outIndexAbs := filepath.Join(outDir, outIndexFile) + err := GenerateHTML(readmePath, outIndexAbs) if err != nil { panic(err) } - input, err := os.ReadFile("./tmpl/index.html") + + input, err := os.ReadFile(outIndexAbs) if err != nil { panic(err) } + buf := bytes.NewBuffer(input) query, err := goquery.NewDocumentFromReader(buf) if err != nil { @@ -55,29 +70,61 @@ func main() { }) }) - makeSiteStruct(objs) + if err := makeSiteStruct(objs); err != nil { + // FIXME: remove all panics + panic(err) + } changeLinksInIndex(string(input), query, objs) makeSitemap(objs) } -func makeSiteStruct(objs map[string]*Object) { +func mkdirAll(path string) error { + _, err := os.Stat(path) + // NOTE: directory is exists + if err == nil { + return nil + } + + // NOTE: unknown error + if !os.IsNotExist(err) { + return err + } + + // NOTE: directory is not exists + if err := os.MkdirAll(path, 0o755); err != nil { + return err + } + + return nil +} + +func makeSiteStruct(objs map[string]*Object) error { for _, obj := range objs { - folder := fmt.Sprintf("tmpl/%s", obj.Slug) - err := os.Mkdir(folder, 0755) - if err != nil { - log.Println(err) + outDir := filepath.Join(outDir, obj.Slug) + if err := mkdirAll(outDir); err != nil { + return err } - t := template.Must(template.ParseFiles("tmpl/cat-tmpl.html")) - f, _ := os.Create(fmt.Sprintf("%s/index.html", folder)) - t.Execute(f, obj) + // FIXME: embed templates + // FIXME: parse templates once at start + t := template.Must(template.ParseFiles(tmplCategory)) + f, err := os.Create(filepath.Join(outDir, "index.html")) + if err != nil { + return err + } + + if err := t.Execute(f, obj); err != nil { + return err + } } + + return nil } func makeSitemap(objs map[string]*Object) { - t := template.Must(template.ParseFiles("tmpl/sitemap-tmpl.xml")) - f, _ := os.Create("tmpl/sitemap.xml") + t := template.Must(template.ParseFiles(tmplSitemap)) + f, _ := os.Create(filepath.Join(outDir, outSitemapFile)) t.Execute(f, objs) } @@ -129,5 +176,5 @@ func changeLinksInIndex(html string, query *goquery.Document, objs map[string]*O } }) - os.WriteFile("./tmpl/index.html", []byte(html), 0644) + os.WriteFile(filepath.Join(outDir, outIndexFile), []byte(html), 0644) } diff --git a/repo_test.go b/main_test.go similarity index 98% rename from repo_test.go rename to main_test.go index 39717369..18184ca2 100644 --- a/repo_test.go +++ b/main_test.go @@ -70,7 +70,7 @@ func TestSeparator(t *testing.T) { } } func TestGenerateHTML(t *testing.T) { - err := GenerateHTML() + err := GenerateHTML(readmePath, outIndexFile) if err != nil { t.Errorf("html generate error '%s'", err.Error()) } diff --git a/scripts.go b/scripts.go index b89c5a0f..072e60c2 100644 --- a/scripts.go +++ b/scripts.go @@ -36,16 +36,30 @@ type content struct { } // GenerateHTML generate site html (index.html) from markdown file -func GenerateHTML() (err error) { +func GenerateHTML(srcFilename, outFilename string) error { // options - readmePath := "./README.md" - tplPath := "tmpl/tmpl.html" - idxPath := "tmpl/index.html" - input, _ := ioutil.ReadFile(readmePath) - body, _ := markdown.ConvertMarkdownToHTML(input) + const tplPath = "tmpl/tmpl.html" + + input, err := ioutil.ReadFile(srcFilename) + if err != nil { + return err + } + + body, err := markdown.ConvertMarkdownToHTML(input) + if err != nil { + return err + } + c := &content{Body: template.HTML(body)} t := template.Must(template.ParseFiles(tplPath)) - f, err := os.Create(idxPath) - t.Execute(f, c) - return + f, err := os.Create(outFilename) + if err != nil { + return err + } + + if err := t.Execute(f, c); err != nil { + return err + } + + return nil }