elastic link gutter

calculate the width we need in the left gutter for link IDs
This commit is contained in:
tjp 2024-01-04 12:48:51 -07:00
parent f350fb9029
commit f9fdbd2292
1 changed files with 32 additions and 12 deletions

View File

@ -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)))
}