aboutsummaryrefslogtreecommitdiffstats
path: root/internal/port/gemini.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/port/gemini.go')
-rw-r--r--internal/port/gemini.go36
1 files changed, 34 insertions, 2 deletions
diff --git a/internal/port/gemini.go b/internal/port/gemini.go
index 740fccd..f67ca05 100644
--- a/internal/port/gemini.go
+++ b/internal/port/gemini.go
@@ -29,8 +29,9 @@ type GeminiTemplateVariables struct {
29} 29}
30 30
31type GeminiNavItem struct { 31type GeminiNavItem struct {
32 Label string 32 Label string
33 URL string 33 URL string
34 Current bool
34} 35}
35 36
36type GeminiSection struct { 37type GeminiSection struct {
@@ -40,6 +41,32 @@ type GeminiSection struct {
40 Items []string 41 Items []string
41} 42}
42 43
44func urlToGeminiNav(url string) (items []GeminiNavItem) {
45 partialURL := "/gemini"
46 parts := strings.Split(url, "/")
47
48 if len(parts) != 0 && parts[len(parts)-1] == "" {
49 parts = parts[:len(parts)-1]
50 }
51
52 for i, part := range parts {
53 partialURL = partialURL + "/" + part
54
55 current := false
56 if i == len(parts)-1 || (len(parts) == 2 && i == 0) {
57 current = true
58 }
59
60 items = append(items, GeminiNavItem{
61 Label: part,
62 URL: partialURL,
63 Current: current,
64 })
65 }
66
67 return
68}
69
43func resolveURL(uri string, baseURL *url.URL) (resolvedURL string) { 70func resolveURL(uri string, baseURL *url.URL) (resolvedURL string) {
44 if strings.HasPrefix(uri, "//") { 71 if strings.HasPrefix(uri, "//") {
45 resolvedURL = "/gemini/" + strings.TrimPrefix(uri, "//") 72 resolvedURL = "/gemini/" + strings.TrimPrefix(uri, "//")
@@ -137,6 +164,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass
137 Type: libgemini.RAW_TEXT.String(), 164 Type: libgemini.RAW_TEXT.String(),
138 Text: fmt.Sprintf("Error: %s", err), 165 Text: fmt.Sprintf("Error: %s", err),
139 }}, 166 }},
167 Nav: urlToGeminiNav(hostport),
140 IsPlain: true, 168 IsPlain: true,
141 }); e != nil { 169 }); e != nil {
142 log.Println("Template error: " + e.Error()) 170 log.Println("Template error: " + e.Error())
@@ -167,6 +195,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass
167 Type: libgemini.RAW_TEXT.String(), 195 Type: libgemini.RAW_TEXT.String(),
168 Text: fmt.Sprintf("Error: %s", err), 196 Text: fmt.Sprintf("Error: %s", err),
169 }}, 197 }},
198 Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)),
170 IsPlain: true, 199 IsPlain: true,
171 }); e != nil { 200 }); e != nil {
172 log.Println("Template error: " + e.Error()) 201 log.Println("Template error: " + e.Error())
@@ -190,6 +219,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass
190 Type: libgemini.RAW_TEXT.String(), 219 Type: libgemini.RAW_TEXT.String(),
191 Text: fmt.Sprintf("Error: %s", err), 220 Text: fmt.Sprintf("Error: %s", err),
192 }}, 221 }},
222 Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)),
193 IsPlain: true, 223 IsPlain: true,
194 }); e != nil { 224 }); e != nil {
195 log.Println("Template error: " + e.Error()) 225 log.Println("Template error: " + e.Error())
@@ -211,6 +241,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass
211 Type: libgemini.RAW_TEXT.String(), 241 Type: libgemini.RAW_TEXT.String(),
212 Text: fmt.Sprintf("Error %d: %s", res.Header.Status, res.Header.Meta), 242 Text: fmt.Sprintf("Error %d: %s", res.Header.Status, res.Header.Meta),
213 }}, 243 }},
244 Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)),
214 IsPlain: true, 245 IsPlain: true,
215 }); err != nil { 246 }); err != nil {
216 log.Println("Template error: " + err.Error()) 247 log.Println("Template error: " + err.Error())
@@ -252,6 +283,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass
252 URL: fmt.Sprintf("%s/%s", hostport, uri), 283 URL: fmt.Sprintf("%s/%s", hostport, uri),
253 Assets: assetList, 284 Assets: assetList,
254 Sections: sections, 285 Sections: sections,
286 Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)),
255 IsPlain: isPlain, 287 IsPlain: isPlain,
256 }); err != nil { 288 }); err != nil {
257 log.Println("Template error: " + err.Error()) 289 log.Println("Template error: " + err.Error())