From 1ccd4c87136091e7a71f05c8660849552e0dba36 Mon Sep 17 00:00:00 2001 From: Alejandro Sior Date: Wed, 31 Aug 2022 20:28:57 +0200 Subject: site: add the basis --- go.mod | 3 + localhost:8080/.index | 57 ++++++++++++++++++ localhost:8080/.view | 3 + localhost:8080/about | 1 + localhost:8080/docs/.view | 1 + localhost:8080/docs/index | 12 ++++ localhost:8080/docs/view | 3 + site.go | 149 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 229 insertions(+) create mode 100644 go.mod create mode 100644 localhost:8080/.index create mode 100644 localhost:8080/.view create mode 100644 localhost:8080/about create mode 100644 localhost:8080/docs/.view create mode 100644 localhost:8080/docs/index create mode 100644 localhost:8080/docs/view create mode 100644 site.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..329e56d --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/aosync/site + +go 1.19 diff --git a/localhost:8080/.index b/localhost:8080/.index new file mode 100644 index 0000000..d35e674 --- /dev/null +++ b/localhost:8080/.index @@ -0,0 +1,57 @@ + + aosync + + + +
+
+ {{ post }} +
+ + \ No newline at end of file diff --git a/localhost:8080/.view b/localhost:8080/.view new file mode 100644 index 0000000..45d9e3b --- /dev/null +++ b/localhost:8080/.view @@ -0,0 +1,3 @@ +

site is a simple static site generator

+ +

This sample website serves as a usage reference.

\ No newline at end of file diff --git a/localhost:8080/about b/localhost:8080/about new file mode 100644 index 0000000..c4c593f --- /dev/null +++ b/localhost:8080/about @@ -0,0 +1 @@ +

site and this template are inspired by werc and XXIIVV. I found that these models of personal website organisations are well suited to lay out notes about varieties of subjects.

\ No newline at end of file diff --git a/localhost:8080/docs/.view b/localhost:8080/docs/.view new file mode 100644 index 0000000..d8c8fec --- /dev/null +++ b/localhost:8080/docs/.view @@ -0,0 +1 @@ +

This directory holds a few notes about site concepts.

\ No newline at end of file diff --git a/localhost:8080/docs/index b/localhost:8080/docs/index new file mode 100644 index 0000000..30610a5 --- /dev/null +++ b/localhost:8080/docs/index @@ -0,0 +1,12 @@ +

.index is the template of children pages in the subtree

+ +

When a directory contains a file named .index, all files in children directories are going to use it as template.

+ +

An .index file is a normal html file, except that a few templates get replaced by the server generated content: +

+

+ +

The role of .index is thus to structure and composite in a relatively minimalistic manner the componants that make up a page of the site.

\ No newline at end of file diff --git a/localhost:8080/docs/view b/localhost:8080/docs/view new file mode 100644 index 0000000..ced1356 --- /dev/null +++ b/localhost:8080/docs/view @@ -0,0 +1,3 @@ +

.view is the default page rendered in a directory

+ +

It can be used to provide a summary of what to expect in the subdirectories

\ No newline at end of file diff --git a/site.go b/site.go new file mode 100644 index 0000000..46e6cee --- /dev/null +++ b/site.go @@ -0,0 +1,149 @@ +package main + +import ( + "os" + "io/ioutil" + "net/http" + "path" + "path/filepath" + "strings" +) + +const staticPrefix = "/static/" + +type NavTree struct { + name string + path string + children []NavTree + hasIndex bool + selected bool +} + +func stripPath(caminho string) string { + caminho = path.Clean(caminho) + return "/" + path.Join(strings.Split(caminho, "/")[1:]...) +} + +func rootTree(root string, goal string) (NavTree, string) { + nav := NavTree{} + nav.name = path.Base(root) + nav.path = root + nav.selected = false + + index := "" + + if !strings.HasPrefix(goal, root) { + return nav, index + } + + nav.selected = true + + filepath.Walk(root, func(current string, info os.FileInfo, err error) error { + if info.Name() == ".index" { + index = current + } + + if current == root || info.Name()[0] == '.' { + return nil + } + + rec, idx := rootTree(current, goal) + if idx != "" { + index = idx + } + + nav.children = append(nav.children, rec) + + if info.IsDir() { + return filepath.SkipDir + } else { + return nil + } + }) + + return nav, index +} + +func RenderList(children []NavTree) string { + deleg := "" + ul := "" + ul += deleg + return ul +} + +func (v *NavTree) Render() (string, string) { + li := "
  • " + if v.selected { + li += "" + } else { + li += "" + } + li += v.name + li += "
  • " + + deleg := "" + + if len(v.children) > 0 { + deleg += RenderList(v.children) + } + + return li, deleg +} + +func build(request *http.Request) (string, int) { + code := 200 + root := request.Host + postLoc := path.Join(root, request.URL.Path) + + if strings.HasPrefix(request.URL.Path, staticPrefix) { + staticLoc := path.Join(root, request.URL.Path[len(staticPrefix):]) + static, err0 := ioutil.ReadFile(staticLoc) + if err0 != nil { + return "Path not found", 404 + } + + return string(static), 200 + } + + tr, idx := rootTree(root, postLoc) + template, err0 := ioutil.ReadFile(idx) + if err0 != nil { + return "No template in tree", 500 + } + + final := string(template) + + post, err1 := ioutil.ReadFile(postLoc) + if err1 != nil { + viewLoc := path.Join(root, request.URL.Path, ".view") + + view, err1_0 := ioutil.ReadFile(viewLoc) + if err1_0 != nil { + return "Path not found", 404 + } + post = view + } + + final = strings.Replace(string(template), "{{ post }}", string(post), -1) + final = strings.Replace(string(final), "{{ nav }}", RenderList(tr.children), -1) + + return final, code +} + +func handler(w http.ResponseWriter, r *http.Request) { + content, code := build(r) + + w.WriteHeader(code) + w.Write([]byte(content)) +} + +func main() { + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} \ No newline at end of file -- cgit v1.2.3