diff options
Diffstat (limited to 'internal/port/gemini.go')
-rw-r--r-- | internal/port/gemini.go | 36 |
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 | ||
31 | type GeminiNavItem struct { | 31 | type GeminiNavItem struct { |
32 | Label string | 32 | Label string |
33 | URL string | 33 | URL string |
34 | Current bool | ||
34 | } | 35 | } |
35 | 36 | ||
36 | type GeminiSection struct { | 37 | type GeminiSection struct { |
@@ -40,6 +41,32 @@ type GeminiSection struct { | |||
40 | Items []string | 41 | Items []string |
41 | } | 42 | } |
42 | 43 | ||
44 | func 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 | |||
43 | func resolveURL(uri string, baseURL *url.URL) (resolvedURL string) { | 70 | func 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()) |