aboutsummaryrefslogtreecommitdiff
path: root/capybara.go
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-01-24 14:21:34 -0800
committerFuwn <[email protected]>2022-01-24 14:21:34 -0800
commit5a740e731fb8ac5c1292c2046f0b9653ee90b972 (patch)
tree1c27ad776122f23a29c3bb1e24b1890310c1b6b1 /capybara.go
parentchore(copying): rename to license (diff)
parentGenerate anchor links for headings (diff)
downloadcapybara-5a740e731fb8ac5c1292c2046f0b9653ee90b972.tar.xz
capybara-5a740e731fb8ac5c1292c2046f0b9653ee90b972.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'capybara.go')
-rw-r--r--capybara.go35
1 files changed, 29 insertions, 6 deletions
diff --git a/capybara.go b/capybara.go
index dbd980a..497ffe5 100644
--- a/capybara.go
+++ b/capybara.go
@@ -13,6 +13,7 @@ import (
"os"
"strings"
"time"
+ "unicode"
"git.sr.ht/~adnano/go-gemini"
"git.sr.ht/~sircmpwn/getopt"
@@ -24,11 +25,11 @@ var gemtextPage = template.Must(template.
"heading": func(line gemini.Line) *GemtextHeading {
switch l := line.(type) {
case gemini.LineHeading1:
- return &GemtextHeading{1, string(l)}
+ return &GemtextHeading{1, string(l), createAnchor(string(l))}
case gemini.LineHeading2:
- return &GemtextHeading{2, string(l)}
+ return &GemtextHeading{2, string(l), createAnchor(string(l))}
case gemini.LineHeading3:
- return &GemtextHeading{3, string(l)}
+ return &GemtextHeading{3, string(l), createAnchor(string(l))}
default:
return nil
}
@@ -147,7 +148,7 @@ var gemtextPage = template.Must(template.
{{- with . | heading }}
{{- $isList = false -}}
- <h{{.Level}}>{{.Text}}</h{{.Level}}>
+ <h{{.Level}} id="{{.Anchor}}">{{.Text}}</h{{.Level}}>
{{- end -}}
{{- with . | link }}
@@ -388,8 +389,24 @@ type InputContext struct {
}
type GemtextHeading struct {
- Level int
- Text string
+ Level int
+ Text string
+ Anchor string
+}
+
+func createAnchor(heading string) string {
+ var anchor strings.Builder
+ prev := '-'
+ for _, c := range heading {
+ if unicode.IsLetter(c) || unicode.IsDigit(c) {
+ anchor.WriteRune(unicode.ToLower(c))
+ prev = c
+ } else if (unicode.IsSpace(c) || c == '-') && prev != '-' {
+ anchor.WriteRune('-')
+ prev = '-'
+ }
+ }
+ return strings.ToLower(anchor.String())
}
func proxyGemini(req gemini.Request, external bool, root *url.URL,
@@ -618,6 +635,12 @@ func main() {
return
}
+ if r.URL.Path == "/robots.txt" {
+ w.WriteHeader(http.StatusOK)
+ w.Write([]byte("User-agent: *\nDisallow: /\n"))
+ return
+ }
+
req := gemini.Request{}
req.URL = &url.URL{}
req.URL.Scheme = root.Scheme