diff options
| author | tjp <tjp@ctrl-c.club> | 2024-01-04 12:48:51 -0700 |
|---|---|---|
| committer | tjp <tjp@ctrl-c.club> | 2024-01-04 12:48:51 -0700 |
| commit | f9fdbd229289e4ba6b708b9cd5fe3ac9068f349c (patch) | |
| tree | 061082ae97340b5e82a8cd7fd9cab33255365ae3 /handlers.go | |
| parent | f350fb902946f00d31246bef5fbec1e23e79c2be (diff) | |
elastic link gutter
calculate the width we need in the left gutter for link IDs
Diffstat (limited to 'handlers.go')
| -rw-r--r-- | handlers.go | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/handlers.go b/handlers.go index b4ce3f2..d89f27b 100644 --- a/handlers.go +++ b/handlers.go @@ -89,12 +89,21 @@ func parseGophermapDoc(body []byte, softWrap int) (string, []Link, error) { return "", nil, err } + links := 0 + for _, item := range mapdoc { + if item.Type != gopher.InfoMessageType { + links += 1 + } + } + width := numberWidth(links - 1) + infopad := string(bytes.Repeat([]byte{' '}, width + 3)) + i := 0 for _, item := range mapdoc { switch item.Type { case gopher.InfoMessageType: for _, line := range fold(item.Display, softWrap) { - if _, err := b.WriteString(" " + line + "\n"); err != nil { + if _, err := b.WriteString(infopad + line + "\n"); err != nil { return "", nil, err } } @@ -103,7 +112,7 @@ func parseGophermapDoc(body []byte, softWrap int) (string, []Link, error) { Text: item.Display, Target: fmtGopherURL(item.Type, item.Selector, item.Hostname, item.Port), }) - if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s\n", i, linkSpaces(i), item.Display)); err != nil { + if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s\n", i, padding(i, width), item.Display)); err != nil { return "", nil, err } i += 1 @@ -121,6 +130,15 @@ func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { return "", nil, err } + links := 0 + for _, item := range gemdoc { + if item.Type() == gemtext.LineTypeLink { + links += 1 + } + } + width := numberWidth(links - 1) + textpad := string(bytes.Repeat([]byte{' '}, width + 3)) + i := 0 for _, item := range gemdoc { isPrompt := false @@ -143,13 +161,13 @@ func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { if len(label) == 0 { label = ll.URL() } - if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s\n", i, linkSpaces(i), label)); err != nil { + if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s\n", i, padding(i, width), label)); err != nil { return "", nil, err } i += 1 default: for _, line := range fold(item.String(), softWrap) { - if _, err := b.WriteString(" " + line + "\n"); err != nil { + if _, err := b.WriteString(textpad + line + "\n"); err != nil { return "", nil, err } } @@ -207,13 +225,15 @@ func fmtGopherURL(itemtype sliderule.Status, selector, hostname, port string) *u } } -func linkSpaces(i int) string { - switch { - case i < 10: - return " " - case i < 100: - return " " - default: - return "" +func numberWidth(i int) int { + n := 1 + for i > 9 { + i /= 10 + n += 1 } + return n +} + +func padding(num int, width int) string { + return string(bytes.Repeat([]byte{' '}, width - numberWidth(num))) } |
