From c772716e98e11181d301deadeca52856ac18f085 Mon Sep 17 00:00:00 2001 From: Feuerfuchs Date: Mon, 18 May 2020 18:51:19 +0200 Subject: Improved Gemini support --- internal/port/gemini.go | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'internal/port/gemini.go') 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 { } type GeminiNavItem struct { - Label string - URL string + Label string + URL string + Current bool } type GeminiSection struct { @@ -40,6 +41,32 @@ type GeminiSection struct { Items []string } +func urlToGeminiNav(url string) (items []GeminiNavItem) { + partialURL := "/gemini" + parts := strings.Split(url, "/") + + if len(parts) != 0 && parts[len(parts)-1] == "" { + parts = parts[:len(parts)-1] + } + + for i, part := range parts { + partialURL = partialURL + "/" + part + + current := false + if i == len(parts)-1 || (len(parts) == 2 && i == 0) { + current = true + } + + items = append(items, GeminiNavItem{ + Label: part, + URL: partialURL, + Current: current, + }) + } + + return +} + func resolveURL(uri string, baseURL *url.URL) (resolvedURL string) { if strings.HasPrefix(uri, "//") { resolvedURL = "/gemini/" + strings.TrimPrefix(uri, "//") @@ -137,6 +164,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass Type: libgemini.RAW_TEXT.String(), Text: fmt.Sprintf("Error: %s", err), }}, + Nav: urlToGeminiNav(hostport), IsPlain: true, }); e != nil { log.Println("Template error: " + e.Error()) @@ -167,6 +195,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass Type: libgemini.RAW_TEXT.String(), Text: fmt.Sprintf("Error: %s", err), }}, + Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)), IsPlain: true, }); e != nil { log.Println("Template error: " + e.Error()) @@ -190,6 +219,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass Type: libgemini.RAW_TEXT.String(), Text: fmt.Sprintf("Error: %s", err), }}, + Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)), IsPlain: true, }); e != nil { log.Println("Template error: " + e.Error()) @@ -211,6 +241,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass Type: libgemini.RAW_TEXT.String(), Text: fmt.Sprintf("Error %d: %s", res.Header.Status, res.Header.Meta), }}, + Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)), IsPlain: true, }); err != nil { log.Println("Template error: " + err.Error()) @@ -252,6 +283,7 @@ func GeminiHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass URL: fmt.Sprintf("%s/%s", hostport, uri), Assets: assetList, Sections: sections, + Nav: urlToGeminiNav(fmt.Sprintf("%s/%s", hostport, uri)), IsPlain: isPlain, }); err != nil { log.Println("Template error: " + err.Error()) -- cgit v1.3.1