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()) |
