elastic link gutter
calculate the width we need in the left gutter for link IDs
This commit is contained in:
parent
f350fb9029
commit
f9fdbd2292
44
handlers.go
44
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)))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue