diff --git a/CHANGELOG.md b/CHANGELOG.md index 27255ba..915fbdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Modal can't be closed when opening non-gemini text URLs from the commandline (#283, #284) - External programs started by Amfora remain as zombie processes (#219) +- Prevent link lines (and other types) from being wider than the `max_width` setting (#280) ## [1.9.2] - 2021-12-10 diff --git a/renderer/renderer.go b/renderer/renderer.go index fe2ad62..c1b4eb7 100644 --- a/renderer/renderer.go +++ b/renderer/renderer.go @@ -58,6 +58,10 @@ func RenderPlainText(s string) string { // // Set includeFirst to true if the prefix and suffix should be applied to the first wrapped line as well func wrapLine(line string, width int, prefix, suffix string, includeFirst bool) []string { + if width < 1 { + width = 1 + } + // Anonymous function to allow recovery from potential WordWrap panic var ret []string func() { @@ -196,7 +200,7 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, // Add the link text in blue (in a region), and a gray link number to the left of it // Those are the default colors, anyway - wrappedLink = wrapLine(linkText, width, + wrappedLink = wrapLine(linkText, width-indent, strings.Repeat(" ", indent)+ `["`+strconv.Itoa(num-1)+`"][`+config.GetColorString("amfora_link")+`]`, `[-][""]`, @@ -211,8 +215,8 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, } else { // No color - wrappedLink = wrapLine(linkText, width, - strings.Repeat(" ", len(strconv.Itoa(num))+4)+ // +4 for spaces and brackets + wrappedLink = wrapLine(linkText, width-indent, + strings.Repeat(" ", indent)+ // +4 for spaces and brackets `["`+strconv.Itoa(num-1)+`"]`, `[""]`, false, // Don't indent the first line, it's the one with link number @@ -228,7 +232,7 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, if viper.GetBool("a-general.color") { // Color - wrappedLink = wrapLine(linkText, width, + wrappedLink = wrapLine(linkText, width-indent, strings.Repeat(" ", indent)+ `["`+strconv.Itoa(num-1)+`"]`+linkTag, `[-::-][""]`, @@ -242,7 +246,7 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, } else { // No color - wrappedLink = wrapLine(linkText, width, + wrappedLink = wrapLine(linkText, width-indent, strings.Repeat(" ", indent)+ `["`+strconv.Itoa(num-1)+`"]`, `[::-][""]`, @@ -261,7 +265,8 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, } else if strings.HasPrefix(lines[i], "* ") { if viper.GetBool("a-general.bullets") { // Wrap list item, and indent wrapped lines past the bullet - wrappedItem := wrapLine(lines[i][1:], width, + wrappedItem := wrapLine(lines[i][1:], + width-4, // Subtract the 4 indent spaces fmt.Sprintf(" [%s]", config.GetColorString("list_text")), "[-]", false) // Add bullet @@ -269,7 +274,8 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, wrappedItem[0] + "[-]" wrappedLines = append(wrappedLines, wrappedItem...) } else { - wrappedItem := wrapLine(lines[i][1:], width, + wrappedItem := wrapLine(lines[i][1:], + width-4, // Subtract the 4 indent spaces fmt.Sprintf(" [%s]", config.GetColorString("list_text")), "[-]", false) // Add "*" @@ -290,7 +296,9 @@ func convertRegularGemini(s string, numLinks, width int, proxied bool) (string, lines[i] = strings.TrimPrefix(lines[i], ">") lines[i] = strings.TrimPrefix(lines[i], " ") wrappedLines = append(wrappedLines, - wrapLine(lines[i], width, fmt.Sprintf("[%s::i]> ", config.GetColorString("quote_text")), + wrapLine(lines[i], + width-2, // Subtract 2 for width of prefix string + fmt.Sprintf("[%s::i]> ", config.GetColorString("quote_text")), "[-::-]", true)..., ) }