forked from sloum/bombadillo
simple line wrapping that does not mangle spaces
This commit is contained in:
parent
3e8587f039
commit
ea096af511
13
cui/cui.go
13
cui/cui.go
|
@ -84,8 +84,8 @@ func Clear(dir string) {
|
||||||
// takes the document content (as a slice) and modifies any lines that are longer
|
// 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
|
// than the specified console width, splitting them over two lines. returns the
|
||||||
// amended document content as a slice.
|
// amended document content as a slice.
|
||||||
|
// word wrapping uses a "greedy" algorithm
|
||||||
func wrapLines(s []string, consolewidth int) []string {
|
func wrapLines(s []string, consolewidth int) []string {
|
||||||
//indent := " " //11 spaces
|
|
||||||
out := []string{}
|
out := []string{}
|
||||||
for _, ln := range s {
|
for _, ln := range s {
|
||||||
if len(ln) <= consolewidth {
|
if len(ln) <= consolewidth {
|
||||||
|
@ -95,14 +95,8 @@ func wrapLines(s []string, consolewidth int) []string {
|
||||||
var subout bytes.Buffer
|
var subout bytes.Buffer
|
||||||
for i, wd := range words {
|
for i, wd := range words {
|
||||||
sublen := subout.Len()
|
sublen := subout.Len()
|
||||||
if sublen+len(wd)+1 <= consolewidth {
|
wdlen := len(wd)
|
||||||
//if line was indented, reinsert indent
|
if sublen+wdlen <= consolewidth {
|
||||||
if i == 11 && sublen == 0 {
|
|
||||||
//subout.WriteString(indent)
|
|
||||||
}
|
|
||||||
if sublen > 0 {
|
|
||||||
//subout.WriteString(" ")
|
|
||||||
}
|
|
||||||
subout.WriteString(wd)
|
subout.WriteString(wd)
|
||||||
if i == len(words)-1 {
|
if i == len(words)-1 {
|
||||||
out = append(out, subout.String())
|
out = append(out, subout.String())
|
||||||
|
@ -110,7 +104,6 @@ func wrapLines(s []string, consolewidth int) []string {
|
||||||
} else {
|
} else {
|
||||||
out = append(out, subout.String())
|
out = append(out, subout.String())
|
||||||
subout.Reset()
|
subout.Reset()
|
||||||
//subout.WriteString(indent)
|
|
||||||
subout.WriteString(wd)
|
subout.WriteString(wd)
|
||||||
if i == len(words)-1 {
|
if i == len(words)-1 {
|
||||||
out = append(out, subout.String())
|
out = append(out, subout.String())
|
||||||
|
|
|
@ -5,92 +5,32 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_wrapLines_doesnt_break_indents(t *testing.T) {
|
// tests related to issue 31
|
||||||
indent := " "
|
func Test_wrapLines_space_preservation(t *testing.T) {
|
||||||
tables := []struct {
|
tables := []struct {
|
||||||
testinput []string
|
testinput []string
|
||||||
expectedoutput []string
|
expectedoutput []string
|
||||||
linelength int
|
linelength int
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
//indented long word - 20 characters - should not wrap
|
//normal sentence - 20 characters - should not wrap
|
||||||
[]string{indent + "012345678"},
|
|
||||||
[]string{indent + "012345678"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//indented long word - 21 characters - should wrap
|
|
||||||
[]string{indent + "0123456789"},
|
|
||||||
[]string{indent + "012345678", indent + "9"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//indented really long word - should wrap
|
|
||||||
[]string{indent + "0123456789zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"},
|
|
||||||
[]string{
|
|
||||||
indent + "012345678",
|
|
||||||
indent + "9zzzzzzzz",
|
|
||||||
indent + "zzzzzzzzz",
|
|
||||||
indent + "zzzzzzzzz",
|
|
||||||
indent + "zzzzz"},
|
|
||||||
20,
|
|
||||||
}, {
|
|
||||||
//non-indented long word - 20 characters - should not wrap
|
|
||||||
[]string{"01234567890123456789"},
|
|
||||||
[]string{"01234567890123456789"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//non-indented long word - 21 characters - should wrap
|
|
||||||
[]string{"01234567890123456789a"},
|
|
||||||
[]string{"01234567890123456789", "a"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//non-indented really long word - should wrap
|
|
||||||
[]string{"01234567890123456789zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"},
|
|
||||||
[]string{
|
|
||||||
"01234567890123456789",
|
|
||||||
"zzzzzzzzzzzzzzzzzzzz",
|
|
||||||
"zzzzzzzzzzzzzzzzzzzz",
|
|
||||||
"zzzzzzzzzzzzzzzzzzzz",
|
|
||||||
"zzzz"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//indented normal sentence - 20 characters - should not wrap
|
|
||||||
[]string{indent + "it is her"},
|
|
||||||
[]string{indent + "it is her"},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//indented normal sentence - more than 20 characters - should wrap
|
|
||||||
[]string{indent + "it is her favourite thing in the world"},
|
|
||||||
[]string{
|
|
||||||
indent + "it is her",
|
|
||||||
indent + "favourite",
|
|
||||||
indent + "thing in",
|
|
||||||
indent + "the world",
|
|
||||||
},
|
|
||||||
20,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
//non-indented normal sentence - 20 characters - should not wrap
|
|
||||||
[]string{"it is her fav thingy"},
|
[]string{"it is her fav thingy"},
|
||||||
[]string{"it is her fav thingy"},
|
[]string{"it is her fav thingy"},
|
||||||
20,
|
20,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
//non-indented normal sentence - more than 20 characters - should wrap
|
//normal sentence - more than 20 characters - should wrap with a space at the end of the first line
|
||||||
[]string{"it is her favourite thing in the world"},
|
[]string{"it is her favourite thing in the world"},
|
||||||
[]string{
|
[]string{
|
||||||
"it is her favourite",
|
"it is her favourite ",
|
||||||
"thing in the world",
|
"thing in the world",
|
||||||
},
|
},
|
||||||
20,
|
20,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
//a specific test from cat's phlog that was wrapping and I'm not sure why
|
// a specific test from cat's phlog (gopher://baud.baby:70/0/phlog/fs20190818.txt)
|
||||||
|
// I think the – character U+2013 : EN DASH characteris causing wrapping incorrectly
|
||||||
|
// but the test passes and i'm not sure why
|
||||||
[]string{
|
[]string{
|
||||||
" Suldusk – Really cool dark folk/black metal sort of deal. The lead singer",
|
" Suldusk – Really cool dark folk/black metal sort of deal. The lead singer",
|
||||||
"is a tiny fairy of a person and she's very charming. It's the bass players",
|
"is a tiny fairy of a person and she's very charming. It's the bass players",
|
||||||
|
@ -101,9 +41,6 @@ func Test_wrapLines_doesnt_break_indents(t *testing.T) {
|
||||||
},
|
},
|
||||||
80,
|
80,
|
||||||
},
|
},
|
||||||
|
|
||||||
//TODO further tests
|
|
||||||
//lines that are just spaces don't get misidentified as indents and then mangled
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, table := range tables {
|
for _, table := range tables {
|
||||||
|
@ -116,11 +53,11 @@ func Test_wrapLines_doesnt_break_indents(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Benchmark_wrapLines(b *testing.B) {
|
func Benchmark_wrapLines(b *testing.B) {
|
||||||
indent := " "
|
|
||||||
teststring := []string{
|
teststring := []string{
|
||||||
indent + "0123456789\n",
|
"0123456789",
|
||||||
indent + "a really long line that will prolly be wrapped\n",
|
"a really long line that will prolly be wrapped",
|
||||||
indent + "a l i n e w i t h a l o t o f w o r d s\n",
|
"a l i n e w i t h a l o t o f w o r d s",
|
||||||
|
"onehugelongwordaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||||
}
|
}
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user