aboutsummaryrefslogtreecommitdiff
path: root/cmd/http/load.go
diff options
context:
space:
mode:
authorAlex <alex@scerba.org>2024-05-04 17:28:37 -0400
committerAlex Scerba <alex@scerba.org>2024-08-15 22:54:25 -0500
commit811c9bb2f7358ff094fe13deb6d961088baa2d8f (patch)
tree694010fbc71c9ff67cee28f6da1447290e627afe /cmd/http/load.go
parentd9fc74778ef86b02f0a743821263db8873417294 (diff)
Add Go webserver.
Diffstat (limited to 'cmd/http/load.go')
-rw-r--r--cmd/http/load.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/cmd/http/load.go b/cmd/http/load.go
new file mode 100644
index 0000000..d63d7ce
--- /dev/null
+++ b/cmd/http/load.go
@@ -0,0 +1,106 @@
+package main
+
+import (
+ "os"
+ "regexp"
+ "sort"
+ "strings"
+)
+
+// Post struct contains necessary data for a post
+type Post struct {
+ FileName string
+ Title string
+ Date string
+ Tags []string
+ Image string
+}
+
+// Posts stuct contains a collection of type Post
+type Posts struct {
+ Contents []*Post
+}
+
+// Read all found files and load them into a stuct
+func (app *application) aggregate(location string) (p *Posts, err error) {
+ var posts []*Post
+
+ files, err := os.ReadDir(location)
+ if err != nil {
+ return nil, err
+ }
+
+ // Loop over every file in the directory and read the contents.
+ for _, file := range files {
+ if !file.IsDir() && strings.HasSuffix(file.Name(), ".tmpl.html") {
+ newPost, err := app.readFile(location + "/" + file.Name())
+ if err != nil {
+ return nil, err
+ }
+
+ posts = append(posts, newPost)
+ }
+ }
+
+ sort.Slice(posts, func(i, j int) bool {
+ return posts[i].Date > posts[j].Date
+ })
+
+ return &Posts{Contents: posts}, nil
+}
+
+func (app *application) readFile(location string) (p *Post, err error) {
+ fileContent, err := os.ReadFile(location)
+ if err != nil {
+ return nil, err
+ }
+
+ var post *Post = new(Post)
+
+ fileName := strings.TrimSuffix(strings.Split(location, "/")[2], ".tmpl.html")
+
+ // title
+ title := strings.ReplaceAll(fileName, "_", " ")
+
+ // date
+ datePattern := regexp.MustCompile(`{{define "uploaded-on"}}(\d{4}-\d{2}-\d{2}){{end}}`)
+ dateMatching := datePattern.FindStringSubmatch(string(fileContent))
+
+ var date string
+ if len(dateMatching) > 1 {
+ date = dateMatching[1]
+ } else {
+ date = ""
+ }
+
+ // tags
+ tagsPattern := regexp.MustCompile(`{{define "keywords"}}([\w\s]+){{end}}`)
+ matchingTags := tagsPattern.FindStringSubmatch(string(fileContent))
+
+ var tags []string
+ if len(matchingTags) > 1 {
+ tags = strings.Fields(matchingTags[1])
+ } else {
+ tags = []string{}
+ }
+
+ // thumbnail image
+ imagePattern := regexp.MustCompile(`<img src="(.+)" class="mainImage"( alt="(.+)")* />`)
+ matchingImage := imagePattern.FindStringSubmatch(string(fileContent))
+
+ var image string
+ if len(matchingImage) > 1 {
+ image = matchingImage[0]
+ } else {
+ image = ""
+ }
+
+ post.FileName = fileName
+ post.Title = title
+ post.Date = date
+ post.Tags = tags
+ post.Image = image
+
+ return post, nil
+
+}