From 45596d4e8d0a980cd6225cd74eff3226abc90402 Mon Sep 17 00:00:00 2001 From: asdf Date: Thu, 12 Sep 2019 12:49:51 +1000 Subject: [PATCH] Using slice of runes for calculating lengths --- cui/cui.go | 75 ++++++------------------------------------------- cui/cui_test.go | 25 +---------------- 2 files changed, 9 insertions(+), 91 deletions(-) diff --git a/cui/cui.go b/cui/cui.go index f3950a1..c5a8fea 100644 --- a/cui/cui.go +++ b/cui/cui.go @@ -7,7 +7,6 @@ import ( "os" "os/exec" "strings" - "unicode/utf8" ) var shapes = map[string]string{ @@ -82,10 +81,14 @@ func Clear(dir string) { } -// takes the document content (as a slice) and modifies any lines that are longer -// than the specified console width, splitting them over two lines. returns the -// amended document content as a slice. -// word wrapping uses a "greedy" algorithm +// Takes the document content (as a slice of strings) and wraps any lines that +// are longer than the specified console width. returns the amended document +// content as a slice of strings. +// Word wrapping uses a "greedy" algorithm, where long lines are split in to +// words, and then rebuilt word by word to fill the available space. any +// leftover words overflow to the next line. +// To offer some support for unicode, some lengths are calculated using a slice +// of runes in the following way: len([]rune(string)) func wrapLines(s []string, consolewidth int) []string { out := []string{} for _, ln := range s { @@ -172,65 +175,3 @@ func HandleAlternateScreen(opt string) { // to run _ = cmd.Run() } - -func wrapLines2(s []string, consolewidth int) []string { - out := []string{} - for _, ln := range s { - if utf8.RuneCountInString(ln) <= consolewidth { - out = append(out, ln) - } else { - words := strings.SplitAfter(ln, " ") - var subout bytes.Buffer - for i, wd := range words { - sublen := subout.Len() - wdlen := utf8.RuneCountInString(wd) - if sublen+wdlen <= consolewidth { - subout.WriteString(wd) - if i == len(words)-1 { - out = append(out, subout.String()) - } - } else { - out = append(out, subout.String()) - subout.Reset() - subout.WriteString(wd) - if i == len(words)-1 { - out = append(out, subout.String()) - subout.Reset() - } - } - } - } - } - return out -} - -func wrapLines3(s []string, consolewidth int) []string { - out := []string{} - for _, ln := range s { - if len(ln) <= consolewidth { - out = append(out, ln) - } else { - words := strings.SplitAfter(ln, " ") - var subout bytes.Buffer - for i, wd := range words { - sublen := subout.Len() - wdlen := len(wd) - if sublen+wdlen <= consolewidth { - subout.WriteString(wd) - if i == len(words)-1 { - out = append(out, subout.String()) - } - } else { - out = append(out, subout.String()) - subout.Reset() - subout.WriteString(wd) - if i == len(words)-1 { - out = append(out, subout.String()) - subout.Reset() - } - } - } - } - } - return out -} diff --git a/cui/cui_test.go b/cui/cui_test.go index f7897ae..1ee3d3b 100644 --- a/cui/cui_test.go +++ b/cui/cui_test.go @@ -69,6 +69,7 @@ func Test_wrapLines_incorrect_wrapping_endash(t *testing.T) { } } } + func Benchmark_wrapLines(b *testing.B) { teststring := []string{ "0123456789", @@ -81,27 +82,3 @@ func Benchmark_wrapLines(b *testing.B) { wrapLines(teststring, 20) } } -func Benchmark_wrapLines2(b *testing.B) { - teststring := []string{ - "0123456789", - "a really long line that will prolly be wrapped", - "a l i n e w i t h a l o t o f w o r d s", - "onehugelongwordaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - } - b.ResetTimer() - for n := 0; n < b.N; n++ { - wrapLines2(teststring, 20) - } -} -func Benchmark_wrapLines3(b *testing.B) { - teststring := []string{ - "0123456789", - "a really long line that will prolly be wrapped", - "a l i n e w i t h a l o t o f w o r d s", - "onehugelongwordaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - } - b.ResetTimer() - for n := 0; n < b.N; n++ { - wrapLines3(teststring, 20) - } -}