diff options
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))) } |
